blob: c2b5a9af7186f75afbe0cad96a81c2b22339dba0 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Dave Houlton3c9fca72017-03-27 17:25:54 -060038#include "vk_format_utils.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060039#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060040#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070041
42#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060043#include <limits.h>
44#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060045
Mark Lobodzinski3780e142015-05-14 15:08:13 -050046#define GLM_FORCE_RADIANS
47#include "glm/glm.hpp"
48#include <glm/gtc/matrix_transform.hpp>
49
50//--------------------------------------------------------------------------------------
51// Mesh and VertexFormat Data
52//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070053struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070054 float posX, posY, posZ, posW; // Position data
55 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050056};
57
Karl Schultz6addd812016-02-02 17:17:23 -070058#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050059
60typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070061 BsoFailNone = 0x00000000,
62 BsoFailLineWidth = 0x00000001,
63 BsoFailDepthBias = 0x00000002,
64 BsoFailViewport = 0x00000004,
65 BsoFailScissor = 0x00000008,
66 BsoFailBlend = 0x00000010,
67 BsoFailDepthBounds = 0x00000020,
68 BsoFailStencilReadMask = 0x00000040,
69 BsoFailStencilWriteMask = 0x00000080,
70 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060071 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060072 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050073} BsoFailSelect;
74
75struct vktriangle_vs_uniform {
76 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070077 float mvp[4][4];
78 float position[3][4];
79 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050080};
81
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070082static const char bindStateVertShaderText[] =
83 "#version 450\n"
84 "vec2 vertices[3];\n"
85 "out gl_PerVertex {\n"
86 " vec4 gl_Position;\n"
87 "};\n"
88 "void main() {\n"
89 " vertices[0] = vec2(-1.0, -1.0);\n"
90 " vertices[1] = vec2( 1.0, -1.0);\n"
91 " vertices[2] = vec2( 0.0, 1.0);\n"
92 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
93 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050094
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070095static const char bindStateFragShaderText[] =
96 "#version 450\n"
97 "\n"
98 "layout(location = 0) out vec4 uFragColor;\n"
99 "void main(){\n"
100 " uFragColor = vec4(0,1,0,1);\n"
101 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500102
Dave Houlton1d2022c2017-03-29 11:43:58 -0600103// Format search helper
104VkFormat FindSupportedDepthStencilFormat(VkPhysicalDevice phy) {
Dave Houltond7472002017-03-30 09:48:28 -0600105 VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT};
Dave Houlton1d2022c2017-03-29 11:43:58 -0600106 for (uint32_t i = 0; i < sizeof(ds_formats); i++) {
107 VkFormatProperties format_props;
108 vkGetPhysicalDeviceFormatProperties(phy, ds_formats[i], &format_props);
109
110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
111 return ds_formats[i];
112 }
113 }
114 return (VkFormat)0;
115}
116
117// Validation report callback prototype
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600118static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
119 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
120 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600121
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600122// ErrorMonitor Usage:
123//
Dave Houltonfbf52152017-01-06 12:55:29 -0700124// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600125// encountered log messages, or a validation error enum identifying
126// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
127// will match all log messages. logMsg will return true for skipCall
128// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600129//
Dave Houltonfbf52152017-01-06 12:55:29 -0700130// Call VerifyFound to determine if all desired failure messages
131// were encountered. Call VerifyNotFound to determine if any unexpected
132// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600133class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700134 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700135 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700136 test_platform_thread_create_mutex(&mutex_);
137 test_platform_thread_lock_mutex(&mutex_);
138 Reset();
139 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600140 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600141
Dave Houltonfbf52152017-01-06 12:55:29 -0700142 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600143
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 // Set monitor to pristine state
145 void Reset() {
146 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
147 bailout_ = NULL;
148 message_found_ = VK_FALSE;
149 failure_message_strings_.clear();
150 desired_message_strings_.clear();
151 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700152 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700153 other_messages_.clear();
154 message_outstanding_count_ = 0;
155 }
156
157 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700158 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 test_platform_thread_lock_mutex(&mutex_);
160 desired_message_strings_.insert(msgString);
161 message_flags_ |= msgFlags;
162 message_outstanding_count_++;
163 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600164 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600165
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700166 // ErrorMonitor will look for an error message containing the specified string(s)
167 template <typename Iter>
168 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
169 for (; iter != end; ++iter) {
170 SetDesiredFailureMsg(msgFlags, *iter);
171 }
172 }
173
Dave Houltonfbf52152017-01-06 12:55:29 -0700174 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700175 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700176 test_platform_thread_lock_mutex(&mutex_);
177 desired_message_ids_.insert(msg_id);
178 message_flags_ |= msgFlags;
179 message_outstanding_count_++;
180 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600181 }
182
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700183 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
184 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
185 // function and its definition.
186 void SetUnexpectedError(const char *const msg) {
187 test_platform_thread_lock_mutex(&mutex_);
188
189 ignore_message_strings_.emplace_back(msg);
190
191 test_platform_thread_unlock_mutex(&mutex_);
192 }
193
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700194 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600195 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700196 test_platform_thread_lock_mutex(&mutex_);
197 if (bailout_ != NULL) {
198 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600199 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600200 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600201 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600202
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 if (!IgnoreMessage(errorString)) {
204 for (auto desired_msg : desired_message_strings_) {
205 if (desired_msg.length() == 0) {
206 // An empty desired_msg string "" indicates a positive test - not expecting an error.
207 // Return true to avoid calling layers/driver with this error.
208 // And don't erase the "" string, so it remains if another error is found.
209 result = VK_TRUE;
210 found_expected = true;
211 message_found_ = VK_TRUE;
212 failure_message_strings_.insert(errorString);
213 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600214 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700215 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700216 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700217 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700218 result = VK_TRUE;
219 // We only want one match for each expected error so remove from set here
220 // Since we're about the break the loop it's ok to remove from set we're iterating over
221 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600222 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600223 }
224 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700225 for (auto desired_id : desired_message_ids_) {
226 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
227 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
228 // Return true to avoid calling layers/driver with this error.
229 result = VK_TRUE;
230 } else if (desired_id == message_code) {
231 // Double-check that the string matches the error enum
232 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
233 found_expected = true;
234 message_outstanding_count_--;
235 result = VK_TRUE;
236 message_found_ = VK_TRUE;
237 desired_message_ids_.erase(desired_id);
238 break;
239 } else {
240 // Treat this message as a regular unexpected error, but print a warning jic
241 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
242 errorString.c_str(), desired_id, validation_error_map[desired_id]);
243 }
244 }
245 }
246
247 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600248 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700249 other_messages_.push_back(errorString);
250 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600251 }
252
Dave Houltonfbf52152017-01-06 12:55:29 -0700253 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600254 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600255 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600256
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600257 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
258
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700259 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600260
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700261 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600262
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700263 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700264
265 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600266
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600267 void DumpFailureMsgs(void) const {
268 vector<string> otherMsgs = GetOtherFailureMsgs();
269 if (otherMsgs.size()) {
270 cout << "Other error messages logged for this test were:" << endl;
271 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
272 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600273 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600274 }
275 }
276
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600277 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200278
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600279 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700280 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600281 // Match ANY message matching specified type
282 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700283 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200284 }
285
286 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600287 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600289 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700290 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700291 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700294 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600295 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200296 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700297 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200298 }
299
300 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600301 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700302 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600303 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700304 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700305 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600306 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200307 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700308 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200309 }
310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700311 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
313 // function and its definition.
314 bool IgnoreMessage(std::string const &msg) const {
315 if (ignore_message_strings_.empty()) {
316 return false;
317 }
318
319 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
320 return msg.find(str) != std::string::npos;
321 }) != ignore_message_strings_.end();
322 }
323
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700324 VkFlags message_flags_;
325 std::unordered_set<uint32_t> desired_message_ids_;
326 std::unordered_set<string> desired_message_strings_;
327 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700328 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700329 vector<string> other_messages_;
330 test_platform_thread_mutex mutex_;
331 bool *bailout_;
332 VkBool32 message_found_;
333 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600334};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500335
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
337 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
338 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600339 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
340 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600341 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600342 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600343 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600344}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500345
Karl Schultz6addd812016-02-02 17:17:23 -0700346class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700347 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600348 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
349 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700350 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600351 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
352 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700353 }
Tony Barbour300a6082015-04-07 13:44:53 -0600354
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600355 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
356 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700357 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600358 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700359 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600360 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700361 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600362 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
363 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
364 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700365 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
366 }
367 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
368 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
369 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600370 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
371 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
372 InitState(features, flags);
373 }
374
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700375 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700376 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600377 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600378 std::vector<const char *> instance_layer_names;
379 std::vector<const char *> instance_extension_names;
380 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600381
382 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700383 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600384 /*
385 * Since CreateDbgMsgCallback is an instance level extension call
386 * any extension / layer that utilizes that feature also needs
387 * to be enabled at create instance time.
388 */
Karl Schultz6addd812016-02-02 17:17:23 -0700389 // Use Threading layer first to protect others from
390 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700391 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600392 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800393 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700394 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600395 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700396 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600397
Ian Elliott2c1daf52016-05-12 09:41:46 -0600398 if (m_enableWSI) {
399 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
400 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
401#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
402#if defined(VK_USE_PLATFORM_ANDROID_KHR)
403 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405#if defined(VK_USE_PLATFORM_MIR_KHR)
406 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700407#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600408#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
409 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700410#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600411#if defined(VK_USE_PLATFORM_WIN32_KHR)
412 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700413#endif // VK_USE_PLATFORM_WIN32_KHR
414#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600415#if defined(VK_USE_PLATFORM_XCB_KHR)
416 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
417#elif defined(VK_USE_PLATFORM_XLIB_KHR)
418 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700419#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600420 }
421
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600422 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600423 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800424 this->app_info.pApplicationName = "layer_tests";
425 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600426 this->app_info.pEngineName = "unittest";
427 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600428 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600429
Tony Barbour15524c32015-04-29 17:34:29 -0600430 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600431 }
432
433 virtual void TearDown() {
434 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600435 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600436 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600437 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600438
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600439 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600440};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500441
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 // Create identity matrix
444 int i;
445 struct vktriangle_vs_uniform data;
446
447 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700448 glm::mat4 View = glm::mat4(1.0f);
449 glm::mat4 Model = glm::mat4(1.0f);
450 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700452 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453
454 memcpy(&data.mvp, &MVP[0][0], matrixSize);
455
Karl Schultz6addd812016-02-02 17:17:23 -0700456 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600457 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500458 };
459
Karl Schultz6addd812016-02-02 17:17:23 -0700460 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500461 data.position[i][0] = tri_data[i].posX;
462 data.position[i][1] = tri_data[i].posY;
463 data.position[i][2] = tri_data[i].posZ;
464 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700465 data.color[i][0] = tri_data[i].r;
466 data.color[i][1] = tri_data[i].g;
467 data.color[i][2] = tri_data[i].b;
468 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500469 }
470
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500471 ASSERT_NO_FATAL_FAILURE(InitViewport());
472
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200473 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
474 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500475
Karl Schultz6addd812016-02-02 17:17:23 -0700476 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600477 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500478
479 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800480 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500481 pipelineobj.AddShader(&vs);
482 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600483 if (failMask & BsoFailLineWidth) {
484 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600485 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600486 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600487 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
488 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600489 }
490 if (failMask & BsoFailDepthBias) {
491 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600492 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600493 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600494 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600495 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600496 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700498 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700499 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600500 if (failMask & BsoFailViewport) {
501 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
502 }
503 if (failMask & BsoFailScissor) {
504 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
505 }
506 if (failMask & BsoFailBlend) {
507 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600508 VkPipelineColorBlendAttachmentState att_state = {};
509 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
510 att_state.blendEnable = VK_TRUE;
511 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600512 }
513 if (failMask & BsoFailDepthBounds) {
514 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
515 }
516 if (failMask & BsoFailStencilReadMask) {
517 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
518 }
519 if (failMask & BsoFailStencilWriteMask) {
520 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
521 }
522 if (failMask & BsoFailStencilReference) {
523 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
524 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500525
526 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600527 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500528
529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700530 m_commandBuffer->BeginCommandBuffer();
531 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500532
Tony Barbourfe3351b2015-07-28 10:17:20 -0600533 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534
535 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600536 if (failMask & BsoFailIndexBuffer) {
537 // Use DrawIndexed w/o an index buffer bound
538 DrawIndexed(3, 1, 0, 0, 0);
539 } else {
540 Draw(3, 1, 0, 0);
541 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500542
Mark Muellerd4914412016-06-13 17:52:06 -0600543 if (failMask & BsoFailCmdClearAttachments) {
544 VkClearAttachment color_attachment = {};
545 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700546 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600547 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
548
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600549 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600550 }
551
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500552 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700553 m_commandBuffer->EndRenderPass();
554 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600555 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500556}
557
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600558void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
559 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500560 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600561 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500562 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600563 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500564 }
565
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800566 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700567 // Make sure depthWriteEnable is set so that Depth fail test will work
568 // correctly
569 // Make sure stencilTestEnable is set so that Stencil fail test will work
570 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600571 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800572 stencil.failOp = VK_STENCIL_OP_KEEP;
573 stencil.passOp = VK_STENCIL_OP_KEEP;
574 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
575 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600576
577 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
578 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600579 ds_ci.pNext = NULL;
580 ds_ci.depthTestEnable = VK_FALSE;
581 ds_ci.depthWriteEnable = VK_TRUE;
582 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
583 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600584 if (failMask & BsoFailDepthBounds) {
585 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600586 ds_ci.maxDepthBounds = 0.0f;
587 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600588 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600589 ds_ci.stencilTestEnable = VK_TRUE;
590 ds_ci.front = stencil;
591 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600592
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600593 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600594 pipelineobj.SetViewport(m_viewports);
595 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800596 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600597 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600598 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800599 commandBuffer->BindPipeline(pipelineobj);
600 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500601}
602
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600603class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700604 public:
605 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600606};
607
Ian Elliott2c1daf52016-05-12 09:41:46 -0600608class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700609 public:
610 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600611 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600612};
613
Mark Muellerdfe37552016-07-07 14:47:42 -0600614class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700615 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600616 enum eTestEnFlags {
617 eDoubleDelete,
618 eInvalidDeviceOffset,
619 eInvalidMemoryOffset,
620 eBindNullBuffer,
621 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600622 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600623 };
624
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600625 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
628 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 return true;
630 }
631 VkDeviceSize offset_limit = 0;
632 if (eInvalidMemoryOffset == aTestFlag) {
633 VkBuffer vulkanBuffer;
634 VkBufferCreateInfo buffer_create_info = {};
635 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
636 buffer_create_info.size = 32;
637 buffer_create_info.usage = aBufferUsage;
638
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600639 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600640 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600641
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600642 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600643 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
644 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600645 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
646 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600647 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600648 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600649 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600650 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600651 }
652 if (eOffsetAlignment < offset_limit) {
653 return true;
654 }
655 return false;
656 }
657
658 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600659 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
660 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600661 if (eBindNullBuffer == aTestFlag) {
662 VulkanMemory = 0;
663 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
664 } else {
665 VkBufferCreateInfo buffer_create_info = {};
666 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
667 buffer_create_info.size = 32;
668 buffer_create_info.usage = aBufferUsage;
669
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600670 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600671
672 CreateCurrent = true;
673
674 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600676
677 VkMemoryAllocateInfo memory_allocate_info = {};
678 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800679 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600680 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
681 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600682 if (!pass) {
683 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
684 return;
685 }
686
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600687 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600688 AllocateCurrent = true;
689 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600690 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
691 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600692 BoundCurrent = true;
693
694 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
695 }
696 }
697
698 ~VkBufferTest() {
699 if (CreateCurrent) {
700 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
701 }
702 if (AllocateCurrent) {
703 if (InvalidDeleteEn) {
704 union {
705 VkDeviceMemory device_memory;
706 unsigned long long index_access;
707 } bad_index;
708
709 bad_index.device_memory = VulkanMemory;
710 bad_index.index_access++;
711
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600712 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600713 }
714 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
715 }
716 }
717
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600718 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600719
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600720 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600721
722 void TestDoubleDestroy() {
723 // Destroy the buffer but leave the flag set, which will cause
724 // the buffer to be destroyed again in the destructor.
725 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
726 }
727
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600729 bool AllocateCurrent;
730 bool BoundCurrent;
731 bool CreateCurrent;
732 bool InvalidDeleteEn;
733
734 VkBuffer VulkanBuffer;
735 VkDevice VulkanDevice;
736 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600737};
738
739class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700740 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600741 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600742 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700743 : BoundCurrent(false),
744 AttributeCount(aAttributeCount),
745 BindingCount(aBindingCount),
746 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600747 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600748 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
749 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700750 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600751
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600752 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
753 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600754
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600755 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
756 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
757 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
758 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
759 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760
761 unsigned i = 0;
762 do {
763 VertexInputAttributeDescription[i].binding = BindId;
764 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600765 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
766 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600767 i++;
768 } while (AttributeCount < i);
769
770 i = 0;
771 do {
772 VertexInputBindingDescription[i].binding = BindId;
773 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600775 i++;
776 } while (BindingCount < i);
777 }
778
779 ~VkVerticesObj() {
780 if (VertexInputAttributeDescription) {
781 delete[] VertexInputAttributeDescription;
782 }
783 if (VertexInputBindingDescription) {
784 delete[] VertexInputBindingDescription;
785 }
786 }
787
788 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600789 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
790 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600791 return true;
792 }
793
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600794 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600795 VkDeviceSize *offsetList;
796 unsigned offsetCount;
797
798 if (aOffsetCount) {
799 offsetList = aOffsetList;
800 offsetCount = aOffsetCount;
801 } else {
802 offsetList = new VkDeviceSize[1]();
803 offsetCount = 1;
804 }
805
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600806 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600807 BoundCurrent = true;
808
809 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600810 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600811 }
812 }
813
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700814 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600815 static uint32_t BindIdGenerator;
816
817 bool BoundCurrent;
818 unsigned AttributeCount;
819 unsigned BindingCount;
820 uint32_t BindId;
821
822 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
823 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
824 VkVertexInputBindingDescription *VertexInputBindingDescription;
825 VkConstantBufferObj VulkanMemoryBuffer;
826};
827
828uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500829// ********************************************************************************************************************
830// ********************************************************************************************************************
831// ********************************************************************************************************************
832// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600833TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700834 TEST_DESCRIPTION(
835 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
836 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837
Tony Barbour1fa09702017-03-16 12:09:08 -0600838 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600839
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600841 // Specify NULL for a pointer to a handle
842 // Expected to trigger an error with
843 // parameter_validation::validate_required_pointer
844 vkGetPhysicalDeviceFeatures(gpu(), NULL);
845 m_errorMonitor->VerifyFound();
846
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
848 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600849 // Specify NULL for pointer to array count
850 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600851 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600852 m_errorMonitor->VerifyFound();
853
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600855 // Specify 0 for a required array count
856 // Expected to trigger an error with parameter_validation::validate_array
857 VkViewport view_port = {};
858 m_commandBuffer->SetViewport(0, 0, &view_port);
859 m_errorMonitor->VerifyFound();
860
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600862 // Specify NULL for a required array
863 // Expected to trigger an error with parameter_validation::validate_array
864 m_commandBuffer->SetViewport(0, 1, NULL);
865 m_errorMonitor->VerifyFound();
866
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600868 // Specify VK_NULL_HANDLE for a required handle
869 // Expected to trigger an error with
870 // parameter_validation::validate_required_handle
871 vkUnmapMemory(device(), VK_NULL_HANDLE);
872 m_errorMonitor->VerifyFound();
873
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
875 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600876 // Specify VK_NULL_HANDLE for a required handle array entry
877 // Expected to trigger an error with
878 // parameter_validation::validate_required_handle_array
879 VkFence fence = VK_NULL_HANDLE;
880 vkResetFences(device(), 1, &fence);
881 m_errorMonitor->VerifyFound();
882
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600884 // Specify NULL for a required struct pointer
885 // Expected to trigger an error with
886 // parameter_validation::validate_struct_type
887 VkDeviceMemory memory = VK_NULL_HANDLE;
888 vkAllocateMemory(device(), NULL, NULL, &memory);
889 m_errorMonitor->VerifyFound();
890
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600892 // Specify 0 for a required VkFlags parameter
893 // Expected to trigger an error with parameter_validation::validate_flags
894 m_commandBuffer->SetStencilReference(0, 0);
895 m_errorMonitor->VerifyFound();
896
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600898 // Specify 0 for a required VkFlags array entry
899 // Expected to trigger an error with
900 // parameter_validation::validate_flags_array
901 VkSemaphore semaphore = VK_NULL_HANDLE;
902 VkPipelineStageFlags stageFlags = 0;
903 VkSubmitInfo submitInfo = {};
904 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
905 submitInfo.waitSemaphoreCount = 1;
906 submitInfo.pWaitSemaphores = &semaphore;
907 submitInfo.pWaitDstStageMask = &stageFlags;
908 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
909 m_errorMonitor->VerifyFound();
910}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600911
Dustin Gravesfce74c02016-05-10 11:42:58 -0600912TEST_F(VkLayerTest, ReservedParameter) {
913 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
914
Tony Barbour1fa09702017-03-16 12:09:08 -0600915 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600916
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600918 // Specify 0 for a reserved VkFlags parameter
919 // Expected to trigger an error with
920 // parameter_validation::validate_reserved_flags
921 VkEvent event_handle = VK_NULL_HANDLE;
922 VkEventCreateInfo event_info = {};
923 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
924 event_info.flags = 1;
925 vkCreateEvent(device(), &event_info, NULL, &event_handle);
926 m_errorMonitor->VerifyFound();
927}
928
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700930 TEST_DESCRIPTION(
931 "Specify an invalid VkStructureType for a Vulkan "
932 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600933
Tony Barbour1fa09702017-03-16 12:09:08 -0600934 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600935
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600937 // Zero struct memory, effectively setting sType to
938 // VK_STRUCTURE_TYPE_APPLICATION_INFO
939 // Expected to trigger an error with
940 // parameter_validation::validate_struct_type
941 VkMemoryAllocateInfo alloc_info = {};
942 VkDeviceMemory memory = VK_NULL_HANDLE;
943 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
944 m_errorMonitor->VerifyFound();
945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600947 // Zero struct memory, effectively setting sType to
948 // VK_STRUCTURE_TYPE_APPLICATION_INFO
949 // Expected to trigger an error with
950 // parameter_validation::validate_struct_type_array
951 VkSubmitInfo submit_info = {};
952 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
953 m_errorMonitor->VerifyFound();
954}
955
956TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600957 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600958
Tony Barbour1fa09702017-03-16 12:09:08 -0600959 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600960
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600962 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600963 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600965 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600966 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600967 // Zero-initialization will provide the correct sType
968 VkApplicationInfo app_info = {};
969 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
970 event_alloc_info.pNext = &app_info;
971 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
972 m_errorMonitor->VerifyFound();
973
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
975 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600976 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
977 // a function that has allowed pNext structure types and specify
978 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600979 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600980 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600981 VkMemoryAllocateInfo memory_alloc_info = {};
982 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
983 memory_alloc_info.pNext = &app_info;
984 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600985 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600986}
Dustin Graves5d33d532016-05-09 16:21:12 -0600987
988TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990
Tony Barbour1fa09702017-03-16 12:09:08 -0600991 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
994 "does not fall within the begin..end "
995 "range of the core VkFormat "
996 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600997 // Specify an invalid VkFormat value
998 // Expected to trigger an error with
999 // parameter_validation::validate_ranged_enum
1000 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001001 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001002 m_errorMonitor->VerifyFound();
1003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001005 // Specify an invalid VkFlags bitmask value
1006 // Expected to trigger an error with parameter_validation::validate_flags
1007 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001008 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1009 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -06001010 m_errorMonitor->VerifyFound();
1011
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -06001013 // Specify an invalid VkFlags array entry
1014 // Expected to trigger an error with
1015 // parameter_validation::validate_flags_array
1016 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001017 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001018 VkSubmitInfo submit_info = {};
1019 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1020 submit_info.waitSemaphoreCount = 1;
1021 submit_info.pWaitSemaphores = &semaphore;
1022 submit_info.pWaitDstStageMask = &stage_flags;
1023 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1024 m_errorMonitor->VerifyFound();
1025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001027 // Specify an invalid VkBool32 value
1028 // Expected to trigger a warning with
1029 // parameter_validation::validate_bool32
1030 VkSampler sampler = VK_NULL_HANDLE;
1031 VkSamplerCreateInfo sampler_info = {};
1032 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1033 sampler_info.pNext = NULL;
1034 sampler_info.magFilter = VK_FILTER_NEAREST;
1035 sampler_info.minFilter = VK_FILTER_NEAREST;
1036 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1037 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1038 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1039 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1040 sampler_info.mipLodBias = 1.0;
1041 sampler_info.maxAnisotropy = 1;
1042 sampler_info.compareEnable = VK_FALSE;
1043 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1044 sampler_info.minLod = 1.0;
1045 sampler_info.maxLod = 1.0;
1046 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1047 sampler_info.unnormalizedCoordinates = VK_FALSE;
1048 // Not VK_TRUE or VK_FALSE
1049 sampler_info.anisotropyEnable = 3;
1050 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1051 m_errorMonitor->VerifyFound();
1052}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001053
1054TEST_F(VkLayerTest, FailedReturnValue) {
1055 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1056
Tony Barbour1fa09702017-03-16 12:09:08 -06001057 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001058
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001059 // Find an unsupported image format
1060 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1061 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1062 VkFormat format = static_cast<VkFormat>(f);
1063 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001064 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 unsupported = format;
1066 break;
1067 }
1068 }
1069
1070 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1072 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001073 // Specify an unsupported VkFormat value to generate a
1074 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1075 // Expected to trigger a warning from
1076 // parameter_validation::validate_result
1077 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001078 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1079 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001080 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1081 m_errorMonitor->VerifyFound();
1082 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001083}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001084
1085TEST_F(VkLayerTest, UpdateBufferAlignment) {
1086 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088
Tony Barbour1fa09702017-03-16 12:09:08 -06001089 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001090
1091 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1092 vk_testing::Buffer buffer;
1093 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1094
Tony Barbour552f6c02016-12-21 14:34:07 -07001095 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001096 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001098 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1099 m_errorMonitor->VerifyFound();
1100
1101 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001103 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1104 m_errorMonitor->VerifyFound();
1105
1106 // Introduce failure by using dataSize that is < 0
1107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001108 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001109 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1110 m_errorMonitor->VerifyFound();
1111
1112 // Introduce failure by using dataSize that is > 65536
1113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001114 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001115 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1116 m_errorMonitor->VerifyFound();
1117
Tony Barbour552f6c02016-12-21 14:34:07 -07001118 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119}
1120
1121TEST_F(VkLayerTest, FillBufferAlignment) {
1122 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1123
Tony Barbour1fa09702017-03-16 12:09:08 -06001124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001125
1126 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1127 vk_testing::Buffer buffer;
1128 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1129
Tony Barbour552f6c02016-12-21 14:34:07 -07001130 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001131
1132 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001134 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1135 m_errorMonitor->VerifyFound();
1136
1137 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001139 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1140 m_errorMonitor->VerifyFound();
1141
1142 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001144 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1145 m_errorMonitor->VerifyFound();
1146
Tony Barbour552f6c02016-12-21 14:34:07 -07001147 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001148}
Dustin Graves40f35822016-06-23 11:12:53 -06001149
Cortd889ff92016-07-27 09:51:27 -07001150TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1151 VkResult err;
1152
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001153 TEST_DESCRIPTION(
1154 "Attempt to use a non-solid polygon fill mode in a "
1155 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001156
Tony Barbour1fa09702017-03-16 12:09:08 -06001157 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1159
1160 std::vector<const char *> device_extension_names;
1161 auto features = m_device->phy().features();
1162 // Artificially disable support for non-solid fill modes
1163 features.fillModeNonSolid = false;
1164 // The sacrificial device object
1165 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1166
1167 VkRenderpassObj render_pass(&test_device);
1168
1169 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1170 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1171 pipeline_layout_ci.setLayoutCount = 0;
1172 pipeline_layout_ci.pSetLayouts = NULL;
1173
1174 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001175 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001176 ASSERT_VK_SUCCESS(err);
1177
1178 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1179 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1180 rs_ci.pNext = nullptr;
1181 rs_ci.lineWidth = 1.0f;
1182 rs_ci.rasterizerDiscardEnable = true;
1183
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001184 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1185 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001186
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001187 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
1202 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1204 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001205 {
1206 VkPipelineObj pipe(&test_device);
1207 pipe.AddShader(&vs);
1208 pipe.AddShader(&fs);
1209 pipe.AddColorAttachment();
1210 // Introduce failure by setting unsupported polygon mode
1211 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1212 pipe.SetRasterization(&rs_ci);
1213 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1214 }
1215 m_errorMonitor->VerifyFound();
1216
Cortd889ff92016-07-27 09:51:27 -07001217 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1218}
1219
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001220#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001221TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001222{
1223 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001224 VkFenceCreateInfo fenceInfo = {};
1225 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1226 fenceInfo.pNext = NULL;
1227 fenceInfo.flags = 0;
1228
Mike Weiblencce7ec72016-10-17 19:33:05 -06001229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001230
Tony Barbour1fa09702017-03-16 12:09:08 -06001231 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001232
1233 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1234 vk_testing::Buffer buffer;
1235 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001236
Tony Barbourfe3351b2015-07-28 10:17:20 -06001237 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001238 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001239 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001240
1241 testFence.init(*m_device, fenceInfo);
1242
1243 // Bypass framework since it does the waits automatically
1244 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001245 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001246 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1247 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001248 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001249 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001250 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001251 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001252 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001253 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001254 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001255
1256 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257 ASSERT_VK_SUCCESS( err );
1258
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001259 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001260 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001262 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001263}
1264
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001266{
1267 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001268 VkFenceCreateInfo fenceInfo = {};
1269 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1270 fenceInfo.pNext = NULL;
1271 fenceInfo.flags = 0;
1272
Mike Weiblencce7ec72016-10-17 19:33:05 -06001273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001274
Tony Barbour1fa09702017-03-16 12:09:08 -06001275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001276 ASSERT_NO_FATAL_FAILURE(InitViewport());
1277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1278
Tony Barbourfe3351b2015-07-28 10:17:20 -06001279 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001280 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001281 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001282
1283 testFence.init(*m_device, fenceInfo);
1284
1285 // Bypass framework since it does the waits automatically
1286 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001287 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1289 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001290 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001291 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001292 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001293 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001294 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001295 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001296 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001297
1298 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299 ASSERT_VK_SUCCESS( err );
1300
Jon Ashburnf19916e2016-01-11 13:12:43 -07001301 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001302 VkCommandBufferBeginInfo info = {};
1303 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1304 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001305 info.renderPass = VK_NULL_HANDLE;
1306 info.subpass = 0;
1307 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001308 info.occlusionQueryEnable = VK_FALSE;
1309 info.queryFlags = 0;
1310 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001311
1312 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001313 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001314
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001315 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001316}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001317#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001318
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001319TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1320 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1321
Tony Barbour1fa09702017-03-16 12:09:08 -06001322 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001323
1324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1325 VkBuffer buffer;
1326 VkBufferCreateInfo buf_info = {};
1327 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1328 buf_info.pNext = NULL;
1329 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1330 buf_info.size = 2048;
1331 buf_info.queueFamilyIndexCount = 0;
1332 buf_info.pQueueFamilyIndices = NULL;
1333 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1334 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1335 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1336 m_errorMonitor->VerifyFound();
1337
1338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1339 VkImage image;
1340 VkImageCreateInfo image_create_info = {};
1341 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1342 image_create_info.pNext = NULL;
1343 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1344 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1345 image_create_info.extent.width = 512;
1346 image_create_info.extent.height = 64;
1347 image_create_info.extent.depth = 1;
1348 image_create_info.mipLevels = 1;
1349 image_create_info.arrayLayers = 1;
1350 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1351 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1352 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1353 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1354 image_create_info.queueFamilyIndexCount = 0;
1355 image_create_info.pQueueFamilyIndices = NULL;
1356 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1357 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1358 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1359 m_errorMonitor->VerifyFound();
1360}
1361
Dave Houlton829c0d82017-01-24 15:09:17 -07001362TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1363 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1364
1365 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001366 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001367 ASSERT_NO_FATAL_FAILURE(
1368 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001369 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001370
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001371 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001372 device_features.sparseResidencyImage2D = VK_FALSE;
1373 device_features.sparseResidencyImage3D = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001374 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001375
1376 VkImage image = VK_NULL_HANDLE;
1377 VkResult result = VK_RESULT_MAX_ENUM;
1378 VkImageCreateInfo image_create_info = {};
1379 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1380 image_create_info.pNext = NULL;
1381 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1382 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1383 image_create_info.extent.width = 512;
1384 image_create_info.extent.height = 1;
1385 image_create_info.extent.depth = 1;
1386 image_create_info.mipLevels = 1;
1387 image_create_info.arrayLayers = 1;
1388 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1389 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1390 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1391 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1392 image_create_info.queueFamilyIndexCount = 0;
1393 image_create_info.pQueueFamilyIndices = NULL;
1394 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1395 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1396
1397 // 1D image w/ sparse residency is an error
1398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1399 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1400 m_errorMonitor->VerifyFound();
1401 if (VK_SUCCESS == result) {
1402 vkDestroyImage(m_device->device(), image, NULL);
1403 image = VK_NULL_HANDLE;
1404 }
1405
1406 // 2D image w/ sparse residency when feature isn't available
1407 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1408 image_create_info.extent.height = 64;
1409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1410 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1411 m_errorMonitor->VerifyFound();
1412 if (VK_SUCCESS == result) {
1413 vkDestroyImage(m_device->device(), image, NULL);
1414 image = VK_NULL_HANDLE;
1415 }
1416
1417 // 3D image w/ sparse residency when feature isn't available
1418 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1419 image_create_info.extent.depth = 8;
1420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1421 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1422 m_errorMonitor->VerifyFound();
1423 if (VK_SUCCESS == result) {
1424 vkDestroyImage(m_device->device(), image, NULL);
1425 image = VK_NULL_HANDLE;
1426 }
1427}
1428
1429TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1430 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1431
1432 // Determine which device feature are available
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001433 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001434 ASSERT_NO_FATAL_FAILURE(
1435 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001436 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001437
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001438 // These tests require that the device support sparse residency for 2D images
1439 if (VK_TRUE != device_features.sparseResidencyImage2D) {
1440 printf(" Test requires unsupported SparseResidencyImage2D feature. Skipped.\n");
Dave Houlton829c0d82017-01-24 15:09:17 -07001441 return;
1442 }
1443
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001444 // Mask out device features we don't want and initialize device state
Dave Houlton0ba0fdf2017-03-29 12:05:26 -06001445 device_features.sparseResidency2Samples = VK_FALSE;
1446 device_features.sparseResidency4Samples = VK_FALSE;
1447 device_features.sparseResidency8Samples = VK_FALSE;
1448 device_features.sparseResidency16Samples = VK_FALSE;
Dave Houlton8e0fe7a2017-03-30 10:32:10 -06001449 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001450
1451 VkImage image = VK_NULL_HANDLE;
1452 VkResult result = VK_RESULT_MAX_ENUM;
1453 VkImageCreateInfo image_create_info = {};
1454 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1455 image_create_info.pNext = NULL;
1456 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1457 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1458 image_create_info.extent.width = 64;
1459 image_create_info.extent.height = 64;
1460 image_create_info.extent.depth = 1;
1461 image_create_info.mipLevels = 1;
1462 image_create_info.arrayLayers = 1;
1463 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1464 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1465 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1466 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1467 image_create_info.queueFamilyIndexCount = 0;
1468 image_create_info.pQueueFamilyIndices = NULL;
1469 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1470 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1471
1472 // 2D image w/ sparse residency and linear tiling is an error
1473 m_errorMonitor->SetDesiredFailureMsg(
1474 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1475 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1476 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1477 m_errorMonitor->VerifyFound();
1478 if (VK_SUCCESS == result) {
1479 vkDestroyImage(m_device->device(), image, NULL);
1480 image = VK_NULL_HANDLE;
1481 }
1482 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1483
1484 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1485 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1487 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1488 m_errorMonitor->VerifyFound();
1489 if (VK_SUCCESS == result) {
1490 vkDestroyImage(m_device->device(), image, NULL);
1491 image = VK_NULL_HANDLE;
1492 }
1493
1494 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1496 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1497 m_errorMonitor->VerifyFound();
1498 if (VK_SUCCESS == result) {
1499 vkDestroyImage(m_device->device(), image, NULL);
1500 image = VK_NULL_HANDLE;
1501 }
1502
1503 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1505 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1506 m_errorMonitor->VerifyFound();
1507 if (VK_SUCCESS == result) {
1508 vkDestroyImage(m_device->device(), image, NULL);
1509 image = VK_NULL_HANDLE;
1510 }
1511
1512 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1514 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1515 m_errorMonitor->VerifyFound();
1516 if (VK_SUCCESS == result) {
1517 vkDestroyImage(m_device->device(), image, NULL);
1518 image = VK_NULL_HANDLE;
1519 }
1520}
1521
Tobin Ehlisf11be982016-05-11 13:52:53 -06001522TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001523 TEST_DESCRIPTION(
1524 "Create a buffer and image, allocate memory, and bind the "
1525 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001526 VkResult err;
1527 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001529
Tobin Ehlis077ded32016-05-12 17:39:13 -06001530 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001531 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001532 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001533 VkDeviceMemory mem; // buffer will be bound first
1534 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001535 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001536 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537
1538 VkBufferCreateInfo buf_info = {};
1539 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1540 buf_info.pNext = NULL;
1541 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1542 buf_info.size = 256;
1543 buf_info.queueFamilyIndexCount = 0;
1544 buf_info.pQueueFamilyIndices = NULL;
1545 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1546 buf_info.flags = 0;
1547 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1548 ASSERT_VK_SUCCESS(err);
1549
Tobin Ehlis077ded32016-05-12 17:39:13 -06001550 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551
1552 VkImageCreateInfo image_create_info = {};
1553 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1554 image_create_info.pNext = NULL;
1555 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1556 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1557 image_create_info.extent.width = 64;
1558 image_create_info.extent.height = 64;
1559 image_create_info.extent.depth = 1;
1560 image_create_info.mipLevels = 1;
1561 image_create_info.arrayLayers = 1;
1562 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001563 // Image tiling must be optimal to trigger error when aliasing linear buffer
1564 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001565 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1566 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1567 image_create_info.queueFamilyIndexCount = 0;
1568 image_create_info.pQueueFamilyIndices = NULL;
1569 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1570 image_create_info.flags = 0;
1571
Tobin Ehlisf11be982016-05-11 13:52:53 -06001572 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1573 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1575 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001576
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1578
1579 VkMemoryAllocateInfo alloc_info = {};
1580 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1581 alloc_info.pNext = NULL;
1582 alloc_info.memoryTypeIndex = 0;
1583 // Ensure memory is big enough for both bindings
1584 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001585 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1586 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001587 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001588 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001589 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001590 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 return;
1592 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1594 ASSERT_VK_SUCCESS(err);
1595 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1596 ASSERT_VK_SUCCESS(err);
1597
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1599
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001601 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001602 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1603 m_errorMonitor->VerifyFound();
1604
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001606 // aliasing buffer2
1607 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1608 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001609 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1610 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001611 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001612 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001614 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001615 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001616 m_errorMonitor->VerifyFound();
1617
1618 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001619 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001620 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001621 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001622 vkFreeMemory(m_device->device(), mem, NULL);
1623 vkFreeMemory(m_device->device(), mem_img, NULL);
1624}
1625
Tobin Ehlis35372522016-05-12 08:32:31 -06001626TEST_F(VkLayerTest, InvalidMemoryMapping) {
1627 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1628 VkResult err;
1629 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001630 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001631
1632 VkBuffer buffer;
1633 VkDeviceMemory mem;
1634 VkMemoryRequirements mem_reqs;
1635
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001636 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1637
Tobin Ehlis35372522016-05-12 08:32:31 -06001638 VkBufferCreateInfo buf_info = {};
1639 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1640 buf_info.pNext = NULL;
1641 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1642 buf_info.size = 256;
1643 buf_info.queueFamilyIndexCount = 0;
1644 buf_info.pQueueFamilyIndices = NULL;
1645 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1646 buf_info.flags = 0;
1647 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1648 ASSERT_VK_SUCCESS(err);
1649
1650 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1651 VkMemoryAllocateInfo alloc_info = {};
1652 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1653 alloc_info.pNext = NULL;
1654 alloc_info.memoryTypeIndex = 0;
1655
1656 // Ensure memory is big enough for both bindings
1657 static const VkDeviceSize allocation_size = 0x10000;
1658 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001660 if (!pass) {
1661 vkDestroyBuffer(m_device->device(), buffer, NULL);
1662 return;
1663 }
1664 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1665 ASSERT_VK_SUCCESS(err);
1666
1667 uint8_t *pData;
1668 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001670 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1671 m_errorMonitor->VerifyFound();
1672 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001673 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1676 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1677 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001678 m_errorMonitor->VerifyFound();
1679
1680 // Unmap the memory to avoid re-map error
1681 vkUnmapMemory(m_device->device(), mem);
1682 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1684 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1685 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001686 m_errorMonitor->VerifyFound();
1687 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1689 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001690 m_errorMonitor->VerifyFound();
1691 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001693 vkUnmapMemory(m_device->device(), mem);
1694 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001697 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001698 ASSERT_VK_SUCCESS(err);
1699 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001700 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001701 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001702 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001704 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1705 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001706
Tobin Ehlis35372522016-05-12 08:32:31 -06001707 // Now flush range that oversteps mapped range
1708 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001709 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001711 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001712 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1714 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1715 m_errorMonitor->VerifyFound();
1716
1717 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1718 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001719 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001720 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001721 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001722 mmr.size = VK_WHOLE_SIZE;
1723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001724 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1725 m_errorMonitor->VerifyFound();
1726
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001727#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001728 // Some platforms have an atomsize of 1 which makes the test meaningless
1729 if (atom_size > 3) {
1730 // Now with an offset NOT a multiple of the device limit
1731 vkUnmapMemory(m_device->device(), mem);
1732 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1733 ASSERT_VK_SUCCESS(err);
1734 mmr.offset = 3; // Not a multiple of atom_size
1735 mmr.size = VK_WHOLE_SIZE;
1736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1737 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1738 m_errorMonitor->VerifyFound();
1739
1740 // Now with a size NOT a multiple of the device limit
1741 vkUnmapMemory(m_device->device(), mem);
1742 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1743 ASSERT_VK_SUCCESS(err);
1744 mmr.offset = atom_size;
1745 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1747 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1748 m_errorMonitor->VerifyFound();
1749 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001750#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001751 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1752 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001753 if (!pass) {
1754 vkFreeMemory(m_device->device(), mem, NULL);
1755 vkDestroyBuffer(m_device->device(), buffer, NULL);
1756 return;
1757 }
1758 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1759 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1760
1761 vkDestroyBuffer(m_device->device(), buffer, NULL);
1762 vkFreeMemory(m_device->device(), mem, NULL);
1763}
1764
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001765#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001766TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1767 VkResult err;
1768 bool pass;
1769
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001770 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1771 // following declaration (which is temporarily being moved below):
1772 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001773 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001774 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001775 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001776 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001777 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001778 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001779
Tony Barbour1fa09702017-03-16 12:09:08 -06001780 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001781
Ian Elliott3f06ce52016-04-29 14:46:21 -06001782#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1783#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1784 // Use the functions from the VK_KHR_android_surface extension without
1785 // enabling that extension:
1786
1787 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001788 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1790 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001791 pass = (err != VK_SUCCESS);
1792 ASSERT_TRUE(pass);
1793 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001794#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001795
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796#if defined(VK_USE_PLATFORM_MIR_KHR)
1797 // Use the functions from the VK_KHR_mir_surface extension without enabling
1798 // that extension:
1799
1800 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001801 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001803 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1804 pass = (err != VK_SUCCESS);
1805 ASSERT_TRUE(pass);
1806 m_errorMonitor->VerifyFound();
1807
1808 // Tell whether an mir_connection supports presentation:
1809 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1811 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001812 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001813#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1816 // Use the functions from the VK_KHR_wayland_surface extension without
1817 // enabling that extension:
1818
1819 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001820 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1822 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 pass = (err != VK_SUCCESS);
1824 ASSERT_TRUE(pass);
1825 m_errorMonitor->VerifyFound();
1826
1827 // Tell whether an wayland_display supports presentation:
1828 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1830 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001831 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001832#endif // VK_USE_PLATFORM_WAYLAND_KHR
1833#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001834
Ian Elliott3f06ce52016-04-29 14:46:21 -06001835#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001836 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1837 // TO NON-LINUX PLATFORMS:
1838 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001839 // Use the functions from the VK_KHR_win32_surface extension without
1840 // enabling that extension:
1841
1842 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001843 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1845 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001846 pass = (err != VK_SUCCESS);
1847 ASSERT_TRUE(pass);
1848 m_errorMonitor->VerifyFound();
1849
1850 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001852 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001853 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001854// Set this (for now, until all platforms are supported and tested):
1855#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001856#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001857#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001858 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1859 // TO NON-LINUX PLATFORMS:
1860 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001861#endif
1862#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1864 // that extension:
1865
1866 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001867 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001869 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1870 pass = (err != VK_SUCCESS);
1871 ASSERT_TRUE(pass);
1872 m_errorMonitor->VerifyFound();
1873
1874 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001875 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001876 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1878 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001879 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001880// Set this (for now, until all platforms are supported and tested):
1881#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001882#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001883
Ian Elliott12630812016-04-29 14:35:43 -06001884#if defined(VK_USE_PLATFORM_XLIB_KHR)
1885 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1886 // that extension:
1887
1888 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001889 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001891 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1892 pass = (err != VK_SUCCESS);
1893 ASSERT_TRUE(pass);
1894 m_errorMonitor->VerifyFound();
1895
1896 // Tell whether an Xlib VisualID supports presentation:
1897 Display *dpy = NULL;
1898 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001900 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1901 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001902// Set this (for now, until all platforms are supported and tested):
1903#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001904#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001905
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001906// Use the functions from the VK_KHR_surface extension without enabling
1907// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001908
Ian Elliott489eec02016-05-05 14:12:44 -06001909#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001910 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001912 vkDestroySurfaceKHR(instance(), surface, NULL);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check if surface supports presentation:
1916 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001918 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1919 pass = (err != VK_SUCCESS);
1920 ASSERT_TRUE(pass);
1921 m_errorMonitor->VerifyFound();
1922
1923 // Check surface capabilities:
1924 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1926 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001927 pass = (err != VK_SUCCESS);
1928 ASSERT_TRUE(pass);
1929 m_errorMonitor->VerifyFound();
1930
1931 // Check surface formats:
1932 uint32_t format_count = 0;
1933 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1935 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001936 pass = (err != VK_SUCCESS);
1937 ASSERT_TRUE(pass);
1938 m_errorMonitor->VerifyFound();
1939
1940 // Check surface present modes:
1941 uint32_t present_mode_count = 0;
1942 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1944 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001945 pass = (err != VK_SUCCESS);
1946 ASSERT_TRUE(pass);
1947 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001948#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001949
Ian Elliott1c32c772016-04-28 14:47:13 -06001950 // Use the functions from the VK_KHR_swapchain extension without enabling
1951 // that extension:
1952
1953 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001955 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1956 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001957 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 pass = (err != VK_SUCCESS);
1959 ASSERT_TRUE(pass);
1960 m_errorMonitor->VerifyFound();
1961
1962 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1964 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001965 pass = (err != VK_SUCCESS);
1966 ASSERT_TRUE(pass);
1967 m_errorMonitor->VerifyFound();
1968
Chris Forbeseb7d5502016-09-13 18:19:21 +12001969 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1970 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1971 VkFence fence;
1972 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1973
Ian Elliott1c32c772016-04-28 14:47:13 -06001974 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001976 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001977 pass = (err != VK_SUCCESS);
1978 ASSERT_TRUE(pass);
1979 m_errorMonitor->VerifyFound();
1980
Chris Forbeseb7d5502016-09-13 18:19:21 +12001981 vkDestroyFence(m_device->device(), fence, nullptr);
1982
Ian Elliott1c32c772016-04-28 14:47:13 -06001983 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001984 //
1985 // NOTE: Currently can't test this because a real swapchain is needed (as
1986 // opposed to the fake one we created) in order for the layer to lookup the
1987 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001988
1989 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001991 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1992 m_errorMonitor->VerifyFound();
1993}
Chris Forbes09368e42016-10-13 11:59:22 +13001994#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001995
Karl Schultz6addd812016-02-02 17:17:23 -07001996TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1997 VkResult err;
1998 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001999
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2001 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002002
Tony Barbour1fa09702017-03-16 12:09:08 -06002003 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002004
2005 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002006 VkImage image;
2007 VkDeviceMemory mem;
2008 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002009
Karl Schultz6addd812016-02-02 17:17:23 -07002010 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2011 const int32_t tex_width = 32;
2012 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002013
Tony Barboureb254902015-07-15 12:50:33 -06002014 VkImageCreateInfo image_create_info = {};
2015 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 image_create_info.pNext = NULL;
2017 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2018 image_create_info.format = tex_format;
2019 image_create_info.extent.width = tex_width;
2020 image_create_info.extent.height = tex_height;
2021 image_create_info.extent.depth = 1;
2022 image_create_info.mipLevels = 1;
2023 image_create_info.arrayLayers = 1;
2024 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2025 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2026 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2027 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002028 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002029
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002030 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002031 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002032 mem_alloc.pNext = NULL;
2033 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002034
Chia-I Wuf7458c52015-10-26 21:10:41 +08002035 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002036 ASSERT_VK_SUCCESS(err);
2037
Karl Schultz6addd812016-02-02 17:17:23 -07002038 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039
Mark Lobodzinski23065352015-05-29 09:32:35 -05002040 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002041
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002042 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002043 if (!pass) { // If we can't find any unmappable memory this test doesn't
2044 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002045 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002046 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002047 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002048
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002050 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002051 ASSERT_VK_SUCCESS(err);
2052
2053 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002054 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002055 ASSERT_VK_SUCCESS(err);
2056
2057 // Map memory as if to initialize the image
2058 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002059 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002060
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002061 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002062
Chia-I Wuf7458c52015-10-26 21:10:41 +08002063 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002064 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002065}
2066
Karl Schultz6addd812016-02-02 17:17:23 -07002067TEST_F(VkLayerTest, RebindMemory) {
2068 VkResult err;
2069 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002072
Tony Barbour1fa09702017-03-16 12:09:08 -06002073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002074
2075 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002076 VkImage image;
2077 VkDeviceMemory mem1;
2078 VkDeviceMemory mem2;
2079 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002080
Karl Schultz6addd812016-02-02 17:17:23 -07002081 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2082 const int32_t tex_width = 32;
2083 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002084
Tony Barboureb254902015-07-15 12:50:33 -06002085 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002086 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2087 image_create_info.pNext = NULL;
2088 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2089 image_create_info.format = tex_format;
2090 image_create_info.extent.width = tex_width;
2091 image_create_info.extent.height = tex_height;
2092 image_create_info.extent.depth = 1;
2093 image_create_info.mipLevels = 1;
2094 image_create_info.arrayLayers = 1;
2095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2096 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2097 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2098 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002099
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002100 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002101 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2102 mem_alloc.pNext = NULL;
2103 mem_alloc.allocationSize = 0;
2104 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002105
Karl Schultz6addd812016-02-02 17:17:23 -07002106 // Introduce failure, do NOT set memProps to
2107 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002108 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002109 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002113
2114 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002115 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002116 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002117
2118 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002119 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002120 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002121 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002122 ASSERT_VK_SUCCESS(err);
2123
2124 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002125 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002126 ASSERT_VK_SUCCESS(err);
2127
Karl Schultz6addd812016-02-02 17:17:23 -07002128 // Introduce validation failure, try to bind a different memory object to
2129 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002130 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002131
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002132 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002133
Chia-I Wuf7458c52015-10-26 21:10:41 +08002134 vkDestroyImage(m_device->device(), image, NULL);
2135 vkFreeMemory(m_device->device(), mem1, NULL);
2136 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002137}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002138
Karl Schultz6addd812016-02-02 17:17:23 -07002139TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002140 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002141
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2143 "submitted in SIGNALED state. Fences "
2144 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002145
2146 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002147 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2148 fenceInfo.pNext = NULL;
2149 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002150
Tony Barbour1fa09702017-03-16 12:09:08 -06002151 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002152 ASSERT_NO_FATAL_FAILURE(InitViewport());
2153 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2154
Tony Barbour552f6c02016-12-21 14:34:07 -07002155 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002156 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002157 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002158
2159 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002160
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002161 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002162 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2163 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002164 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002165 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002166 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002167 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002168 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002169 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002170 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002171
2172 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002173 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002174
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002175 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002176}
Chris Forbes4e44c912016-06-16 10:20:00 +12002177
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002178TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002179 TEST_DESCRIPTION(
2180 "Specify wrong usage for image then create conflicting view of image "
2181 "Initialize buffer with wrong usage then perform copy expecting errors "
2182 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002184
Tony Barbour1fa09702017-03-16 12:09:08 -06002185 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06002186 auto format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002187 if (!format) {
2188 printf(" No Depth + Stencil format found. Skipped.\n");
2189 return;
2190 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002191
Tony Barbourf92621a2016-05-02 14:28:12 -06002192 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002193 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06002194 image.Init(128, 128, 1, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002195 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002196
Tony Barbourf92621a2016-05-02 14:28:12 -06002197 VkImageView dsv;
2198 VkImageViewCreateInfo dsvci = {};
2199 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2200 dsvci.image = image.handle();
2201 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002202 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002203 dsvci.subresourceRange.layerCount = 1;
2204 dsvci.subresourceRange.baseMipLevel = 0;
2205 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002206 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002207
Tony Barbourf92621a2016-05-02 14:28:12 -06002208 // Create a view with depth / stencil aspect for image with different usage
2209 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002210
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002211 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002212
2213 // Initialize buffer with TRANSFER_DST usage
2214 vk_testing::Buffer buffer;
2215 VkMemoryPropertyFlags reqs = 0;
2216 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2217 VkBufferImageCopy region = {};
2218 region.bufferRowLength = 128;
2219 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002220 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002221 region.imageSubresource.layerCount = 1;
2222 region.imageExtent.height = 16;
2223 region.imageExtent.width = 16;
2224 region.imageExtent.depth = 1;
2225
Mark Lobodzinski80871462017-02-16 10:37:27 -07002226 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002227 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002228
Chris Forbesda581202016-10-06 18:25:26 +13002229 // two separate errors from this call:
2230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2232
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002233 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2234 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002235 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002236}
Tony Barbour75d79f02016-08-30 09:39:07 -06002237
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002238TEST_F(VkLayerTest, LeakAnObject) {
2239 VkResult err;
2240
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002241 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002242
2243 // Note that we have to create a new device since destroying the
2244 // framework's device causes Teardown() to fail and just calling Teardown
2245 // will destroy the errorMonitor.
2246
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002248
Tony Barbour1fa09702017-03-16 12:09:08 -06002249 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002250
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002251 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252 std::vector<VkDeviceQueueCreateInfo> queue_info;
2253 queue_info.reserve(queue_props.size());
2254 std::vector<std::vector<float>> queue_priorities;
2255 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2256 VkDeviceQueueCreateInfo qi = {};
2257 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2258 qi.pNext = NULL;
2259 qi.queueFamilyIndex = i;
2260 qi.queueCount = queue_props[i].queueCount;
2261 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2262 qi.pQueuePriorities = queue_priorities[i].data();
2263 queue_info.push_back(qi);
2264 }
2265
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002266 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002267
2268 // The sacrificial device object
2269 VkDevice testDevice;
2270 VkDeviceCreateInfo device_create_info = {};
2271 auto features = m_device->phy().features();
2272 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2273 device_create_info.pNext = NULL;
2274 device_create_info.queueCreateInfoCount = queue_info.size();
2275 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002276 device_create_info.enabledLayerCount = 0;
2277 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002278 device_create_info.pEnabledFeatures = &features;
2279 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2280 ASSERT_VK_SUCCESS(err);
2281
2282 VkFence fence;
2283 VkFenceCreateInfo fence_create_info = {};
2284 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2285 fence_create_info.pNext = NULL;
2286 fence_create_info.flags = 0;
2287 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2288 ASSERT_VK_SUCCESS(err);
2289
2290 // Induce failure by not calling vkDestroyFence
2291 vkDestroyDevice(testDevice, NULL);
2292 m_errorMonitor->VerifyFound();
2293}
2294
2295TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002296 TEST_DESCRIPTION(
2297 "Allocate command buffers from one command pool and "
2298 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301
Tony Barbour1fa09702017-03-16 12:09:08 -06002302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 VkCommandPool command_pool_one;
2304 VkCommandPool command_pool_two;
2305
2306 VkCommandPoolCreateInfo pool_create_info{};
2307 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2308 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2309 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2310
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002311 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002312
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002313 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002314
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002315 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002316 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002317 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002318 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002319 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002320 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002321 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002323 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
2325 m_errorMonitor->VerifyFound();
2326
2327 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2328 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2329}
2330
2331TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2332 VkResult err;
2333
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002334 TEST_DESCRIPTION(
2335 "Allocate descriptor sets from one DS pool and "
2336 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002339
Tony Barbour1fa09702017-03-16 12:09:08 -06002340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2342
2343 VkDescriptorPoolSize ds_type_count = {};
2344 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2345 ds_type_count.descriptorCount = 1;
2346
2347 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2348 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2349 ds_pool_ci.pNext = NULL;
2350 ds_pool_ci.flags = 0;
2351 ds_pool_ci.maxSets = 1;
2352 ds_pool_ci.poolSizeCount = 1;
2353 ds_pool_ci.pPoolSizes = &ds_type_count;
2354
2355 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002356 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002357 ASSERT_VK_SUCCESS(err);
2358
2359 // Create a second descriptor pool
2360 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002361 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002362 ASSERT_VK_SUCCESS(err);
2363
2364 VkDescriptorSetLayoutBinding dsl_binding = {};
2365 dsl_binding.binding = 0;
2366 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2367 dsl_binding.descriptorCount = 1;
2368 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2369 dsl_binding.pImmutableSamplers = NULL;
2370
2371 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2372 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2373 ds_layout_ci.pNext = NULL;
2374 ds_layout_ci.bindingCount = 1;
2375 ds_layout_ci.pBindings = &dsl_binding;
2376
2377 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002378 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002379 ASSERT_VK_SUCCESS(err);
2380
2381 VkDescriptorSet descriptorSet;
2382 VkDescriptorSetAllocateInfo alloc_info = {};
2383 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2384 alloc_info.descriptorSetCount = 1;
2385 alloc_info.descriptorPool = ds_pool_one;
2386 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388 ASSERT_VK_SUCCESS(err);
2389
2390 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2391
2392 m_errorMonitor->VerifyFound();
2393
2394 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2395 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2396 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2397}
2398
2399TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002401
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002402 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002403
Tony Barbour1fa09702017-03-16 12:09:08 -06002404 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002405
2406 // Pass bogus handle into GetImageMemoryRequirements
2407 VkMemoryRequirements mem_reqs;
2408 uint64_t fakeImageHandle = 0xCADECADE;
2409 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2410
2411 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2412
2413 m_errorMonitor->VerifyFound();
2414}
2415
Mike Schuchardt17838902017-02-21 09:48:06 -07002416TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2417 TEST_DESCRIPTION(
2418 "Try to destroy a render pass object using a device other than the one it was created on. "
2419 "This should generate a distinct error from the invalid handle error.");
2420 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002421 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2423
2424 // Create second device
2425 float priorities[] = {1.0f};
2426 VkDeviceQueueCreateInfo queue_info{};
2427 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2428 queue_info.pNext = NULL;
2429 queue_info.flags = 0;
2430 queue_info.queueFamilyIndex = 0;
2431 queue_info.queueCount = 1;
2432 queue_info.pQueuePriorities = &priorities[0];
2433
2434 VkDeviceCreateInfo device_create_info = {};
2435 auto features = m_device->phy().features();
2436 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2437 device_create_info.pNext = NULL;
2438 device_create_info.queueCreateInfoCount = 1;
2439 device_create_info.pQueueCreateInfos = &queue_info;
2440 device_create_info.enabledLayerCount = 0;
2441 device_create_info.ppEnabledLayerNames = NULL;
2442 device_create_info.pEnabledFeatures = &features;
2443
2444 VkDevice second_device;
2445 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2446
2447 // Try to destroy the renderpass from the first device using the second device
2448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2449 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2450 m_errorMonitor->VerifyFound();
2451
2452 vkDestroyDevice(second_device, NULL);
2453}
2454
Karl Schultz6addd812016-02-02 17:17:23 -07002455TEST_F(VkLayerTest, PipelineNotBound) {
2456 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002458 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002459
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002461
Tony Barbour1fa09702017-03-16 12:09:08 -06002462 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002464
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002465 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2467 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002468
2469 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002470 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2471 ds_pool_ci.pNext = NULL;
2472 ds_pool_ci.maxSets = 1;
2473 ds_pool_ci.poolSizeCount = 1;
2474 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002475
2476 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002477 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002478 ASSERT_VK_SUCCESS(err);
2479
2480 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002481 dsl_binding.binding = 0;
2482 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2483 dsl_binding.descriptorCount = 1;
2484 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2485 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002486
2487 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002488 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2489 ds_layout_ci.pNext = NULL;
2490 ds_layout_ci.bindingCount = 1;
2491 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002492
2493 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002494 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002495 ASSERT_VK_SUCCESS(err);
2496
2497 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002498 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002499 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002500 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002501 alloc_info.descriptorPool = ds_pool;
2502 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002503 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002504 ASSERT_VK_SUCCESS(err);
2505
2506 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002507 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2508 pipeline_layout_ci.pNext = NULL;
2509 pipeline_layout_ci.setLayoutCount = 1;
2510 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002511
2512 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002513 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002514 ASSERT_VK_SUCCESS(err);
2515
Mark Youngad779052016-01-06 14:26:04 -07002516 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002517
Tony Barbour552f6c02016-12-21 14:34:07 -07002518 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002519 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002521 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002522
Chia-I Wuf7458c52015-10-26 21:10:41 +08002523 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2524 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2525 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002526}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002527
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002528TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2529 VkResult err;
2530
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002531 TEST_DESCRIPTION(
2532 "Test validation check for an invalid memory type index "
2533 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002534
Tony Barbour1fa09702017-03-16 12:09:08 -06002535 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002536
2537 // Create an image, allocate memory, set a bad typeIndex and then try to
2538 // bind it
2539 VkImage image;
2540 VkDeviceMemory mem;
2541 VkMemoryRequirements mem_reqs;
2542 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2543 const int32_t tex_width = 32;
2544 const int32_t tex_height = 32;
2545
2546 VkImageCreateInfo image_create_info = {};
2547 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2548 image_create_info.pNext = NULL;
2549 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2550 image_create_info.format = tex_format;
2551 image_create_info.extent.width = tex_width;
2552 image_create_info.extent.height = tex_height;
2553 image_create_info.extent.depth = 1;
2554 image_create_info.mipLevels = 1;
2555 image_create_info.arrayLayers = 1;
2556 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2557 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2558 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2559 image_create_info.flags = 0;
2560
2561 VkMemoryAllocateInfo mem_alloc = {};
2562 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2563 mem_alloc.pNext = NULL;
2564 mem_alloc.allocationSize = 0;
2565 mem_alloc.memoryTypeIndex = 0;
2566
2567 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2568 ASSERT_VK_SUCCESS(err);
2569
2570 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2571 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002572
2573 // Introduce Failure, select invalid TypeIndex
2574 VkPhysicalDeviceMemoryProperties memory_info;
2575
2576 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2577 unsigned int i;
2578 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2579 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2580 mem_alloc.memoryTypeIndex = i;
2581 break;
2582 }
2583 }
2584 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002585 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002586 vkDestroyImage(m_device->device(), image, NULL);
2587 return;
2588 }
2589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002591
2592 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2593 ASSERT_VK_SUCCESS(err);
2594
2595 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2596 (void)err;
2597
2598 m_errorMonitor->VerifyFound();
2599
2600 vkDestroyImage(m_device->device(), image, NULL);
2601 vkFreeMemory(m_device->device(), mem, NULL);
2602}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002603
Karl Schultz6addd812016-02-02 17:17:23 -07002604TEST_F(VkLayerTest, BindInvalidMemory) {
2605 VkResult err;
2606 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002607
Tony Barbour1fa09702017-03-16 12:09:08 -06002608 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002609
Cortf801b982017-01-17 18:10:21 -08002610 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002611 const int32_t tex_width = 256;
2612 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
2614 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2616 image_create_info.pNext = NULL;
2617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2618 image_create_info.format = tex_format;
2619 image_create_info.extent.width = tex_width;
2620 image_create_info.extent.height = tex_height;
2621 image_create_info.extent.depth = 1;
2622 image_create_info.mipLevels = 1;
2623 image_create_info.arrayLayers = 1;
2624 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002625 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002626 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2627 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002628
Cortf801b982017-01-17 18:10:21 -08002629 VkBufferCreateInfo buffer_create_info = {};
2630 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2631 buffer_create_info.pNext = NULL;
2632 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002633 buffer_create_info.size = 4 * 1024 * 1024;
2634 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002635 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002636
Cortf801b982017-01-17 18:10:21 -08002637 // Create an image/buffer, allocate memory, free it, and then try to bind it
2638 {
2639 VkImage image = VK_NULL_HANDLE;
2640 VkBuffer buffer = VK_NULL_HANDLE;
2641 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2642 ASSERT_VK_SUCCESS(err);
2643 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2644 ASSERT_VK_SUCCESS(err);
2645 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2646 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2647 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002648
Cortf801b982017-01-17 18:10:21 -08002649 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2650 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2651 image_mem_alloc.allocationSize = image_mem_reqs.size;
2652 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2653 ASSERT_TRUE(pass);
2654 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2655 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2656 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2657 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002658
Cortf801b982017-01-17 18:10:21 -08002659 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2660 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2661 ASSERT_VK_SUCCESS(err);
2662 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2663 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002664
Cortf801b982017-01-17 18:10:21 -08002665 vkFreeMemory(device(), image_mem, NULL);
2666 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002667
Cortf801b982017-01-17 18:10:21 -08002668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2669 err = vkBindImageMemory(device(), image, image_mem, 0);
2670 (void)err; // This may very well return an error.
2671 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002672
Cortf801b982017-01-17 18:10:21 -08002673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2674 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2675 (void)err; // This may very well return an error.
2676 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002677
Cortf801b982017-01-17 18:10:21 -08002678 vkDestroyImage(m_device->device(), image, NULL);
2679 vkDestroyBuffer(m_device->device(), buffer, NULL);
2680 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002681
2682 // Try to bind memory to an object that already has a memory binding
2683 {
2684 VkImage image = VK_NULL_HANDLE;
2685 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2686 ASSERT_VK_SUCCESS(err);
2687 VkBuffer buffer = VK_NULL_HANDLE;
2688 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2689 ASSERT_VK_SUCCESS(err);
2690 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2691 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2692 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2693 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2694 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2695 image_alloc_info.allocationSize = image_mem_reqs.size;
2696 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2697 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2698 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2699 ASSERT_TRUE(pass);
2700 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2701 ASSERT_TRUE(pass);
2702 VkDeviceMemory image_mem, buffer_mem;
2703 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2704 ASSERT_VK_SUCCESS(err);
2705 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2706 ASSERT_VK_SUCCESS(err);
2707
2708 err = vkBindImageMemory(device(), image, image_mem, 0);
2709 ASSERT_VK_SUCCESS(err);
2710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2711 err = vkBindImageMemory(device(), image, image_mem, 0);
2712 (void)err; // This may very well return an error.
2713 m_errorMonitor->VerifyFound();
2714
2715 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2716 ASSERT_VK_SUCCESS(err);
2717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2718 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2719 (void)err; // This may very well return an error.
2720 m_errorMonitor->VerifyFound();
2721
2722 vkFreeMemory(device(), image_mem, NULL);
2723 vkFreeMemory(device(), buffer_mem, NULL);
2724 vkDestroyImage(device(), image, NULL);
2725 vkDestroyBuffer(device(), buffer, NULL);
2726 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002727
Cort Strattonde748202017-02-17 12:50:01 -08002728 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002729 {
2730 VkImage image = VK_NULL_HANDLE;
2731 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2732 ASSERT_VK_SUCCESS(err);
2733 VkBuffer buffer = VK_NULL_HANDLE;
2734 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2735 ASSERT_VK_SUCCESS(err);
2736 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2737 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2738 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2739 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2740 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002741 // Leave some extra space for alignment wiggle room
2742 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002743 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002744 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002745 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2746 ASSERT_TRUE(pass);
2747 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2748 ASSERT_TRUE(pass);
2749 VkDeviceMemory image_mem, buffer_mem;
2750 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2751 ASSERT_VK_SUCCESS(err);
2752 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2753 ASSERT_VK_SUCCESS(err);
2754
Cort Strattonde748202017-02-17 12:50:01 -08002755 // Test unaligned memory offset
2756 {
2757 if (image_mem_reqs.alignment > 1) {
2758 VkDeviceSize image_offset = 1;
2759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2760 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2761 (void)err; // This may very well return an error.
2762 m_errorMonitor->VerifyFound();
2763 }
Cort6c7dff72017-01-27 18:34:50 -08002764
Cort Strattonde748202017-02-17 12:50:01 -08002765 if (buffer_mem_reqs.alignment > 1) {
2766 VkDeviceSize buffer_offset = 1;
2767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2768 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2769 (void)err; // This may very well return an error.
2770 m_errorMonitor->VerifyFound();
2771 }
2772 }
2773
2774 // Test memory offsets outside the memory allocation
2775 {
2776 VkDeviceSize image_offset =
2777 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2779 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2780 (void)err; // This may very well return an error.
2781 m_errorMonitor->VerifyFound();
2782
2783 VkDeviceSize buffer_offset =
2784 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2786 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2787 (void)err; // This may very well return an error.
2788 m_errorMonitor->VerifyFound();
2789 }
2790
2791 // Test memory offsets within the memory allocation, but which leave too little memory for
2792 // the resource.
2793 {
2794 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002795 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2797 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2798 (void)err; // This may very well return an error.
2799 m_errorMonitor->VerifyFound();
2800 }
2801
2802 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2803 if (buffer_offset > 0) {
2804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2805 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2806 (void)err; // This may very well return an error.
2807 m_errorMonitor->VerifyFound();
2808 }
2809 }
Cort6c7dff72017-01-27 18:34:50 -08002810
2811 vkFreeMemory(device(), image_mem, NULL);
2812 vkFreeMemory(device(), buffer_mem, NULL);
2813 vkDestroyImage(device(), image, NULL);
2814 vkDestroyBuffer(device(), buffer, NULL);
2815 }
2816
Cort Stratton4c38bb52017-01-28 13:33:10 -08002817 // Try to bind memory to an object with an invalid memory type
2818 {
2819 VkImage image = VK_NULL_HANDLE;
2820 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2821 ASSERT_VK_SUCCESS(err);
2822 VkBuffer buffer = VK_NULL_HANDLE;
2823 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2824 ASSERT_VK_SUCCESS(err);
2825 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2826 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2827 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2828 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2829 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2830 image_alloc_info.allocationSize = image_mem_reqs.size;
2831 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2832 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002833 // Create a mask of available memory types *not* supported by these resources,
2834 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002835 VkPhysicalDeviceMemoryProperties memory_properties = {};
2836 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002837 VkDeviceMemory image_mem, buffer_mem;
2838
Cort Stratton4c38bb52017-01-28 13:33:10 -08002839 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002840 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002841 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2842 ASSERT_TRUE(pass);
2843 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2844 ASSERT_VK_SUCCESS(err);
2845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2846 err = vkBindImageMemory(device(), image, image_mem, 0);
2847 (void)err; // This may very well return an error.
2848 m_errorMonitor->VerifyFound();
2849 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002850 }
2851
Cort Stratton4c38bb52017-01-28 13:33:10 -08002852 uint32_t buffer_unsupported_mem_type_bits =
2853 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002854 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002855 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2856 ASSERT_TRUE(pass);
2857 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2858 ASSERT_VK_SUCCESS(err);
2859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2860 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2861 (void)err; // This may very well return an error.
2862 m_errorMonitor->VerifyFound();
2863 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002864 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002865
Cort Stratton4c38bb52017-01-28 13:33:10 -08002866 vkDestroyImage(device(), image, NULL);
2867 vkDestroyBuffer(device(), buffer, NULL);
2868 }
2869
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 // Try to bind memory to an image created with sparse memory flags
2871 {
2872 VkImageCreateInfo sparse_image_create_info = image_create_info;
2873 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2874 VkImageFormatProperties image_format_properties = {};
2875 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2876 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2877 sparse_image_create_info.usage, sparse_image_create_info.flags,
2878 &image_format_properties);
2879 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2880 // most likely means sparse formats aren't supported here; skip this test.
2881 } else {
2882 ASSERT_VK_SUCCESS(err);
2883 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002884 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002885 return;
2886 } else {
2887 VkImage sparse_image = VK_NULL_HANDLE;
2888 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2889 ASSERT_VK_SUCCESS(err);
2890 VkMemoryRequirements sparse_mem_reqs = {};
2891 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2892 if (sparse_mem_reqs.memoryTypeBits != 0) {
2893 VkMemoryAllocateInfo sparse_mem_alloc = {};
2894 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2895 sparse_mem_alloc.pNext = NULL;
2896 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2897 sparse_mem_alloc.memoryTypeIndex = 0;
2898 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2899 ASSERT_TRUE(pass);
2900 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2901 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2902 ASSERT_VK_SUCCESS(err);
2903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2904 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2905 // This may very well return an error.
2906 (void)err;
2907 m_errorMonitor->VerifyFound();
2908 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2909 }
2910 vkDestroyImage(m_device->device(), sparse_image, NULL);
2911 }
2912 }
2913 }
2914
2915 // Try to bind memory to a buffer created with sparse memory flags
2916 {
2917 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2918 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2919 if (!m_device->phy().features().sparseResidencyBuffer) {
2920 // most likely means sparse formats aren't supported here; skip this test.
2921 } else {
2922 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2923 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2924 ASSERT_VK_SUCCESS(err);
2925 VkMemoryRequirements sparse_mem_reqs = {};
2926 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2927 if (sparse_mem_reqs.memoryTypeBits != 0) {
2928 VkMemoryAllocateInfo sparse_mem_alloc = {};
2929 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2930 sparse_mem_alloc.pNext = NULL;
2931 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2932 sparse_mem_alloc.memoryTypeIndex = 0;
2933 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2934 ASSERT_TRUE(pass);
2935 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2936 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2937 ASSERT_VK_SUCCESS(err);
2938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2939 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2940 // This may very well return an error.
2941 (void)err;
2942 m_errorMonitor->VerifyFound();
2943 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2944 }
2945 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2946 }
2947 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002948}
2949
Karl Schultz6addd812016-02-02 17:17:23 -07002950TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2951 VkResult err;
2952 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002953
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002955
Tony Barbour1fa09702017-03-16 12:09:08 -06002956 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002957
Karl Schultz6addd812016-02-02 17:17:23 -07002958 // Create an image object, allocate memory, destroy the object and then try
2959 // to bind it
2960 VkImage image;
2961 VkDeviceMemory mem;
2962 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002963
Karl Schultz6addd812016-02-02 17:17:23 -07002964 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2965 const int32_t tex_width = 32;
2966 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
2968 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2970 image_create_info.pNext = NULL;
2971 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2972 image_create_info.format = tex_format;
2973 image_create_info.extent.width = tex_width;
2974 image_create_info.extent.height = tex_height;
2975 image_create_info.extent.depth = 1;
2976 image_create_info.mipLevels = 1;
2977 image_create_info.arrayLayers = 1;
2978 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2979 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2981 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002983 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002984 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2985 mem_alloc.pNext = NULL;
2986 mem_alloc.allocationSize = 0;
2987 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002988
Chia-I Wuf7458c52015-10-26 21:10:41 +08002989 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002990 ASSERT_VK_SUCCESS(err);
2991
Karl Schultz6addd812016-02-02 17:17:23 -07002992 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002993
2994 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002995 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002996 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002997
2998 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06003000 ASSERT_VK_SUCCESS(err);
3001
3002 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08003003 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06003004 ASSERT_VK_SUCCESS(err);
3005
3006 // Now Try to bind memory to this destroyed object
3007 err = vkBindImageMemory(m_device->device(), image, mem, 0);
3008 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07003009 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06003010
Chris Forbes8f36a8a2016-04-07 13:21:07 +12003011 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06003012
Chia-I Wuf7458c52015-10-26 21:10:41 +08003013 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003014}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003015
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003016TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3017 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3018
Tony Barbour1fa09702017-03-16 12:09:08 -06003019 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003020 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3021
3022 VkVertexInputBindingDescription input_binding;
3023 memset(&input_binding, 0, sizeof(input_binding));
3024
3025 VkVertexInputAttributeDescription input_attribs;
3026 memset(&input_attribs, 0, sizeof(input_attribs));
3027
3028 // Pick a really bad format for this purpose and make sure it should fail
3029 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3030 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3031 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003032 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003033 return;
3034 }
3035
3036 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003037 char const *vsSource =
3038 "#version 450\n"
3039 "\n"
3040 "out gl_PerVertex {\n"
3041 " vec4 gl_Position;\n"
3042 "};\n"
3043 "void main(){\n"
3044 " gl_Position = vec4(1);\n"
3045 "}\n";
3046 char const *fsSource =
3047 "#version 450\n"
3048 "\n"
3049 "layout(location=0) out vec4 color;\n"
3050 "void main(){\n"
3051 " color = vec4(1);\n"
3052 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003053
3054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3057
3058 VkPipelineObj pipe(m_device);
3059 pipe.AddColorAttachment();
3060 pipe.AddShader(&vs);
3061 pipe.AddShader(&fs);
3062
3063 pipe.AddVertexInputBindings(&input_binding, 1);
3064 pipe.AddVertexInputAttribs(&input_attribs, 1);
3065
3066 VkDescriptorSetObj descriptorSet(m_device);
3067 descriptorSet.AppendDummy();
3068 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3069
3070 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3071
3072 m_errorMonitor->VerifyFound();
3073}
3074
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003075TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003076 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003077 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003078
3079 VkMemoryPropertyFlags reqs = 0;
3080 VkImageCreateInfo image_create_info = {};
3081 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3082 image_create_info.pNext = NULL;
3083 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3084 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3085 image_create_info.extent.width = 256;
3086 image_create_info.extent.height = 256;
3087 image_create_info.extent.depth = 1;
3088 image_create_info.mipLevels = 1;
3089 image_create_info.arrayLayers = 1;
3090 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3091 image_create_info.flags = 0;
3092
3093 VkImageBlit blit_region = {};
3094 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3095 blit_region.srcSubresource.baseArrayLayer = 0;
3096 blit_region.srcSubresource.layerCount = 1;
3097 blit_region.srcSubresource.mipLevel = 0;
3098 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3099 blit_region.dstSubresource.baseArrayLayer = 0;
3100 blit_region.dstSubresource.layerCount = 1;
3101 blit_region.dstSubresource.mipLevel = 0;
3102
3103 // Create two images, the source with sampleCount = 2, and attempt to blit
3104 // between them
3105 {
3106 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003107 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003108 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003109 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003110 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003111 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003112 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003115 m_errorMonitor->SetDesiredFailureMsg(
3116 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3117 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003118 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3119 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_errorMonitor->VerifyFound();
3121 m_commandBuffer->EndCommandBuffer();
3122 }
3123
3124 // Create two images, the dest with sampleCount = 4, and attempt to blit
3125 // between them
3126 {
3127 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003128 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003129 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003130 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003131 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003132 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003133 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003134 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003135 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003136 m_errorMonitor->SetDesiredFailureMsg(
3137 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3138 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003139 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3140 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 m_errorMonitor->VerifyFound();
3142 m_commandBuffer->EndCommandBuffer();
3143 }
3144
3145 VkBufferImageCopy copy_region = {};
3146 copy_region.bufferRowLength = 128;
3147 copy_region.bufferImageHeight = 128;
3148 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3149 copy_region.imageSubresource.layerCount = 1;
3150 copy_region.imageExtent.height = 64;
3151 copy_region.imageExtent.width = 64;
3152 copy_region.imageExtent.depth = 1;
3153
3154 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3155 // buffer to image
3156 {
3157 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003158 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3159 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003160 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003161 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003162 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003163 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003164 m_errorMonitor->SetDesiredFailureMsg(
3165 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3166 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003167 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3168 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003169 m_errorMonitor->VerifyFound();
3170 m_commandBuffer->EndCommandBuffer();
3171 }
3172
3173 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3174 // image to buffer
3175 {
3176 vk_testing::Buffer dst_buffer;
3177 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3178 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003179 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003180 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003181 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003182 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003183 m_errorMonitor->SetDesiredFailureMsg(
3184 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3185 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003186 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003187 dst_buffer.handle(), 1, &copy_region);
3188 m_errorMonitor->VerifyFound();
3189 m_commandBuffer->EndCommandBuffer();
3190 }
3191}
3192
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003193TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003194 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003195
3196 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003197 src_image.Init(64, 64, 1, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003198 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003199 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003200 VkImageObj dst_image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003201 dst_image2.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003202
3203 VkImageBlit blitRegion = {};
3204 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3205 blitRegion.srcSubresource.baseArrayLayer = 0;
3206 blitRegion.srcSubresource.layerCount = 1;
3207 blitRegion.srcSubresource.mipLevel = 0;
3208 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3209 blitRegion.dstSubresource.baseArrayLayer = 0;
3210 blitRegion.dstSubresource.layerCount = 1;
3211 blitRegion.dstSubresource.mipLevel = 0;
3212
Dave Houlton34df4cb2016-12-01 16:43:06 -07003213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3214
3215 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3216 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
3218 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003219 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003220 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image.image(), dst_image.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003221 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003222
3223 m_errorMonitor->VerifyFound();
3224
Dave Houlton34df4cb2016-12-01 16:43:06 -07003225 // Test should generate 2 VU failures
3226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003228
3229 // Unsigned int vs signed int
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003230 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.Layout(), dst_image2.image(), dst_image2.Layout(), 1,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003231 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003232
Dave Houlton34df4cb2016-12-01 16:43:06 -07003233 // TODO: Note that this only verifies that at least one of the VU enums was found
3234 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003235 m_errorMonitor->VerifyFound();
3236
Tony Barbour552f6c02016-12-21 14:34:07 -07003237 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003238}
3239
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003240TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3241 VkResult err;
3242 bool pass;
3243
3244 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003245 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246
3247 // If w/d/h granularity is 1, test is not meaningful
3248 // TODO: When virtual device limits are available, create a set of limits for this test that
3249 // will always have a granularity of > 1 for w, h, and d
3250 auto index = m_device->graphics_queue_node_index_;
3251 auto queue_family_properties = m_device->phy().queue_properties();
3252
3253 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3254 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3255 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3256 return;
3257 }
3258
3259 // Create two images of different types and try to copy between them
3260 VkImage srcImage;
3261 VkImage dstImage;
3262 VkDeviceMemory srcMem;
3263 VkDeviceMemory destMem;
3264 VkMemoryRequirements memReqs;
3265
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003266 VkImageCreateInfo image_create_info = {};
3267 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3268 image_create_info.pNext = NULL;
3269 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3270 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3271 image_create_info.extent.width = 32;
3272 image_create_info.extent.height = 32;
3273 image_create_info.extent.depth = 1;
3274 image_create_info.mipLevels = 1;
3275 image_create_info.arrayLayers = 4;
3276 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3277 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3278 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3279 image_create_info.flags = 0;
3280
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_VK_SUCCESS(err);
3283
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003284 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003285 ASSERT_VK_SUCCESS(err);
3286
3287 // Allocate memory
3288 VkMemoryAllocateInfo memAlloc = {};
3289 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3290 memAlloc.pNext = NULL;
3291 memAlloc.allocationSize = 0;
3292 memAlloc.memoryTypeIndex = 0;
3293
3294 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3295 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003296 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003297 ASSERT_TRUE(pass);
3298 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3299 ASSERT_VK_SUCCESS(err);
3300
3301 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3302 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003303 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003304 ASSERT_VK_SUCCESS(err);
3305 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3306 ASSERT_VK_SUCCESS(err);
3307
3308 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3309 ASSERT_VK_SUCCESS(err);
3310 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3311 ASSERT_VK_SUCCESS(err);
3312
Tony Barbour552f6c02016-12-21 14:34:07 -07003313 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003314 VkImageCopy copyRegion;
3315 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3316 copyRegion.srcSubresource.mipLevel = 0;
3317 copyRegion.srcSubresource.baseArrayLayer = 0;
3318 copyRegion.srcSubresource.layerCount = 1;
3319 copyRegion.srcOffset.x = 0;
3320 copyRegion.srcOffset.y = 0;
3321 copyRegion.srcOffset.z = 0;
3322 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3323 copyRegion.dstSubresource.mipLevel = 0;
3324 copyRegion.dstSubresource.baseArrayLayer = 0;
3325 copyRegion.dstSubresource.layerCount = 1;
3326 copyRegion.dstOffset.x = 0;
3327 copyRegion.dstOffset.y = 0;
3328 copyRegion.dstOffset.z = 0;
3329 copyRegion.extent.width = 1;
3330 copyRegion.extent.height = 1;
3331 copyRegion.extent.depth = 1;
3332
3333 // Introduce failure by setting srcOffset to a bad granularity value
3334 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3336 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003337 m_errorMonitor->VerifyFound();
3338
3339 // Introduce failure by setting extent to a bad granularity value
3340 copyRegion.srcOffset.y = 0;
3341 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003342 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3343 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003344 m_errorMonitor->VerifyFound();
3345
3346 // Now do some buffer/image copies
3347 vk_testing::Buffer buffer;
3348 VkMemoryPropertyFlags reqs = 0;
3349 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3350 VkBufferImageCopy region = {};
3351 region.bufferOffset = 0;
3352 region.bufferRowLength = 3;
3353 region.bufferImageHeight = 128;
3354 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3355 region.imageSubresource.layerCount = 1;
3356 region.imageExtent.height = 16;
3357 region.imageExtent.width = 16;
3358 region.imageExtent.depth = 1;
3359 region.imageOffset.x = 0;
3360 region.imageOffset.y = 0;
3361 region.imageOffset.z = 0;
3362
3363 // Introduce failure by setting bufferRowLength to a bad granularity value
3364 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3366 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3367 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003368 m_errorMonitor->VerifyFound();
3369 region.bufferRowLength = 128;
3370
3371 // Introduce failure by setting bufferOffset to a bad granularity value
3372 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3374 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3375 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003376 m_errorMonitor->VerifyFound();
3377 region.bufferOffset = 0;
3378
3379 // Introduce failure by setting bufferImageHeight to a bad granularity value
3380 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3382 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3383 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003384 m_errorMonitor->VerifyFound();
3385 region.bufferImageHeight = 128;
3386
3387 // Introduce failure by setting imageExtent to a bad granularity value
3388 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3390 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3391 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003392 m_errorMonitor->VerifyFound();
3393 region.imageExtent.width = 16;
3394
3395 // Introduce failure by setting imageOffset to a bad granularity value
3396 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3398 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3399 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003400 m_errorMonitor->VerifyFound();
3401
Tony Barbour552f6c02016-12-21 14:34:07 -07003402 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003403
3404 vkDestroyImage(m_device->device(), srcImage, NULL);
3405 vkDestroyImage(m_device->device(), dstImage, NULL);
3406 vkFreeMemory(m_device->device(), srcMem, NULL);
3407 vkFreeMemory(m_device->device(), destMem, NULL);
3408}
3409
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003410TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003411 TEST_DESCRIPTION(
3412 "Submit command buffer created using one queue family and "
3413 "attempt to submit them on a queue created in a different "
3414 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003415
Tony Barbour1fa09702017-03-16 12:09:08 -06003416 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003417
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003418 // This test is meaningless unless we have multiple queue families
3419 auto queue_family_properties = m_device->phy().queue_properties();
3420 if (queue_family_properties.size() < 2) {
3421 return;
3422 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003424 // Get safe index of another queue family
3425 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003426 VkQueue other_queue;
3427 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3428
3429 // Record an empty cmd buffer
3430 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3431 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3432 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3433 vkEndCommandBuffer(m_commandBuffer->handle());
3434
3435 // And submit on the wrong queue
3436 VkSubmitInfo submit_info = {};
3437 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3438 submit_info.commandBufferCount = 1;
3439 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003440 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003441
3442 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003443}
3444
Chris Forbes4c24a922016-11-16 08:59:10 +13003445TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003446 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003447
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003448 // There are no attachments, but refer to attachment 0.
3449 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003450 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003451 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003452 };
3453
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003454 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003455 VkRenderPass rp;
3456
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003457 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003459 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3460 m_errorMonitor->VerifyFound();
3461}
3462
Chris Forbesa58c4522016-09-28 15:19:39 +13003463TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3464 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003465 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003466
3467 // A renderpass with two subpasses, both writing the same attachment.
3468 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003469 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3470 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3471 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003472 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003473 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003474 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003475 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3476 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003477 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 VkSubpassDependency dep = {0,
3479 1,
3480 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3481 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3482 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3483 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3484 VK_DEPENDENCY_BY_REGION_BIT};
3485 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003486 VkRenderPass rp;
3487 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3488 ASSERT_VK_SUCCESS(err);
3489
3490 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003491 image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003492 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3493
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003494 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003495 VkFramebuffer fb;
3496 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3497 ASSERT_VK_SUCCESS(err);
3498
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003499 char const *vsSource =
3500 "#version 450\n"
3501 "void main() { gl_Position = vec4(1); }\n";
3502 char const *fsSource =
3503 "#version 450\n"
3504 "layout(location=0) out vec4 color;\n"
3505 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003506
3507 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3508 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3509 VkPipelineObj pipe(m_device);
3510 pipe.AddColorAttachment();
3511 pipe.AddShader(&vs);
3512 pipe.AddShader(&fs);
3513 VkViewport view_port = {};
3514 m_viewports.push_back(view_port);
3515 pipe.SetViewport(m_viewports);
3516 VkRect2D rect = {};
3517 m_scissors.push_back(rect);
3518 pipe.SetScissor(m_scissors);
3519
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003520 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003521 VkPipelineLayout pl;
3522 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3523 ASSERT_VK_SUCCESS(err);
3524 pipe.CreateVKPipeline(pl, rp);
3525
Tony Barbour552f6c02016-12-21 14:34:07 -07003526 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003527
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003528 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3529 nullptr,
3530 rp,
3531 fb,
3532 {{
3533 0, 0,
3534 },
3535 {32, 32}},
3536 0,
3537 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003538
3539 // subtest 1: bind in the wrong subpass
3540 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3541 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003543 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3544 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3545 m_errorMonitor->VerifyFound();
3546
3547 vkCmdEndRenderPass(m_commandBuffer->handle());
3548
3549 // subtest 2: bind in correct subpass, then transition to next subpass
3550 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3551 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3552 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003554 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3555 m_errorMonitor->VerifyFound();
3556
3557 vkCmdEndRenderPass(m_commandBuffer->handle());
3558
Tony Barbour552f6c02016-12-21 14:34:07 -07003559 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003560
3561 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3562 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3563 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3564}
3565
Tony Barbour4e919972016-08-09 13:27:40 -06003566TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003567 TEST_DESCRIPTION(
3568 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3569 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003570 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3572
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3574 "Cannot execute a render pass with renderArea "
3575 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003576
3577 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3578 m_renderPassBeginInfo.renderArea.extent.width = 257;
3579 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003580 m_commandBuffer->BeginCommandBuffer();
3581 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003582 m_errorMonitor->VerifyFound();
3583}
3584
3585TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003586 TEST_DESCRIPTION(
3587 "Generate INDEPENDENT_BLEND by disabling independent "
3588 "blend and then specifying different blend states for two "
3589 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003590 VkPhysicalDeviceFeatures features = {};
3591 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003592 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003593
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003594 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3595 "Invalid Pipeline CreateInfo: If independent blend feature not "
3596 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003597
Cody Northropc31a84f2016-08-22 10:41:47 -06003598 VkDescriptorSetObj descriptorSet(m_device);
3599 descriptorSet.AppendDummy();
3600 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003601
Cody Northropc31a84f2016-08-22 10:41:47 -06003602 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003603 // Create a renderPass with two color attachments
3604 VkAttachmentReference attachments[2] = {};
3605 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003606 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003607 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3608
3609 VkSubpassDescription subpass = {};
3610 subpass.pColorAttachments = attachments;
3611 subpass.colorAttachmentCount = 2;
3612
3613 VkRenderPassCreateInfo rpci = {};
3614 rpci.subpassCount = 1;
3615 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003616 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003617
Tony Barbourffd60bd2017-03-09 12:04:55 -07003618 VkAttachmentDescription attach_desc[2] = {};
3619 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3620 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3621 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3622 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3623 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3624 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3625 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3626 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003627
Tony Barbourffd60bd2017-03-09 12:04:55 -07003628 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003629 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3630
3631 VkRenderPass renderpass;
3632 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003633 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003634 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003635
Cody Northropc31a84f2016-08-22 10:41:47 -06003636 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3637 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3638 att_state1.blendEnable = VK_TRUE;
3639 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3640 att_state2.blendEnable = VK_FALSE;
3641 pipeline.AddColorAttachment(0, &att_state1);
3642 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003643 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003644 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003645 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003646}
3647
Mike Weiblen40b160e2017-02-06 19:21:52 -07003648// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3649TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3650 TEST_DESCRIPTION(
3651 "Create a graphics pipeline that is incompatible with the requirements "
3652 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003653 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003654
3655 VkDescriptorSetObj ds_obj(m_device);
3656 ds_obj.AppendDummy();
3657 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3658
3659 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3660
3661 VkPipelineColorBlendAttachmentState att_state1 = {};
3662 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3663 att_state1.blendEnable = VK_TRUE;
3664
3665 VkRenderpassObj rp_obj(m_device);
3666
3667 {
3668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3669 VkPipelineObj pipeline(m_device);
3670 pipeline.AddShader(&vs_obj);
3671 pipeline.AddColorAttachment(0, &att_state1);
3672
3673 VkGraphicsPipelineCreateInfo info = {};
3674 pipeline.InitGraphicsPipelineCreateInfo(&info);
3675 info.pColorBlendState = nullptr;
3676
3677 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3678 m_errorMonitor->VerifyFound();
3679 }
3680}
3681
Chris Forbes26ec2122016-11-29 08:58:33 +13003682#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003683TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3684 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3685 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003686 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003687
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3689 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003690
3691 // Create a renderPass with a single color attachment
3692 VkAttachmentReference attach = {};
3693 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3694 VkSubpassDescription subpass = {};
3695 VkRenderPassCreateInfo rpci = {};
3696 rpci.subpassCount = 1;
3697 rpci.pSubpasses = &subpass;
3698 rpci.attachmentCount = 1;
3699 VkAttachmentDescription attach_desc = {};
3700 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3701 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3702 rpci.pAttachments = &attach_desc;
3703 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3704 VkRenderPass rp;
3705 subpass.pDepthStencilAttachment = &attach;
3706 subpass.pColorAttachments = NULL;
3707 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3708 m_errorMonitor->VerifyFound();
3709}
Chris Forbes26ec2122016-11-29 08:58:33 +13003710#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003711
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003712TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003713 TEST_DESCRIPTION(
3714 "Create a framebuffer where a subpass has a preserve "
3715 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003716
Tony Barbour1fa09702017-03-16 12:09:08 -06003717 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3719
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003721
3722 VkAttachmentReference color_attach = {};
3723 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3724 color_attach.attachment = 0;
3725 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3726 VkSubpassDescription subpass = {};
3727 subpass.colorAttachmentCount = 1;
3728 subpass.pColorAttachments = &color_attach;
3729 subpass.preserveAttachmentCount = 1;
3730 subpass.pPreserveAttachments = &preserve_attachment;
3731
3732 VkRenderPassCreateInfo rpci = {};
3733 rpci.subpassCount = 1;
3734 rpci.pSubpasses = &subpass;
3735 rpci.attachmentCount = 1;
3736 VkAttachmentDescription attach_desc = {};
3737 attach_desc.format = VK_FORMAT_UNDEFINED;
3738 rpci.pAttachments = &attach_desc;
3739 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3740 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003741 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003742
3743 m_errorMonitor->VerifyFound();
3744
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003745 if (result == VK_SUCCESS) {
3746 vkDestroyRenderPass(m_device->device(), rp, NULL);
3747 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003748}
3749
Chris Forbesc5389742016-06-29 11:49:23 +12003750TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003751 TEST_DESCRIPTION(
3752 "Ensure that CreateRenderPass produces a validation error "
3753 "when the source of a subpass multisample resolve "
3754 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003755
Tony Barbour1fa09702017-03-16 12:09:08 -06003756 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003757
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3759 "Subpass 0 requests multisample resolve from attachment 0 which has "
3760 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003761
3762 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003763 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3764 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3765 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3766 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3767 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3768 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003769 };
3770
3771 VkAttachmentReference color = {
3772 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3773 };
3774
3775 VkAttachmentReference resolve = {
3776 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3777 };
3778
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003779 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003780
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003781 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003782
3783 VkRenderPass rp;
3784 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3785
3786 m_errorMonitor->VerifyFound();
3787
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003788 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003789}
3790
3791TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003792 TEST_DESCRIPTION(
3793 "Ensure CreateRenderPass produces a validation error "
3794 "when a subpass multisample resolve operation is "
3795 "requested, and the destination of that resolve has "
3796 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003797
Tony Barbour1fa09702017-03-16 12:09:08 -06003798 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003799
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3801 "Subpass 0 requests multisample resolve into attachment 1, which "
3802 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003803
3804 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003805 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3806 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3807 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3808 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3809 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3810 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003811 };
3812
3813 VkAttachmentReference color = {
3814 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3815 };
3816
3817 VkAttachmentReference resolve = {
3818 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3819 };
3820
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003821 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003822
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003823 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003824
3825 VkRenderPass rp;
3826 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3827
3828 m_errorMonitor->VerifyFound();
3829
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003830 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003831}
3832
Chris Forbes3f128ef2016-06-29 14:58:53 +12003833TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003834 TEST_DESCRIPTION(
3835 "Ensure CreateRenderPass produces a validation error "
3836 "when the color and depth attachments used by a subpass "
3837 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003838
Tony Barbour1fa09702017-03-16 12:09:08 -06003839 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003840
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3842 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003843
3844 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003845 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3846 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3847 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3848 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3849 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3850 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003851 };
3852
3853 VkAttachmentReference color[] = {
3854 {
3855 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3856 },
3857 {
3858 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3859 },
3860 };
3861
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003862 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003864 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003865
3866 VkRenderPass rp;
3867 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3868
3869 m_errorMonitor->VerifyFound();
3870
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003871 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003872}
3873
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003874TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003875 TEST_DESCRIPTION(
3876 "Hit errors when attempting to create a framebuffer :\n"
3877 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3878 " 2. Use a color image as depthStencil attachment\n"
3879 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3880 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3881 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3882 " 6. Framebuffer attachment where dimensions don't match\n"
3883 " 7. Framebuffer attachment w/o identity swizzle\n"
3884 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885
Tony Barbour1fa09702017-03-16 12:09:08 -06003886 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3888
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003889 m_errorMonitor->SetDesiredFailureMsg(
3890 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3891 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003893 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003894 VkAttachmentReference attach = {};
3895 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3896 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003897 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003898 VkRenderPassCreateInfo rpci = {};
3899 rpci.subpassCount = 1;
3900 rpci.pSubpasses = &subpass;
3901 rpci.attachmentCount = 1;
3902 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003903 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003904 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003905 rpci.pAttachments = &attach_desc;
3906 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3907 VkRenderPass rp;
3908 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3909 ASSERT_VK_SUCCESS(err);
3910
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003911 VkImageView ivs[2];
3912 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3913 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003914 VkFramebufferCreateInfo fb_info = {};
3915 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3916 fb_info.pNext = NULL;
3917 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003918 // Set mis-matching attachmentCount
3919 fb_info.attachmentCount = 2;
3920 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003921 fb_info.width = 100;
3922 fb_info.height = 100;
3923 fb_info.layers = 1;
3924
3925 VkFramebuffer fb;
3926 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3927
3928 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003929 if (err == VK_SUCCESS) {
3930 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3931 }
3932 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003933
3934 // Create a renderPass with a depth-stencil attachment created with
3935 // IMAGE_USAGE_COLOR_ATTACHMENT
3936 // Add our color attachment to pDepthStencilAttachment
3937 subpass.pDepthStencilAttachment = &attach;
3938 subpass.pColorAttachments = NULL;
3939 VkRenderPass rp_ds;
3940 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3941 ASSERT_VK_SUCCESS(err);
3942 // Set correct attachment count, but attachment has COLOR usage bit set
3943 fb_info.attachmentCount = 1;
3944 fb_info.renderPass = rp_ds;
3945
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003947 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3948
3949 m_errorMonitor->VerifyFound();
3950 if (err == VK_SUCCESS) {
3951 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3952 }
3953 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954
3955 // Create new renderpass with alternate attachment format from fb
3956 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3957 subpass.pDepthStencilAttachment = NULL;
3958 subpass.pColorAttachments = &attach;
3959 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3960 ASSERT_VK_SUCCESS(err);
3961
3962 // Cause error due to mis-matched formats between rp & fb
3963 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3964 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3966 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003967 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3968
3969 m_errorMonitor->VerifyFound();
3970 if (err == VK_SUCCESS) {
3971 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3972 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003973 vkDestroyRenderPass(m_device->device(), rp, NULL);
3974
3975 // Create new renderpass with alternate sample count from fb
3976 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3977 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3978 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3979 ASSERT_VK_SUCCESS(err);
3980
3981 // Cause error due to mis-matched sample count between rp & fb
3982 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003984 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003985 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3986
3987 m_errorMonitor->VerifyFound();
3988 if (err == VK_SUCCESS) {
3989 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3990 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003991
3992 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003993
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06003994 {
3995 // Create an image with 2 mip levels.
3996 VkImageObj image(m_device);
3997 image.Init(128, 128, 2, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
3998 ASSERT_TRUE(image.initialized());
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003999
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004000 // Create a image view with two mip levels.
4001 VkImageView view;
4002 VkImageViewCreateInfo ivci = {};
4003 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4004 ivci.image = image.handle();
4005 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4006 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4007 ivci.subresourceRange.layerCount = 1;
4008 ivci.subresourceRange.baseMipLevel = 0;
4009 // Set level count to 2 (only 1 is allowed for FB attachment)
4010 ivci.subresourceRange.levelCount = 2;
4011 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4012 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4013 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004014
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004015 // Re-create renderpass to have matching sample count
4016 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4017 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4018 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004019
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004020 fb_info.renderPass = rp;
4021 fb_info.pAttachments = &view;
4022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
4023 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4024
4025 m_errorMonitor->VerifyFound();
4026 if (err == VK_SUCCESS) {
4027 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4028 }
4029 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004030 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004031
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004032 // Update view to original color buffer and grow FB dimensions too big
4033 fb_info.pAttachments = ivs;
4034 fb_info.height = 1024;
4035 fb_info.width = 1024;
4036 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004038 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4039
4040 m_errorMonitor->VerifyFound();
4041 if (err == VK_SUCCESS) {
4042 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4043 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004044
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004045 {
4046 // Create an image with one mip level.
4047 VkImageObj image(m_device);
4048 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
4049 ASSERT_TRUE(image.initialized());
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004050
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004051 // Create view attachment with non-identity swizzle
4052 VkImageView view;
4053 VkImageViewCreateInfo ivci = {};
4054 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4055 ivci.image = image.handle();
4056 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4057 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4058 ivci.subresourceRange.layerCount = 1;
4059 ivci.subresourceRange.baseMipLevel = 0;
4060 ivci.subresourceRange.levelCount = 1;
4061 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4062 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4063 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4064 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4065 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4066 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4067 ASSERT_VK_SUCCESS(err);
4068
4069 fb_info.pAttachments = &view;
4070 fb_info.height = 100;
4071 fb_info.width = 100;
4072 fb_info.layers = 1;
4073
4074 m_errorMonitor->SetDesiredFailureMsg(
4075 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4076 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
4077 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4078
4079 m_errorMonitor->VerifyFound();
4080 if (err == VK_SUCCESS) {
4081 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4082 }
4083 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004084 }
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06004085
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004086 // reset attachment to color attachment
4087 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004088
4089 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004090 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004091 fb_info.height = 100;
4092 fb_info.layers = 1;
4093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004094 m_errorMonitor->SetDesiredFailureMsg(
4095 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004096 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4097 "Here are the respective dimensions for attachment");
4098
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004099 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4100
4101 m_errorMonitor->VerifyFound();
4102 if (err == VK_SUCCESS) {
4103 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4104 }
4105
4106 // Request fb that exceeds max height
4107 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004108 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004109 fb_info.layers = 1;
4110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004111 m_errorMonitor->SetDesiredFailureMsg(
4112 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004113 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4114 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004115 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4116
4117 m_errorMonitor->VerifyFound();
4118 if (err == VK_SUCCESS) {
4119 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4120 }
4121
4122 // Request fb that exceeds max layers
4123 fb_info.width = 100;
4124 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004125 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004127 m_errorMonitor->SetDesiredFailureMsg(
4128 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004129 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4130 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004131 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4132
4133 m_errorMonitor->VerifyFound();
4134 if (err == VK_SUCCESS) {
4135 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4136 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004137
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004138 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004139}
4140
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004141TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004142 TEST_DESCRIPTION(
4143 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4144 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004145
Tony Barbour1fa09702017-03-16 12:09:08 -06004146 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004147 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004148 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4149 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004150 m_errorMonitor->VerifyFound();
4151}
4152
4153TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004154 TEST_DESCRIPTION(
4155 "Run a simple draw calls to validate failure when Line Width dynamic "
4156 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004157
Tony Barbour1fa09702017-03-16 12:09:08 -06004158 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004159 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4161 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004162 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004163}
4164
4165TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004166 TEST_DESCRIPTION(
4167 "Run a simple draw calls to validate failure when Viewport dynamic "
4168 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004169
Tony Barbour1fa09702017-03-16 12:09:08 -06004170 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004171 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4173 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004174 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004175 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004176}
4177
4178TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004179 TEST_DESCRIPTION(
4180 "Run a simple draw calls to validate failure when Scissor dynamic "
4181 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004182
Tony Barbour1fa09702017-03-16 12:09:08 -06004183 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004184 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
Cortd713fe82016-07-27 09:51:27 -07004191TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Blend Constants "
4194 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004197 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic blend constants state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004201 m_errorMonitor->VerifyFound();
4202}
4203
4204TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4207 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004210 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004211 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004212 return;
4213 }
4214 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4216 "Dynamic depth bounds state not set for this command buffer");
4217 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004218 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004219}
4220
4221TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004222 TEST_DESCRIPTION(
4223 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4224 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004225
Tony Barbour1fa09702017-03-16 12:09:08 -06004226 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004227 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4229 "Dynamic stencil read mask state not set for this command buffer");
4230 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004231 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004232}
4233
4234TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004235 TEST_DESCRIPTION(
4236 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4237 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004238
Tony Barbour1fa09702017-03-16 12:09:08 -06004239 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004240 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "Dynamic stencil write mask state not set for this command buffer");
4243 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004244 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004245}
4246
4247TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004248 TEST_DESCRIPTION(
4249 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4250 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004251
Tony Barbour1fa09702017-03-16 12:09:08 -06004252 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004253 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4255 "Dynamic stencil reference state not set for this command buffer");
4256 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004257 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004258}
4259
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004260TEST_F(VkLayerTest, IndexBufferNotBound) {
4261 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004262
Tony Barbour1fa09702017-03-16 12:09:08 -06004263 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4265 "Index buffer object not bound to this command buffer when Indexed ");
4266 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004267 m_errorMonitor->VerifyFound();
4268}
4269
Karl Schultz6addd812016-02-02 17:17:23 -07004270TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4272 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4273 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004274
Tony Barbour1fa09702017-03-16 12:09:08 -06004275 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276 ASSERT_NO_FATAL_FAILURE(InitViewport());
4277 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4278
Karl Schultz6addd812016-02-02 17:17:23 -07004279 // We luck out b/c by default the framework creates CB w/ the
4280 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004281 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004282 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004283 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004284
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004285 // Bypass framework since it does the waits automatically
4286 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004287 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4289 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004290 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004291 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004292 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004293 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004294 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004295 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004296 submit_info.pSignalSemaphores = NULL;
4297
Chris Forbes40028e22016-06-13 09:59:34 +12004298 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004299 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004300 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004301
Karl Schultz6addd812016-02-02 17:17:23 -07004302 // Cause validation error by re-submitting cmd buffer that should only be
4303 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004304 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004305 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004306
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004307 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004308}
4309
Karl Schultz6addd812016-02-02 17:17:23 -07004310TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004311 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004312 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004313
Tony Barbour1fa09702017-03-16 12:09:08 -06004314 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004316
Karl Schultz6addd812016-02-02 17:17:23 -07004317 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4318 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004319 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004320 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004321 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004322
4323 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004324 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4325 ds_pool_ci.pNext = NULL;
4326 ds_pool_ci.flags = 0;
4327 ds_pool_ci.maxSets = 1;
4328 ds_pool_ci.poolSizeCount = 1;
4329 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004330
4331 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004332 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004333 ASSERT_VK_SUCCESS(err);
4334
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004335 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4336 dsl_binding_samp.binding = 0;
4337 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4338 dsl_binding_samp.descriptorCount = 1;
4339 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4340 dsl_binding_samp.pImmutableSamplers = NULL;
4341
4342 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4343 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4344 ds_layout_ci.pNext = NULL;
4345 ds_layout_ci.bindingCount = 1;
4346 ds_layout_ci.pBindings = &dsl_binding_samp;
4347
4348 VkDescriptorSetLayout ds_layout_samp;
4349 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4350 ASSERT_VK_SUCCESS(err);
4351
4352 // Try to allocate 2 sets when pool only has 1 set
4353 VkDescriptorSet descriptor_sets[2];
4354 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4355 VkDescriptorSetAllocateInfo alloc_info = {};
4356 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4357 alloc_info.descriptorSetCount = 2;
4358 alloc_info.descriptorPool = ds_pool;
4359 alloc_info.pSetLayouts = set_layouts;
4360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4361 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4362 m_errorMonitor->VerifyFound();
4363
4364 alloc_info.descriptorSetCount = 1;
4365 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004366 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004367 dsl_binding.binding = 0;
4368 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4369 dsl_binding.descriptorCount = 1;
4370 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4371 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004372
Karl Schultz6addd812016-02-02 17:17:23 -07004373 ds_layout_ci.bindingCount = 1;
4374 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004375
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004376 VkDescriptorSetLayout ds_layout_ub;
4377 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004378 ASSERT_VK_SUCCESS(err);
4379
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004380 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004381 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004382 alloc_info.pSetLayouts = &ds_layout_ub;
4383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4384 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004385
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004386 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004387
Karl Schultz2825ab92016-12-02 08:23:14 -07004388 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004389 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004390 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004391}
4392
Karl Schultz6addd812016-02-02 17:17:23 -07004393TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4394 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004397
Tony Barbour1fa09702017-03-16 12:09:08 -06004398 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004400
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004401 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004402 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4403 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004404
4405 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004406 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4407 ds_pool_ci.pNext = NULL;
4408 ds_pool_ci.maxSets = 1;
4409 ds_pool_ci.poolSizeCount = 1;
4410 ds_pool_ci.flags = 0;
4411 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4412 // app can only call vkResetDescriptorPool on this pool.;
4413 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004414
4415 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004416 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004417 ASSERT_VK_SUCCESS(err);
4418
4419 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004420 dsl_binding.binding = 0;
4421 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4422 dsl_binding.descriptorCount = 1;
4423 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4424 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004425
4426 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004427 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4428 ds_layout_ci.pNext = NULL;
4429 ds_layout_ci.bindingCount = 1;
4430 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004431
4432 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004433 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004434 ASSERT_VK_SUCCESS(err);
4435
4436 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004437 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004438 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004439 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004440 alloc_info.descriptorPool = ds_pool;
4441 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004442 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004443 ASSERT_VK_SUCCESS(err);
4444
4445 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004446 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004447
Chia-I Wuf7458c52015-10-26 21:10:41 +08004448 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4449 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004450}
4451
Karl Schultz6addd812016-02-02 17:17:23 -07004452TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004453 // Attempt to clear Descriptor Pool with bad object.
4454 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004455
Tony Barbour1fa09702017-03-16 12:09:08 -06004456 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004458 uint64_t fake_pool_handle = 0xbaad6001;
4459 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4460 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004461 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004462}
4463
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004464TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004465 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4466 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004467 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004468 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004469
4470 uint64_t fake_set_handle = 0xbaad6001;
4471 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004472 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004474
Tony Barbour1fa09702017-03-16 12:09:08 -06004475 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004476
4477 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4478 layout_bindings[0].binding = 0;
4479 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4480 layout_bindings[0].descriptorCount = 1;
4481 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4482 layout_bindings[0].pImmutableSamplers = NULL;
4483
4484 VkDescriptorSetLayout descriptor_set_layout;
4485 VkDescriptorSetLayoutCreateInfo dslci = {};
4486 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4487 dslci.pNext = NULL;
4488 dslci.bindingCount = 1;
4489 dslci.pBindings = layout_bindings;
4490 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004491 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004492
4493 VkPipelineLayout pipeline_layout;
4494 VkPipelineLayoutCreateInfo plci = {};
4495 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4496 plci.pNext = NULL;
4497 plci.setLayoutCount = 1;
4498 plci.pSetLayouts = &descriptor_set_layout;
4499 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004500 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004501
Tony Barbour552f6c02016-12-21 14:34:07 -07004502 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004503 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4504 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004505 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004506 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004507 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4508 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004509}
4510
Karl Schultz6addd812016-02-02 17:17:23 -07004511TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004512 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4513 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004514 uint64_t fake_layout_handle = 0xbaad6001;
4515 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004517 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004518 VkPipelineLayout pipeline_layout;
4519 VkPipelineLayoutCreateInfo plci = {};
4520 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4521 plci.pNext = NULL;
4522 plci.setLayoutCount = 1;
4523 plci.pSetLayouts = &bad_layout;
4524 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4525
4526 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004527}
4528
Mark Muellerd4914412016-06-13 17:52:06 -06004529TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004530 TEST_DESCRIPTION(
4531 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4532 "1) A uniform buffer update must have a valid buffer index."
4533 "2) When using an array of descriptors in a single WriteDescriptor,"
4534 " the descriptor types and stageflags must all be the same."
4535 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004536
Mike Weiblena6666382017-01-05 15:16:11 -07004537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004538
Tony Barbour1fa09702017-03-16 12:09:08 -06004539 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004540 VkDescriptorPoolSize ds_type_count[4] = {};
4541 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4542 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004543 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004544 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004545 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004546 ds_type_count[2].descriptorCount = 1;
4547 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4548 ds_type_count[3].descriptorCount = 1;
4549
4550 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4551 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4552 ds_pool_ci.maxSets = 1;
4553 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4554 ds_pool_ci.pPoolSizes = ds_type_count;
4555
4556 VkDescriptorPool ds_pool;
4557 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4558 ASSERT_VK_SUCCESS(err);
4559
Mark Muellerb9896722016-06-16 09:54:29 -06004560 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004561 layout_binding[0].binding = 0;
4562 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4563 layout_binding[0].descriptorCount = 1;
4564 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4565 layout_binding[0].pImmutableSamplers = NULL;
4566
4567 layout_binding[1].binding = 1;
4568 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4569 layout_binding[1].descriptorCount = 1;
4570 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4571 layout_binding[1].pImmutableSamplers = NULL;
4572
4573 VkSamplerCreateInfo sampler_ci = {};
4574 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4575 sampler_ci.pNext = NULL;
4576 sampler_ci.magFilter = VK_FILTER_NEAREST;
4577 sampler_ci.minFilter = VK_FILTER_NEAREST;
4578 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4579 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4580 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4581 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4582 sampler_ci.mipLodBias = 1.0;
4583 sampler_ci.anisotropyEnable = VK_FALSE;
4584 sampler_ci.maxAnisotropy = 1;
4585 sampler_ci.compareEnable = VK_FALSE;
4586 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4587 sampler_ci.minLod = 1.0;
4588 sampler_ci.maxLod = 1.0;
4589 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4590 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4591 VkSampler sampler;
4592
4593 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4594 ASSERT_VK_SUCCESS(err);
4595
4596 layout_binding[2].binding = 2;
4597 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4598 layout_binding[2].descriptorCount = 1;
4599 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4600 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4601
Mark Muellerd4914412016-06-13 17:52:06 -06004602 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4603 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4604 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4605 ds_layout_ci.pBindings = layout_binding;
4606 VkDescriptorSetLayout ds_layout;
4607 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4608 ASSERT_VK_SUCCESS(err);
4609
4610 VkDescriptorSetAllocateInfo alloc_info = {};
4611 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4612 alloc_info.descriptorSetCount = 1;
4613 alloc_info.descriptorPool = ds_pool;
4614 alloc_info.pSetLayouts = &ds_layout;
4615 VkDescriptorSet descriptorSet;
4616 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4617 ASSERT_VK_SUCCESS(err);
4618
4619 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4620 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4621 pipeline_layout_ci.pNext = NULL;
4622 pipeline_layout_ci.setLayoutCount = 1;
4623 pipeline_layout_ci.pSetLayouts = &ds_layout;
4624
4625 VkPipelineLayout pipeline_layout;
4626 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4627 ASSERT_VK_SUCCESS(err);
4628
Mark Mueller5c838ce2016-06-16 09:54:29 -06004629 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004630 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4631 descriptor_write.dstSet = descriptorSet;
4632 descriptor_write.dstBinding = 0;
4633 descriptor_write.descriptorCount = 1;
4634 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4635
Mark Mueller5c838ce2016-06-16 09:54:29 -06004636 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004637 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4638 m_errorMonitor->VerifyFound();
4639
4640 // Create a buffer to update the descriptor with
4641 uint32_t qfi = 0;
4642 VkBufferCreateInfo buffCI = {};
4643 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4644 buffCI.size = 1024;
4645 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4646 buffCI.queueFamilyIndexCount = 1;
4647 buffCI.pQueueFamilyIndices = &qfi;
4648
4649 VkBuffer dyub;
4650 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4651 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004652
Tony Barboure132c5f2016-12-12 11:50:20 -07004653 VkDeviceMemory mem;
4654 VkMemoryRequirements mem_reqs;
4655 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4656
4657 VkMemoryAllocateInfo mem_alloc_info = {};
4658 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4659 mem_alloc_info.allocationSize = mem_reqs.size;
4660 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4661 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4662 ASSERT_VK_SUCCESS(err);
4663
4664 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4665 ASSERT_VK_SUCCESS(err);
4666
4667 VkDescriptorBufferInfo buffInfo[2] = {};
4668 buffInfo[0].buffer = dyub;
4669 buffInfo[0].offset = 0;
4670 buffInfo[0].range = 1024;
4671 buffInfo[1].buffer = dyub;
4672 buffInfo[1].offset = 0;
4673 buffInfo[1].range = 1024;
4674 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004675 descriptor_write.descriptorCount = 2;
4676
Mark Mueller5c838ce2016-06-16 09:54:29 -06004677 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004679 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4680 m_errorMonitor->VerifyFound();
4681
Mark Mueller5c838ce2016-06-16 09:54:29 -06004682 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4683 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004684 descriptor_write.dstBinding = 1;
4685 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004686
Mark Mueller5c838ce2016-06-16 09:54:29 -06004687 // Make pImageInfo index non-null to avoid complaints of it missing
4688 VkDescriptorImageInfo imageInfo = {};
4689 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4690 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004692 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4693 m_errorMonitor->VerifyFound();
4694
Mark Muellerd4914412016-06-13 17:52:06 -06004695 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004696 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004697 vkDestroySampler(m_device->device(), sampler, NULL);
4698 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4699 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4700 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4701}
4702
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004703TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004704 TEST_DESCRIPTION(
4705 "Attempt to draw with a command buffer that is invalid "
4706 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004707 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004709 VkBuffer buffer;
4710 VkDeviceMemory mem;
4711 VkMemoryRequirements mem_reqs;
4712
4713 VkBufferCreateInfo buf_info = {};
4714 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004715 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004716 buf_info.size = 256;
4717 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4718 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4719 ASSERT_VK_SUCCESS(err);
4720
4721 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4722
4723 VkMemoryAllocateInfo alloc_info = {};
4724 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4725 alloc_info.allocationSize = 256;
4726 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004727 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004728 if (!pass) {
4729 vkDestroyBuffer(m_device->device(), buffer, NULL);
4730 return;
4731 }
4732 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4733 ASSERT_VK_SUCCESS(err);
4734
4735 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4736 ASSERT_VK_SUCCESS(err);
4737
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004738 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004739 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004740 m_commandBuffer->EndCommandBuffer();
4741
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004743 // Destroy buffer dependency prior to submit to cause ERROR
4744 vkDestroyBuffer(m_device->device(), buffer, NULL);
4745
4746 VkSubmitInfo submit_info = {};
4747 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4748 submit_info.commandBufferCount = 1;
4749 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4750 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4751
4752 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004753 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004754 vkFreeMemory(m_device->handle(), mem, NULL);
4755}
4756
Tobin Ehlisea413442016-09-28 10:23:59 -06004757TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4758 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4759
Tony Barbour1fa09702017-03-16 12:09:08 -06004760 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004761 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4762
4763 VkDescriptorPoolSize ds_type_count;
4764 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4765 ds_type_count.descriptorCount = 1;
4766
4767 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4768 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4769 ds_pool_ci.maxSets = 1;
4770 ds_pool_ci.poolSizeCount = 1;
4771 ds_pool_ci.pPoolSizes = &ds_type_count;
4772
4773 VkDescriptorPool ds_pool;
4774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4775 ASSERT_VK_SUCCESS(err);
4776
4777 VkDescriptorSetLayoutBinding layout_binding;
4778 layout_binding.binding = 0;
4779 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4780 layout_binding.descriptorCount = 1;
4781 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4782 layout_binding.pImmutableSamplers = NULL;
4783
4784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4786 ds_layout_ci.bindingCount = 1;
4787 ds_layout_ci.pBindings = &layout_binding;
4788 VkDescriptorSetLayout ds_layout;
4789 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4790 ASSERT_VK_SUCCESS(err);
4791
4792 VkDescriptorSetAllocateInfo alloc_info = {};
4793 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4794 alloc_info.descriptorSetCount = 1;
4795 alloc_info.descriptorPool = ds_pool;
4796 alloc_info.pSetLayouts = &ds_layout;
4797 VkDescriptorSet descriptor_set;
4798 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4799 ASSERT_VK_SUCCESS(err);
4800
4801 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4802 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4803 pipeline_layout_ci.pNext = NULL;
4804 pipeline_layout_ci.setLayoutCount = 1;
4805 pipeline_layout_ci.pSetLayouts = &ds_layout;
4806
4807 VkPipelineLayout pipeline_layout;
4808 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBuffer buffer;
4812 uint32_t queue_family_index = 0;
4813 VkBufferCreateInfo buffer_create_info = {};
4814 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4815 buffer_create_info.size = 1024;
4816 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4817 buffer_create_info.queueFamilyIndexCount = 1;
4818 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4819
4820 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4821 ASSERT_VK_SUCCESS(err);
4822
4823 VkMemoryRequirements memory_reqs;
4824 VkDeviceMemory buffer_memory;
4825
4826 VkMemoryAllocateInfo memory_info = {};
4827 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4828 memory_info.allocationSize = 0;
4829 memory_info.memoryTypeIndex = 0;
4830
4831 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4832 memory_info.allocationSize = memory_reqs.size;
4833 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4834 ASSERT_TRUE(pass);
4835
4836 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4837 ASSERT_VK_SUCCESS(err);
4838 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4839 ASSERT_VK_SUCCESS(err);
4840
4841 VkBufferView view;
4842 VkBufferViewCreateInfo bvci = {};
4843 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4844 bvci.buffer = buffer;
4845 bvci.format = VK_FORMAT_R8_UNORM;
4846 bvci.range = VK_WHOLE_SIZE;
4847
4848 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4849 ASSERT_VK_SUCCESS(err);
4850
4851 VkWriteDescriptorSet descriptor_write = {};
4852 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4853 descriptor_write.dstSet = descriptor_set;
4854 descriptor_write.dstBinding = 0;
4855 descriptor_write.descriptorCount = 1;
4856 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4857 descriptor_write.pTexelBufferView = &view;
4858
4859 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4860
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004861 char const *vsSource =
4862 "#version 450\n"
4863 "\n"
4864 "out gl_PerVertex { \n"
4865 " vec4 gl_Position;\n"
4866 "};\n"
4867 "void main(){\n"
4868 " gl_Position = vec4(1);\n"
4869 "}\n";
4870 char const *fsSource =
4871 "#version 450\n"
4872 "\n"
4873 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4874 "layout(location=0) out vec4 x;\n"
4875 "void main(){\n"
4876 " x = imageLoad(s, 0);\n"
4877 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004878 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4879 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4880 VkPipelineObj pipe(m_device);
4881 pipe.AddShader(&vs);
4882 pipe.AddShader(&fs);
4883 pipe.AddColorAttachment();
4884 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4885
Tobin Ehlisea413442016-09-28 10:23:59 -06004886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4887
Tony Barbour552f6c02016-12-21 14:34:07 -07004888 m_commandBuffer->BeginCommandBuffer();
4889 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4890
Tobin Ehlisea413442016-09-28 10:23:59 -06004891 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4892 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4893 VkRect2D scissor = {{0, 0}, {16, 16}};
4894 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4895 // Bind pipeline to cmd buffer
4896 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4897 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4898 &descriptor_set, 0, nullptr);
4899 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004900 m_commandBuffer->EndRenderPass();
4901 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004902
4903 // Delete BufferView in order to invalidate cmd buffer
4904 vkDestroyBufferView(m_device->device(), view, NULL);
4905 // Now attempt submit of cmd buffer
4906 VkSubmitInfo submit_info = {};
4907 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4908 submit_info.commandBufferCount = 1;
4909 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4910 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4911 m_errorMonitor->VerifyFound();
4912
4913 // Clean-up
4914 vkDestroyBuffer(m_device->device(), buffer, NULL);
4915 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4916 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4917 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4918 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4919}
4920
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004921TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004922 TEST_DESCRIPTION(
4923 "Attempt to draw with a command buffer that is invalid "
4924 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004925 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004926
4927 VkImage image;
4928 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4929 VkImageCreateInfo image_create_info = {};
4930 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4931 image_create_info.pNext = NULL;
4932 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4933 image_create_info.format = tex_format;
4934 image_create_info.extent.width = 32;
4935 image_create_info.extent.height = 32;
4936 image_create_info.extent.depth = 1;
4937 image_create_info.mipLevels = 1;
4938 image_create_info.arrayLayers = 1;
4939 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4940 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004941 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004942 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004943 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004944 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004945 // Have to bind memory to image before recording cmd in cmd buffer using it
4946 VkMemoryRequirements mem_reqs;
4947 VkDeviceMemory image_mem;
4948 bool pass;
4949 VkMemoryAllocateInfo mem_alloc = {};
4950 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4951 mem_alloc.pNext = NULL;
4952 mem_alloc.memoryTypeIndex = 0;
4953 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4954 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004955 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004956 ASSERT_TRUE(pass);
4957 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4958 ASSERT_VK_SUCCESS(err);
4959 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4960 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004961
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004962 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004963 VkClearColorValue ccv;
4964 ccv.float32[0] = 1.0f;
4965 ccv.float32[1] = 1.0f;
4966 ccv.float32[2] = 1.0f;
4967 ccv.float32[3] = 1.0f;
4968 VkImageSubresourceRange isr = {};
4969 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004970 isr.baseArrayLayer = 0;
4971 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004972 isr.layerCount = 1;
4973 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004974 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004975 m_commandBuffer->EndCommandBuffer();
4976
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004978 // Destroy image dependency prior to submit to cause ERROR
4979 vkDestroyImage(m_device->device(), image, NULL);
4980
4981 VkSubmitInfo submit_info = {};
4982 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4983 submit_info.commandBufferCount = 1;
4984 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4985 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4986
4987 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004988 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004989}
4990
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004991TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004992 TEST_DESCRIPTION(
4993 "Attempt to draw with a command buffer that is invalid "
4994 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004995 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004996 VkFormatProperties format_properties;
4997 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004998 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4999 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005000 return;
5001 }
5002
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005003 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5004
5005 VkImageCreateInfo image_ci = {};
5006 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5007 image_ci.pNext = NULL;
5008 image_ci.imageType = VK_IMAGE_TYPE_2D;
5009 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5010 image_ci.extent.width = 32;
5011 image_ci.extent.height = 32;
5012 image_ci.extent.depth = 1;
5013 image_ci.mipLevels = 1;
5014 image_ci.arrayLayers = 1;
5015 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5016 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5019 image_ci.flags = 0;
5020 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005021 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005022
5023 VkMemoryRequirements memory_reqs;
5024 VkDeviceMemory image_memory;
5025 bool pass;
5026 VkMemoryAllocateInfo memory_info = {};
5027 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5028 memory_info.pNext = NULL;
5029 memory_info.allocationSize = 0;
5030 memory_info.memoryTypeIndex = 0;
5031 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5032 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005033 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005034 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005035 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005036 ASSERT_VK_SUCCESS(err);
5037 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5038 ASSERT_VK_SUCCESS(err);
5039
5040 VkImageViewCreateInfo ivci = {
5041 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5042 nullptr,
5043 0,
5044 image,
5045 VK_IMAGE_VIEW_TYPE_2D,
5046 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005047 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005048 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5049 };
5050 VkImageView view;
5051 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5052 ASSERT_VK_SUCCESS(err);
5053
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005054 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005055 VkFramebuffer fb;
5056 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5057 ASSERT_VK_SUCCESS(err);
5058
5059 // Just use default renderpass with our framebuffer
5060 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005061 m_renderPassBeginInfo.renderArea.extent.width = 32;
5062 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005063 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005064 m_commandBuffer->BeginCommandBuffer();
5065 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5066 m_commandBuffer->EndRenderPass();
5067 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005068 // Destroy image attached to framebuffer to invalidate cmd buffer
5069 vkDestroyImage(m_device->device(), image, NULL);
5070 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005072 QueueCommandBuffer(false);
5073 m_errorMonitor->VerifyFound();
5074
5075 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5076 vkDestroyImageView(m_device->device(), view, nullptr);
5077 vkFreeMemory(m_device->device(), image_memory, nullptr);
5078}
5079
Tobin Ehlisb329f992016-10-12 13:20:29 -06005080TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5081 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005082 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005083 VkFormatProperties format_properties;
5084 VkResult err = VK_SUCCESS;
5085 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5086
Tobin Ehlisb329f992016-10-12 13:20:29 -06005087 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5088
5089 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005090 image.Init(256, 256, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005091 ASSERT_TRUE(image.initialized());
5092 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5093
5094 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5095 VkFramebuffer fb;
5096 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5097 ASSERT_VK_SUCCESS(err);
5098
5099 // Just use default renderpass with our framebuffer
5100 m_renderPassBeginInfo.framebuffer = fb;
5101 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005102 m_commandBuffer->BeginCommandBuffer();
5103 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5104 m_commandBuffer->EndRenderPass();
5105 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005106 // Submit cmd buffer to put it in-flight
5107 VkSubmitInfo submit_info = {};
5108 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5109 submit_info.commandBufferCount = 1;
5110 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5111 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5112 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005114 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5115 m_errorMonitor->VerifyFound();
5116 // Wait for queue to complete so we can safely destroy everything
5117 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005118 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5119 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005120 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5121}
5122
Tobin Ehlis88becd72016-09-21 14:33:41 -06005123TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5124 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005125 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005126 VkFormatProperties format_properties;
5127 VkResult err = VK_SUCCESS;
5128 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005129
Tobin Ehlis88becd72016-09-21 14:33:41 -06005130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5131
5132 VkImageCreateInfo image_ci = {};
5133 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5134 image_ci.pNext = NULL;
5135 image_ci.imageType = VK_IMAGE_TYPE_2D;
5136 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5137 image_ci.extent.width = 256;
5138 image_ci.extent.height = 256;
5139 image_ci.extent.depth = 1;
5140 image_ci.mipLevels = 1;
5141 image_ci.arrayLayers = 1;
5142 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5143 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005144 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005145 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5146 image_ci.flags = 0;
5147 VkImage image;
5148 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5149
5150 VkMemoryRequirements memory_reqs;
5151 VkDeviceMemory image_memory;
5152 bool pass;
5153 VkMemoryAllocateInfo memory_info = {};
5154 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5155 memory_info.pNext = NULL;
5156 memory_info.allocationSize = 0;
5157 memory_info.memoryTypeIndex = 0;
5158 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5159 memory_info.allocationSize = memory_reqs.size;
5160 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5161 ASSERT_TRUE(pass);
5162 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5163 ASSERT_VK_SUCCESS(err);
5164 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5165 ASSERT_VK_SUCCESS(err);
5166
5167 VkImageViewCreateInfo ivci = {
5168 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5169 nullptr,
5170 0,
5171 image,
5172 VK_IMAGE_VIEW_TYPE_2D,
5173 VK_FORMAT_B8G8R8A8_UNORM,
5174 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5175 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5176 };
5177 VkImageView view;
5178 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5179 ASSERT_VK_SUCCESS(err);
5180
5181 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5182 VkFramebuffer fb;
5183 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5184 ASSERT_VK_SUCCESS(err);
5185
5186 // Just use default renderpass with our framebuffer
5187 m_renderPassBeginInfo.framebuffer = fb;
5188 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005189 m_commandBuffer->BeginCommandBuffer();
5190 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5191 m_commandBuffer->EndRenderPass();
5192 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005193 // Submit cmd buffer to put it (and attached imageView) in-flight
5194 VkSubmitInfo submit_info = {};
5195 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5196 submit_info.commandBufferCount = 1;
5197 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5198 // Submit cmd buffer to put framebuffer and children in-flight
5199 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5200 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005202 vkDestroyImage(m_device->device(), image, NULL);
5203 m_errorMonitor->VerifyFound();
5204 // Wait for queue to complete so we can safely destroy image and other objects
5205 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005206 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5207 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005208 vkDestroyImage(m_device->device(), image, NULL);
5209 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5210 vkDestroyImageView(m_device->device(), view, nullptr);
5211 vkFreeMemory(m_device->device(), image_memory, nullptr);
5212}
5213
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005214TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5215 TEST_DESCRIPTION("Delete in-use renderPass.");
5216
Tony Barbour1fa09702017-03-16 12:09:08 -06005217 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005218 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5219
5220 // Create simple renderpass
5221 VkAttachmentReference attach = {};
5222 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5223 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005224 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005225 subpass.pColorAttachments = &attach;
5226 VkRenderPassCreateInfo rpci = {};
5227 rpci.subpassCount = 1;
5228 rpci.pSubpasses = &subpass;
5229 rpci.attachmentCount = 1;
5230 VkAttachmentDescription attach_desc = {};
5231 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5232 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5233 rpci.pAttachments = &attach_desc;
5234 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5235 VkRenderPass rp;
5236 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5237 ASSERT_VK_SUCCESS(err);
5238
5239 // Create a pipeline that uses the given renderpass
5240 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5241 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5242
5243 VkPipelineLayout pipeline_layout;
5244 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5245 ASSERT_VK_SUCCESS(err);
5246
5247 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5248 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5249 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005250 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005251 vp_state_ci.pViewports = &vp;
5252 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005253 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005254 vp_state_ci.pScissors = &scissors;
5255
5256 VkPipelineShaderStageCreateInfo shaderStages[2];
5257 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5258
5259 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005260 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005261 // but add it to be able to run on more devices
5262 shaderStages[0] = vs.GetStageCreateInfo();
5263 shaderStages[1] = fs.GetStageCreateInfo();
5264
5265 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5266 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5267
5268 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5269 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5270 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5271
5272 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5273 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5274 rs_ci.rasterizerDiscardEnable = true;
5275 rs_ci.lineWidth = 1.0f;
5276
5277 VkPipelineColorBlendAttachmentState att = {};
5278 att.blendEnable = VK_FALSE;
5279 att.colorWriteMask = 0xf;
5280
5281 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5282 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5283 cb_ci.attachmentCount = 1;
5284 cb_ci.pAttachments = &att;
5285
5286 VkGraphicsPipelineCreateInfo gp_ci = {};
5287 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5288 gp_ci.stageCount = 2;
5289 gp_ci.pStages = shaderStages;
5290 gp_ci.pVertexInputState = &vi_ci;
5291 gp_ci.pInputAssemblyState = &ia_ci;
5292 gp_ci.pViewportState = &vp_state_ci;
5293 gp_ci.pRasterizationState = &rs_ci;
5294 gp_ci.pColorBlendState = &cb_ci;
5295 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5296 gp_ci.layout = pipeline_layout;
5297 gp_ci.renderPass = rp;
5298
5299 VkPipelineCacheCreateInfo pc_ci = {};
5300 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5301
Dave Houlton756e6742017-03-23 14:33:22 -06005302 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005303 VkPipeline pipeline;
5304 VkPipelineCache pipe_cache;
5305 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5306 ASSERT_VK_SUCCESS(err);
5307
5308 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5309 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005310
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005311 // Bind pipeline to cmd buffer, will also bind renderpass
5312 m_commandBuffer->BeginCommandBuffer();
5313 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5314 m_commandBuffer->EndCommandBuffer();
5315
5316 VkSubmitInfo submit_info = {};
5317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5318 submit_info.commandBufferCount = 1;
5319 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5320 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005321 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005322
5323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5324 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5325 m_errorMonitor->VerifyFound();
5326
5327 // Wait for queue to complete so we can safely destroy everything
5328 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005329 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5330 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005331 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5332 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5333 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5334 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5335}
5336
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005337TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005338 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005339 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340
5341 VkImage image;
5342 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5343 VkImageCreateInfo image_create_info = {};
5344 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5345 image_create_info.pNext = NULL;
5346 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5347 image_create_info.format = tex_format;
5348 image_create_info.extent.width = 32;
5349 image_create_info.extent.height = 32;
5350 image_create_info.extent.depth = 1;
5351 image_create_info.mipLevels = 1;
5352 image_create_info.arrayLayers = 1;
5353 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5354 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005355 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005356 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005357 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005358 ASSERT_VK_SUCCESS(err);
5359 // Have to bind memory to image before recording cmd in cmd buffer using it
5360 VkMemoryRequirements mem_reqs;
5361 VkDeviceMemory image_mem;
5362 bool pass;
5363 VkMemoryAllocateInfo mem_alloc = {};
5364 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5365 mem_alloc.pNext = NULL;
5366 mem_alloc.memoryTypeIndex = 0;
5367 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5368 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005370 ASSERT_TRUE(pass);
5371 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5372 ASSERT_VK_SUCCESS(err);
5373
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005374 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005376 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005377
5378 m_commandBuffer->BeginCommandBuffer();
5379 VkClearColorValue ccv;
5380 ccv.float32[0] = 1.0f;
5381 ccv.float32[1] = 1.0f;
5382 ccv.float32[2] = 1.0f;
5383 ccv.float32[3] = 1.0f;
5384 VkImageSubresourceRange isr = {};
5385 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5386 isr.baseArrayLayer = 0;
5387 isr.baseMipLevel = 0;
5388 isr.layerCount = 1;
5389 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005390 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005391 m_commandBuffer->EndCommandBuffer();
5392
5393 m_errorMonitor->VerifyFound();
5394 vkDestroyImage(m_device->device(), image, NULL);
5395 vkFreeMemory(m_device->device(), image_mem, nullptr);
5396}
5397
5398TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005399 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005400 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005401
5402 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06005403 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005404 VK_IMAGE_TILING_OPTIMAL, 0);
5405 ASSERT_TRUE(image.initialized());
5406
5407 VkBuffer buffer;
5408 VkDeviceMemory mem;
5409 VkMemoryRequirements mem_reqs;
5410
5411 VkBufferCreateInfo buf_info = {};
5412 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005413 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005414 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005415 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5416 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5417 ASSERT_VK_SUCCESS(err);
5418
5419 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5420
5421 VkMemoryAllocateInfo alloc_info = {};
5422 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005423 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005424 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005425 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005426 if (!pass) {
5427 vkDestroyBuffer(m_device->device(), buffer, NULL);
5428 return;
5429 }
5430 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5431 ASSERT_VK_SUCCESS(err);
5432
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005433 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005435 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005436 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005437 region.bufferRowLength = 16;
5438 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005439 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5440
5441 region.imageSubresource.layerCount = 1;
5442 region.imageExtent.height = 4;
5443 region.imageExtent.width = 4;
5444 region.imageExtent.depth = 1;
5445 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005446 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5447 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005448 m_commandBuffer->EndCommandBuffer();
5449
5450 m_errorMonitor->VerifyFound();
5451
5452 vkDestroyBuffer(m_device->device(), buffer, NULL);
5453 vkFreeMemory(m_device->handle(), mem, NULL);
5454}
5455
Tobin Ehlis85940f52016-07-07 16:57:21 -06005456TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005457 TEST_DESCRIPTION(
5458 "Attempt to draw with a command buffer that is invalid "
5459 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005460 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005461
5462 VkEvent event;
5463 VkEventCreateInfo evci = {};
5464 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5465 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5466 ASSERT_VK_SUCCESS(result);
5467
5468 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005469 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005470 m_commandBuffer->EndCommandBuffer();
5471
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005473 // Destroy event dependency prior to submit to cause ERROR
5474 vkDestroyEvent(m_device->device(), event, NULL);
5475
5476 VkSubmitInfo submit_info = {};
5477 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5478 submit_info.commandBufferCount = 1;
5479 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5480 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5481
5482 m_errorMonitor->VerifyFound();
5483}
5484
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005485TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005486 TEST_DESCRIPTION(
5487 "Attempt to draw with a command buffer that is invalid "
5488 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005489 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005490
5491 VkQueryPool query_pool;
5492 VkQueryPoolCreateInfo qpci{};
5493 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5494 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5495 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005496 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005497 ASSERT_VK_SUCCESS(result);
5498
5499 m_commandBuffer->BeginCommandBuffer();
5500 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5501 m_commandBuffer->EndCommandBuffer();
5502
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005504 // Destroy query pool dependency prior to submit to cause ERROR
5505 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5506
5507 VkSubmitInfo submit_info = {};
5508 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5509 submit_info.commandBufferCount = 1;
5510 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5511 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5512
5513 m_errorMonitor->VerifyFound();
5514}
5515
Tobin Ehlis24130d92016-07-08 15:50:53 -06005516TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005517 TEST_DESCRIPTION(
5518 "Attempt to draw with a command buffer that is invalid "
5519 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005520 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005521 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5522
5523 VkResult err;
5524
5525 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5526 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5527
5528 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005529 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005530 ASSERT_VK_SUCCESS(err);
5531
5532 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5533 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5534 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005535 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005536 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005537 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005538 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005539 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005540
5541 VkPipelineShaderStageCreateInfo shaderStages[2];
5542 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5543
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005544 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005545 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005546 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005547 shaderStages[0] = vs.GetStageCreateInfo();
5548 shaderStages[1] = fs.GetStageCreateInfo();
5549
5550 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5551 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5552
5553 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5554 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5555 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5556
5557 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5558 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005559 rs_ci.rasterizerDiscardEnable = true;
5560 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005561
5562 VkPipelineColorBlendAttachmentState att = {};
5563 att.blendEnable = VK_FALSE;
5564 att.colorWriteMask = 0xf;
5565
5566 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5567 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5568 cb_ci.attachmentCount = 1;
5569 cb_ci.pAttachments = &att;
5570
5571 VkGraphicsPipelineCreateInfo gp_ci = {};
5572 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5573 gp_ci.stageCount = 2;
5574 gp_ci.pStages = shaderStages;
5575 gp_ci.pVertexInputState = &vi_ci;
5576 gp_ci.pInputAssemblyState = &ia_ci;
5577 gp_ci.pViewportState = &vp_state_ci;
5578 gp_ci.pRasterizationState = &rs_ci;
5579 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005580 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5581 gp_ci.layout = pipeline_layout;
5582 gp_ci.renderPass = renderPass();
5583
5584 VkPipelineCacheCreateInfo pc_ci = {};
5585 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5586
5587 VkPipeline pipeline;
5588 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005589 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005590 ASSERT_VK_SUCCESS(err);
5591
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005592 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005593 ASSERT_VK_SUCCESS(err);
5594
5595 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005596 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005597 m_commandBuffer->EndCommandBuffer();
5598 // Now destroy pipeline in order to cause error when submitting
5599 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5600
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005602
5603 VkSubmitInfo submit_info = {};
5604 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5605 submit_info.commandBufferCount = 1;
5606 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5607 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5608
5609 m_errorMonitor->VerifyFound();
5610 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5611 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5612}
5613
Tobin Ehlis31289162016-08-17 14:57:58 -06005614TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005615 TEST_DESCRIPTION(
5616 "Attempt to draw with a command buffer that is invalid "
5617 "due to a bound descriptor set with a buffer dependency "
5618 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005619 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005620 ASSERT_NO_FATAL_FAILURE(InitViewport());
5621 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5622
5623 VkDescriptorPoolSize ds_type_count = {};
5624 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5625 ds_type_count.descriptorCount = 1;
5626
5627 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5628 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5629 ds_pool_ci.pNext = NULL;
5630 ds_pool_ci.maxSets = 1;
5631 ds_pool_ci.poolSizeCount = 1;
5632 ds_pool_ci.pPoolSizes = &ds_type_count;
5633
5634 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005635 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005636 ASSERT_VK_SUCCESS(err);
5637
5638 VkDescriptorSetLayoutBinding dsl_binding = {};
5639 dsl_binding.binding = 0;
5640 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5641 dsl_binding.descriptorCount = 1;
5642 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5643 dsl_binding.pImmutableSamplers = NULL;
5644
5645 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5646 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5647 ds_layout_ci.pNext = NULL;
5648 ds_layout_ci.bindingCount = 1;
5649 ds_layout_ci.pBindings = &dsl_binding;
5650 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005651 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005652 ASSERT_VK_SUCCESS(err);
5653
5654 VkDescriptorSet descriptorSet;
5655 VkDescriptorSetAllocateInfo alloc_info = {};
5656 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5657 alloc_info.descriptorSetCount = 1;
5658 alloc_info.descriptorPool = ds_pool;
5659 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005660 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005661 ASSERT_VK_SUCCESS(err);
5662
5663 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5664 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5665 pipeline_layout_ci.pNext = NULL;
5666 pipeline_layout_ci.setLayoutCount = 1;
5667 pipeline_layout_ci.pSetLayouts = &ds_layout;
5668
5669 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005670 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005671 ASSERT_VK_SUCCESS(err);
5672
5673 // Create a buffer to update the descriptor with
5674 uint32_t qfi = 0;
5675 VkBufferCreateInfo buffCI = {};
5676 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5677 buffCI.size = 1024;
5678 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5679 buffCI.queueFamilyIndexCount = 1;
5680 buffCI.pQueueFamilyIndices = &qfi;
5681
5682 VkBuffer buffer;
5683 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5684 ASSERT_VK_SUCCESS(err);
5685 // Allocate memory and bind to buffer so we can make it to the appropriate
5686 // error
5687 VkMemoryAllocateInfo mem_alloc = {};
5688 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5689 mem_alloc.pNext = NULL;
5690 mem_alloc.allocationSize = 1024;
5691 mem_alloc.memoryTypeIndex = 0;
5692
5693 VkMemoryRequirements memReqs;
5694 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005695 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005696 if (!pass) {
5697 vkDestroyBuffer(m_device->device(), buffer, NULL);
5698 return;
5699 }
5700
5701 VkDeviceMemory mem;
5702 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5703 ASSERT_VK_SUCCESS(err);
5704 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5705 ASSERT_VK_SUCCESS(err);
5706 // Correctly update descriptor to avoid "NOT_UPDATED" error
5707 VkDescriptorBufferInfo buffInfo = {};
5708 buffInfo.buffer = buffer;
5709 buffInfo.offset = 0;
5710 buffInfo.range = 1024;
5711
5712 VkWriteDescriptorSet descriptor_write;
5713 memset(&descriptor_write, 0, sizeof(descriptor_write));
5714 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5715 descriptor_write.dstSet = descriptorSet;
5716 descriptor_write.dstBinding = 0;
5717 descriptor_write.descriptorCount = 1;
5718 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5719 descriptor_write.pBufferInfo = &buffInfo;
5720
5721 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5722
5723 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005724 char const *vsSource =
5725 "#version 450\n"
5726 "\n"
5727 "out gl_PerVertex { \n"
5728 " vec4 gl_Position;\n"
5729 "};\n"
5730 "void main(){\n"
5731 " gl_Position = vec4(1);\n"
5732 "}\n";
5733 char const *fsSource =
5734 "#version 450\n"
5735 "\n"
5736 "layout(location=0) out vec4 x;\n"
5737 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5738 "void main(){\n"
5739 " x = vec4(bar.y);\n"
5740 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005741 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5742 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5743 VkPipelineObj pipe(m_device);
5744 pipe.AddShader(&vs);
5745 pipe.AddShader(&fs);
5746 pipe.AddColorAttachment();
5747 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5748
Tony Barbour552f6c02016-12-21 14:34:07 -07005749 m_commandBuffer->BeginCommandBuffer();
5750 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005751 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5752 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5753 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005754
5755 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5756 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5757
Tobin Ehlis31289162016-08-17 14:57:58 -06005758 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005759 m_commandBuffer->EndRenderPass();
5760 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005762 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5763 vkDestroyBuffer(m_device->device(), buffer, NULL);
5764 // Attempt to submit cmd buffer
5765 VkSubmitInfo submit_info = {};
5766 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5767 submit_info.commandBufferCount = 1;
5768 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5769 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5770 m_errorMonitor->VerifyFound();
5771 // Cleanup
5772 vkFreeMemory(m_device->device(), mem, NULL);
5773
5774 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5775 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5776 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5777}
5778
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005779TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005780 TEST_DESCRIPTION(
5781 "Attempt to draw with a command buffer that is invalid "
5782 "due to a bound descriptor sets with a combined image "
5783 "sampler having their image, sampler, and descriptor set "
5784 "each respectively destroyed and then attempting to "
5785 "submit associated cmd buffers. Attempt to destroy a "
5786 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005787 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005788 ASSERT_NO_FATAL_FAILURE(InitViewport());
5789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5790
5791 VkDescriptorPoolSize ds_type_count = {};
5792 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5793 ds_type_count.descriptorCount = 1;
5794
5795 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5796 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5797 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005798 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005799 ds_pool_ci.maxSets = 1;
5800 ds_pool_ci.poolSizeCount = 1;
5801 ds_pool_ci.pPoolSizes = &ds_type_count;
5802
5803 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005804 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005805 ASSERT_VK_SUCCESS(err);
5806
5807 VkDescriptorSetLayoutBinding dsl_binding = {};
5808 dsl_binding.binding = 0;
5809 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5810 dsl_binding.descriptorCount = 1;
5811 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5812 dsl_binding.pImmutableSamplers = NULL;
5813
5814 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5815 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5816 ds_layout_ci.pNext = NULL;
5817 ds_layout_ci.bindingCount = 1;
5818 ds_layout_ci.pBindings = &dsl_binding;
5819 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005820 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005821 ASSERT_VK_SUCCESS(err);
5822
5823 VkDescriptorSet descriptorSet;
5824 VkDescriptorSetAllocateInfo alloc_info = {};
5825 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5826 alloc_info.descriptorSetCount = 1;
5827 alloc_info.descriptorPool = ds_pool;
5828 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005829 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005830 ASSERT_VK_SUCCESS(err);
5831
5832 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5833 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5834 pipeline_layout_ci.pNext = NULL;
5835 pipeline_layout_ci.setLayoutCount = 1;
5836 pipeline_layout_ci.pSetLayouts = &ds_layout;
5837
5838 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005839 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005840 ASSERT_VK_SUCCESS(err);
5841
5842 // Create images to update the descriptor with
5843 VkImage image;
5844 VkImage image2;
5845 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5846 const int32_t tex_width = 32;
5847 const int32_t tex_height = 32;
5848 VkImageCreateInfo image_create_info = {};
5849 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5850 image_create_info.pNext = NULL;
5851 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5852 image_create_info.format = tex_format;
5853 image_create_info.extent.width = tex_width;
5854 image_create_info.extent.height = tex_height;
5855 image_create_info.extent.depth = 1;
5856 image_create_info.mipLevels = 1;
5857 image_create_info.arrayLayers = 1;
5858 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5859 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5860 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5861 image_create_info.flags = 0;
5862 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5863 ASSERT_VK_SUCCESS(err);
5864 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5865 ASSERT_VK_SUCCESS(err);
5866
5867 VkMemoryRequirements memory_reqs;
5868 VkDeviceMemory image_memory;
5869 bool pass;
5870 VkMemoryAllocateInfo memory_info = {};
5871 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5872 memory_info.pNext = NULL;
5873 memory_info.allocationSize = 0;
5874 memory_info.memoryTypeIndex = 0;
5875 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5876 // Allocate enough memory for both images
5877 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005878 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005879 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005880 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005881 ASSERT_VK_SUCCESS(err);
5882 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5883 ASSERT_VK_SUCCESS(err);
5884 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005885 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005886 ASSERT_VK_SUCCESS(err);
5887
5888 VkImageViewCreateInfo image_view_create_info = {};
5889 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5890 image_view_create_info.image = image;
5891 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5892 image_view_create_info.format = tex_format;
5893 image_view_create_info.subresourceRange.layerCount = 1;
5894 image_view_create_info.subresourceRange.baseMipLevel = 0;
5895 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005896 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005897
5898 VkImageView view;
5899 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005900 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005901 ASSERT_VK_SUCCESS(err);
5902 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005903 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005904 ASSERT_VK_SUCCESS(err);
5905 // Create Samplers
5906 VkSamplerCreateInfo sampler_ci = {};
5907 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5908 sampler_ci.pNext = NULL;
5909 sampler_ci.magFilter = VK_FILTER_NEAREST;
5910 sampler_ci.minFilter = VK_FILTER_NEAREST;
5911 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5912 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5913 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5914 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5915 sampler_ci.mipLodBias = 1.0;
5916 sampler_ci.anisotropyEnable = VK_FALSE;
5917 sampler_ci.maxAnisotropy = 1;
5918 sampler_ci.compareEnable = VK_FALSE;
5919 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5920 sampler_ci.minLod = 1.0;
5921 sampler_ci.maxLod = 1.0;
5922 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5923 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5924 VkSampler sampler;
5925 VkSampler sampler2;
5926 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5927 ASSERT_VK_SUCCESS(err);
5928 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5929 ASSERT_VK_SUCCESS(err);
5930 // Update descriptor with image and sampler
5931 VkDescriptorImageInfo img_info = {};
5932 img_info.sampler = sampler;
5933 img_info.imageView = view;
5934 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5935
5936 VkWriteDescriptorSet descriptor_write;
5937 memset(&descriptor_write, 0, sizeof(descriptor_write));
5938 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5939 descriptor_write.dstSet = descriptorSet;
5940 descriptor_write.dstBinding = 0;
5941 descriptor_write.descriptorCount = 1;
5942 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5943 descriptor_write.pImageInfo = &img_info;
5944
5945 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5946
5947 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005948 char const *vsSource =
5949 "#version 450\n"
5950 "\n"
5951 "out gl_PerVertex { \n"
5952 " vec4 gl_Position;\n"
5953 "};\n"
5954 "void main(){\n"
5955 " gl_Position = vec4(1);\n"
5956 "}\n";
5957 char const *fsSource =
5958 "#version 450\n"
5959 "\n"
5960 "layout(set=0, binding=0) uniform sampler2D s;\n"
5961 "layout(location=0) out vec4 x;\n"
5962 "void main(){\n"
5963 " x = texture(s, vec2(1));\n"
5964 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005965 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5966 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5967 VkPipelineObj pipe(m_device);
5968 pipe.AddShader(&vs);
5969 pipe.AddShader(&fs);
5970 pipe.AddColorAttachment();
5971 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5972
5973 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005975 m_commandBuffer->BeginCommandBuffer();
5976 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005977 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5978 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5979 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005980 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5981 VkRect2D scissor = {{0, 0}, {16, 16}};
5982 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5983 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005984 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005985 m_commandBuffer->EndRenderPass();
5986 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005987 // Destroy sampler invalidates the cmd buffer, causing error on submit
5988 vkDestroySampler(m_device->device(), sampler, NULL);
5989 // Attempt to submit cmd buffer
5990 VkSubmitInfo submit_info = {};
5991 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5992 submit_info.commandBufferCount = 1;
5993 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5994 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5995 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005996
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005997 // Now re-update descriptor with valid sampler and delete image
5998 img_info.sampler = sampler2;
5999 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006000
6001 VkCommandBufferBeginInfo info = {};
6002 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
6003 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
6004
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07006006 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006007 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006008 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6009 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6010 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006011 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6012 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006013 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006014 m_commandBuffer->EndRenderPass();
6015 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006016 // Destroy image invalidates the cmd buffer, causing error on submit
6017 vkDestroyImage(m_device->device(), image, NULL);
6018 // Attempt to submit cmd buffer
6019 submit_info = {};
6020 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6021 submit_info.commandBufferCount = 1;
6022 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6023 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6024 m_errorMonitor->VerifyFound();
6025 // Now update descriptor to be valid, but then free descriptor
6026 img_info.imageView = view2;
6027 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07006028 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006029 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006030 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6031 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6032 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006033 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6034 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006035 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006036 m_commandBuffer->EndRenderPass();
6037 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006038 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006039
6040 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006042 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006043 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006044
6045 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006046 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006047 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006048 m_errorMonitor->SetUnexpectedError(
6049 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6050 "either be a valid handle or VK_NULL_HANDLE");
6051 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006052 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6053
6054 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006055 submit_info = {};
6056 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6057 submit_info.commandBufferCount = 1;
6058 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006060 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6061 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006062
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006063 // Cleanup
6064 vkFreeMemory(m_device->device(), image_memory, NULL);
6065 vkDestroySampler(m_device->device(), sampler2, NULL);
6066 vkDestroyImage(m_device->device(), image2, NULL);
6067 vkDestroyImageView(m_device->device(), view, NULL);
6068 vkDestroyImageView(m_device->device(), view2, NULL);
6069 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6070 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6071 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6072}
6073
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006074TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6075 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006076 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006077 ASSERT_NO_FATAL_FAILURE(InitViewport());
6078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6079
6080 VkDescriptorPoolSize ds_type_count = {};
6081 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6082 ds_type_count.descriptorCount = 1;
6083
6084 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6085 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6086 ds_pool_ci.pNext = NULL;
6087 ds_pool_ci.maxSets = 1;
6088 ds_pool_ci.poolSizeCount = 1;
6089 ds_pool_ci.pPoolSizes = &ds_type_count;
6090
6091 VkDescriptorPool ds_pool;
6092 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6093 ASSERT_VK_SUCCESS(err);
6094
6095 VkDescriptorSetLayoutBinding dsl_binding = {};
6096 dsl_binding.binding = 0;
6097 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6098 dsl_binding.descriptorCount = 1;
6099 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6100 dsl_binding.pImmutableSamplers = NULL;
6101
6102 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6103 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6104 ds_layout_ci.pNext = NULL;
6105 ds_layout_ci.bindingCount = 1;
6106 ds_layout_ci.pBindings = &dsl_binding;
6107 VkDescriptorSetLayout ds_layout;
6108 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6109 ASSERT_VK_SUCCESS(err);
6110
6111 VkDescriptorSet descriptor_set;
6112 VkDescriptorSetAllocateInfo alloc_info = {};
6113 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6114 alloc_info.descriptorSetCount = 1;
6115 alloc_info.descriptorPool = ds_pool;
6116 alloc_info.pSetLayouts = &ds_layout;
6117 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6118 ASSERT_VK_SUCCESS(err);
6119
6120 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6121 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6122 pipeline_layout_ci.pNext = NULL;
6123 pipeline_layout_ci.setLayoutCount = 1;
6124 pipeline_layout_ci.pSetLayouts = &ds_layout;
6125
6126 VkPipelineLayout pipeline_layout;
6127 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6128 ASSERT_VK_SUCCESS(err);
6129
6130 // Create image to update the descriptor with
6131 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006132 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006133 ASSERT_TRUE(image.initialized());
6134
6135 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6136 // Create Sampler
6137 VkSamplerCreateInfo sampler_ci = {};
6138 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6139 sampler_ci.pNext = NULL;
6140 sampler_ci.magFilter = VK_FILTER_NEAREST;
6141 sampler_ci.minFilter = VK_FILTER_NEAREST;
6142 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6143 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6144 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6145 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6146 sampler_ci.mipLodBias = 1.0;
6147 sampler_ci.anisotropyEnable = VK_FALSE;
6148 sampler_ci.maxAnisotropy = 1;
6149 sampler_ci.compareEnable = VK_FALSE;
6150 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6151 sampler_ci.minLod = 1.0;
6152 sampler_ci.maxLod = 1.0;
6153 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6154 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6155 VkSampler sampler;
6156 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6157 ASSERT_VK_SUCCESS(err);
6158 // Update descriptor with image and sampler
6159 VkDescriptorImageInfo img_info = {};
6160 img_info.sampler = sampler;
6161 img_info.imageView = view;
6162 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6163
6164 VkWriteDescriptorSet descriptor_write;
6165 memset(&descriptor_write, 0, sizeof(descriptor_write));
6166 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6167 descriptor_write.dstSet = descriptor_set;
6168 descriptor_write.dstBinding = 0;
6169 descriptor_write.descriptorCount = 1;
6170 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6171 descriptor_write.pImageInfo = &img_info;
6172
6173 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6174
6175 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006176 char const *vsSource =
6177 "#version 450\n"
6178 "\n"
6179 "out gl_PerVertex { \n"
6180 " vec4 gl_Position;\n"
6181 "};\n"
6182 "void main(){\n"
6183 " gl_Position = vec4(1);\n"
6184 "}\n";
6185 char const *fsSource =
6186 "#version 450\n"
6187 "\n"
6188 "layout(set=0, binding=0) uniform sampler2D s;\n"
6189 "layout(location=0) out vec4 x;\n"
6190 "void main(){\n"
6191 " x = texture(s, vec2(1));\n"
6192 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006193 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6194 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6195 VkPipelineObj pipe(m_device);
6196 pipe.AddShader(&vs);
6197 pipe.AddShader(&fs);
6198 pipe.AddColorAttachment();
6199 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6200
Tony Barbour552f6c02016-12-21 14:34:07 -07006201 m_commandBuffer->BeginCommandBuffer();
6202 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006203 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6204 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6205 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006206
6207 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6208 VkRect2D scissor = {{0, 0}, {16, 16}};
6209 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6210 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6211
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006212 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006213 m_commandBuffer->EndRenderPass();
6214 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006215 // Submit cmd buffer to put pool in-flight
6216 VkSubmitInfo submit_info = {};
6217 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6218 submit_info.commandBufferCount = 1;
6219 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6220 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6221 // Destroy pool while in-flight, causing error
6222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6223 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6224 m_errorMonitor->VerifyFound();
6225 vkQueueWaitIdle(m_device->m_queue);
6226 // Cleanup
6227 vkDestroySampler(m_device->device(), sampler, NULL);
6228 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6229 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006230 m_errorMonitor->SetUnexpectedError(
6231 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6232 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006233 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006234 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006235}
6236
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006237TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6238 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006239 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006240 ASSERT_NO_FATAL_FAILURE(InitViewport());
6241 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6242
6243 VkDescriptorPoolSize ds_type_count = {};
6244 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6245 ds_type_count.descriptorCount = 1;
6246
6247 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6248 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6249 ds_pool_ci.pNext = NULL;
6250 ds_pool_ci.maxSets = 1;
6251 ds_pool_ci.poolSizeCount = 1;
6252 ds_pool_ci.pPoolSizes = &ds_type_count;
6253
6254 VkDescriptorPool ds_pool;
6255 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6256 ASSERT_VK_SUCCESS(err);
6257
6258 VkDescriptorSetLayoutBinding dsl_binding = {};
6259 dsl_binding.binding = 0;
6260 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6261 dsl_binding.descriptorCount = 1;
6262 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6263 dsl_binding.pImmutableSamplers = NULL;
6264
6265 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6266 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6267 ds_layout_ci.pNext = NULL;
6268 ds_layout_ci.bindingCount = 1;
6269 ds_layout_ci.pBindings = &dsl_binding;
6270 VkDescriptorSetLayout ds_layout;
6271 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6272 ASSERT_VK_SUCCESS(err);
6273
6274 VkDescriptorSet descriptorSet;
6275 VkDescriptorSetAllocateInfo alloc_info = {};
6276 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6277 alloc_info.descriptorSetCount = 1;
6278 alloc_info.descriptorPool = ds_pool;
6279 alloc_info.pSetLayouts = &ds_layout;
6280 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6281 ASSERT_VK_SUCCESS(err);
6282
6283 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6284 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6285 pipeline_layout_ci.pNext = NULL;
6286 pipeline_layout_ci.setLayoutCount = 1;
6287 pipeline_layout_ci.pSetLayouts = &ds_layout;
6288
6289 VkPipelineLayout pipeline_layout;
6290 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6291 ASSERT_VK_SUCCESS(err);
6292
6293 // Create images to update the descriptor with
6294 VkImage image;
6295 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6296 const int32_t tex_width = 32;
6297 const int32_t tex_height = 32;
6298 VkImageCreateInfo image_create_info = {};
6299 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6300 image_create_info.pNext = NULL;
6301 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6302 image_create_info.format = tex_format;
6303 image_create_info.extent.width = tex_width;
6304 image_create_info.extent.height = tex_height;
6305 image_create_info.extent.depth = 1;
6306 image_create_info.mipLevels = 1;
6307 image_create_info.arrayLayers = 1;
6308 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6309 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6310 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6311 image_create_info.flags = 0;
6312 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6313 ASSERT_VK_SUCCESS(err);
6314 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6315 VkMemoryRequirements memory_reqs;
6316 VkDeviceMemory image_memory;
6317 bool pass;
6318 VkMemoryAllocateInfo memory_info = {};
6319 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6320 memory_info.pNext = NULL;
6321 memory_info.allocationSize = 0;
6322 memory_info.memoryTypeIndex = 0;
6323 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6324 // Allocate enough memory for image
6325 memory_info.allocationSize = memory_reqs.size;
6326 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6327 ASSERT_TRUE(pass);
6328 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6329 ASSERT_VK_SUCCESS(err);
6330 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6331 ASSERT_VK_SUCCESS(err);
6332
6333 VkImageViewCreateInfo image_view_create_info = {};
6334 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6335 image_view_create_info.image = image;
6336 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6337 image_view_create_info.format = tex_format;
6338 image_view_create_info.subresourceRange.layerCount = 1;
6339 image_view_create_info.subresourceRange.baseMipLevel = 0;
6340 image_view_create_info.subresourceRange.levelCount = 1;
6341 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6342
6343 VkImageView view;
6344 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6345 ASSERT_VK_SUCCESS(err);
6346 // Create Samplers
6347 VkSamplerCreateInfo sampler_ci = {};
6348 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6349 sampler_ci.pNext = NULL;
6350 sampler_ci.magFilter = VK_FILTER_NEAREST;
6351 sampler_ci.minFilter = VK_FILTER_NEAREST;
6352 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6353 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6354 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6355 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6356 sampler_ci.mipLodBias = 1.0;
6357 sampler_ci.anisotropyEnable = VK_FALSE;
6358 sampler_ci.maxAnisotropy = 1;
6359 sampler_ci.compareEnable = VK_FALSE;
6360 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6361 sampler_ci.minLod = 1.0;
6362 sampler_ci.maxLod = 1.0;
6363 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6364 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6365 VkSampler sampler;
6366 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6367 ASSERT_VK_SUCCESS(err);
6368 // Update descriptor with image and sampler
6369 VkDescriptorImageInfo img_info = {};
6370 img_info.sampler = sampler;
6371 img_info.imageView = view;
6372 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6373
6374 VkWriteDescriptorSet descriptor_write;
6375 memset(&descriptor_write, 0, sizeof(descriptor_write));
6376 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6377 descriptor_write.dstSet = descriptorSet;
6378 descriptor_write.dstBinding = 0;
6379 descriptor_write.descriptorCount = 1;
6380 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6381 descriptor_write.pImageInfo = &img_info;
6382 // Break memory binding and attempt update
6383 vkFreeMemory(m_device->device(), image_memory, nullptr);
6384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006385 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6387 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6388 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6389 m_errorMonitor->VerifyFound();
6390 // Cleanup
6391 vkDestroyImage(m_device->device(), image, NULL);
6392 vkDestroySampler(m_device->device(), sampler, NULL);
6393 vkDestroyImageView(m_device->device(), view, NULL);
6394 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6395 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6396 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6397}
6398
Karl Schultz6addd812016-02-02 17:17:23 -07006399TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006400 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6401 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006402 // Create a valid cmd buffer
6403 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006404 uint64_t fake_pipeline_handle = 0xbaad6001;
6405 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006406 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6408
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006410 m_commandBuffer->BeginCommandBuffer();
6411 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006412 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006413 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006414
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006415 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006417 Draw(1, 0, 0, 0);
6418 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006419
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006420 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006422 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006423 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6424 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006425}
6426
Karl Schultz6addd812016-02-02 17:17:23 -07006427TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006428 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006429 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006430
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006432
Tony Barbour1fa09702017-03-16 12:09:08 -06006433 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006434 ASSERT_NO_FATAL_FAILURE(InitViewport());
6435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006436 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006437 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6438 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006439
6440 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006441 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6442 ds_pool_ci.pNext = NULL;
6443 ds_pool_ci.maxSets = 1;
6444 ds_pool_ci.poolSizeCount = 1;
6445 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006446
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006447 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006448 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006449 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006450
Tony Barboureb254902015-07-15 12:50:33 -06006451 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006452 dsl_binding.binding = 0;
6453 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6454 dsl_binding.descriptorCount = 1;
6455 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6456 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006457
Tony Barboureb254902015-07-15 12:50:33 -06006458 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006459 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6460 ds_layout_ci.pNext = NULL;
6461 ds_layout_ci.bindingCount = 1;
6462 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006463 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006464 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006465 ASSERT_VK_SUCCESS(err);
6466
6467 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006468 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006469 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006470 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006471 alloc_info.descriptorPool = ds_pool;
6472 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006473 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006474 ASSERT_VK_SUCCESS(err);
6475
Tony Barboureb254902015-07-15 12:50:33 -06006476 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006477 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6478 pipeline_layout_ci.pNext = NULL;
6479 pipeline_layout_ci.setLayoutCount = 1;
6480 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006481
6482 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006483 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006484 ASSERT_VK_SUCCESS(err);
6485
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006486 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006487 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006488 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006489 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006490
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006491 VkPipelineObj pipe(m_device);
6492 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006493 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006494 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006495 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006496
Tony Barbour552f6c02016-12-21 14:34:07 -07006497 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006498 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6499 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6500 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006501
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006502 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006503
Chia-I Wuf7458c52015-10-26 21:10:41 +08006504 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6505 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6506 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006507}
6508
Karl Schultz6addd812016-02-02 17:17:23 -07006509TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006510 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006511 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006512
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006514
Tony Barbour1fa09702017-03-16 12:09:08 -06006515 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006516 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006517 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6518 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006519
6520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6522 ds_pool_ci.pNext = NULL;
6523 ds_pool_ci.maxSets = 1;
6524 ds_pool_ci.poolSizeCount = 1;
6525 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006526
6527 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006528 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006529 ASSERT_VK_SUCCESS(err);
6530
6531 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006532 dsl_binding.binding = 0;
6533 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6534 dsl_binding.descriptorCount = 1;
6535 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6536 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006537
6538 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006539 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6540 ds_layout_ci.pNext = NULL;
6541 ds_layout_ci.bindingCount = 1;
6542 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006543 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006544 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006545 ASSERT_VK_SUCCESS(err);
6546
6547 VkDescriptorSet descriptorSet;
6548 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006549 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006550 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006551 alloc_info.descriptorPool = ds_pool;
6552 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006553 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006554 ASSERT_VK_SUCCESS(err);
6555
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006556 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006557 VkWriteDescriptorSet descriptor_write;
6558 memset(&descriptor_write, 0, sizeof(descriptor_write));
6559 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6560 descriptor_write.dstSet = descriptorSet;
6561 descriptor_write.dstBinding = 0;
6562 descriptor_write.descriptorCount = 1;
6563 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6564 descriptor_write.pTexelBufferView = &view;
6565
6566 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6567
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006568 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006569
6570 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6571 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6572}
6573
Mark Youngd339ba32016-05-30 13:28:35 -06006574TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006575 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006576
6577 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006579 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006580
Tony Barbour1fa09702017-03-16 12:09:08 -06006581 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006582
6583 // Create a buffer with no bound memory and then attempt to create
6584 // a buffer view.
6585 VkBufferCreateInfo buff_ci = {};
6586 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006587 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006588 buff_ci.size = 256;
6589 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6590 VkBuffer buffer;
6591 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6592 ASSERT_VK_SUCCESS(err);
6593
6594 VkBufferViewCreateInfo buff_view_ci = {};
6595 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6596 buff_view_ci.buffer = buffer;
6597 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6598 buff_view_ci.range = VK_WHOLE_SIZE;
6599 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006600 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006601
6602 m_errorMonitor->VerifyFound();
6603 vkDestroyBuffer(m_device->device(), buffer, NULL);
6604 // If last error is success, it still created the view, so delete it.
6605 if (err == VK_SUCCESS) {
6606 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6607 }
6608}
6609
Karl Schultz6addd812016-02-02 17:17:23 -07006610TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6611 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6612 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006613 // 1. No dynamicOffset supplied
6614 // 2. Too many dynamicOffsets supplied
6615 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006616 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6618 " requires 1 dynamicOffsets, but only "
6619 "0 dynamicOffsets are left in "
6620 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006621
Tony Barbour1fa09702017-03-16 12:09:08 -06006622 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006623 ASSERT_NO_FATAL_FAILURE(InitViewport());
6624 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6625
6626 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006627 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6628 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006629
6630 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006631 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6632 ds_pool_ci.pNext = NULL;
6633 ds_pool_ci.maxSets = 1;
6634 ds_pool_ci.poolSizeCount = 1;
6635 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006636
6637 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006638 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006639 ASSERT_VK_SUCCESS(err);
6640
6641 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006642 dsl_binding.binding = 0;
6643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6644 dsl_binding.descriptorCount = 1;
6645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6646 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006647
6648 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006649 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6650 ds_layout_ci.pNext = NULL;
6651 ds_layout_ci.bindingCount = 1;
6652 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006653 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006654 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006655 ASSERT_VK_SUCCESS(err);
6656
6657 VkDescriptorSet descriptorSet;
6658 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006659 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006660 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006661 alloc_info.descriptorPool = ds_pool;
6662 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006663 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006664 ASSERT_VK_SUCCESS(err);
6665
6666 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006667 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6668 pipeline_layout_ci.pNext = NULL;
6669 pipeline_layout_ci.setLayoutCount = 1;
6670 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006671
6672 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006673 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006674 ASSERT_VK_SUCCESS(err);
6675
6676 // Create a buffer to update the descriptor with
6677 uint32_t qfi = 0;
6678 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006679 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6680 buffCI.size = 1024;
6681 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6682 buffCI.queueFamilyIndexCount = 1;
6683 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006684
6685 VkBuffer dyub;
6686 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6687 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006688 // Allocate memory and bind to buffer so we can make it to the appropriate
6689 // error
6690 VkMemoryAllocateInfo mem_alloc = {};
6691 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6692 mem_alloc.pNext = NULL;
6693 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006694 mem_alloc.memoryTypeIndex = 0;
6695
6696 VkMemoryRequirements memReqs;
6697 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006698 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006699 if (!pass) {
6700 vkDestroyBuffer(m_device->device(), dyub, NULL);
6701 return;
6702 }
6703
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006704 VkDeviceMemory mem;
6705 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6706 ASSERT_VK_SUCCESS(err);
6707 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6708 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006709 // Correctly update descriptor to avoid "NOT_UPDATED" error
6710 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006711 buffInfo.buffer = dyub;
6712 buffInfo.offset = 0;
6713 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006714
6715 VkWriteDescriptorSet descriptor_write;
6716 memset(&descriptor_write, 0, sizeof(descriptor_write));
6717 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6718 descriptor_write.dstSet = descriptorSet;
6719 descriptor_write.dstBinding = 0;
6720 descriptor_write.descriptorCount = 1;
6721 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6722 descriptor_write.pBufferInfo = &buffInfo;
6723
6724 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6725
Tony Barbour552f6c02016-12-21 14:34:07 -07006726 m_commandBuffer->BeginCommandBuffer();
6727 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006728 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6729 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006730 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006731 uint32_t pDynOff[2] = {512, 756};
6732 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6734 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6735 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6736 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006737 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006738 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6740 " dynamic offset 512 combined with "
6741 "offset 0 and range 1024 that "
6742 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006743 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006744 char const *vsSource =
6745 "#version 450\n"
6746 "\n"
6747 "out gl_PerVertex { \n"
6748 " vec4 gl_Position;\n"
6749 "};\n"
6750 "void main(){\n"
6751 " gl_Position = vec4(1);\n"
6752 "}\n";
6753 char const *fsSource =
6754 "#version 450\n"
6755 "\n"
6756 "layout(location=0) out vec4 x;\n"
6757 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6758 "void main(){\n"
6759 " x = vec4(bar.y);\n"
6760 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006761 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6762 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6763 VkPipelineObj pipe(m_device);
6764 pipe.AddShader(&vs);
6765 pipe.AddShader(&fs);
6766 pipe.AddColorAttachment();
6767 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6768
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006769 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6770 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6771 VkRect2D scissor = {{0, 0}, {16, 16}};
6772 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006774 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006775 // This update should succeed, but offset size of 512 will overstep buffer
6776 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006777 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6778 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006779 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006780 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006781
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006782 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006783 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006784
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006785 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006786 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006787 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6788}
6789
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006790TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006791 TEST_DESCRIPTION(
6792 "Attempt to update a descriptor with a non-sparse buffer "
6793 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006794 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006796 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6798 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006799
Tony Barbour1fa09702017-03-16 12:09:08 -06006800 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006801 ASSERT_NO_FATAL_FAILURE(InitViewport());
6802 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6803
6804 VkDescriptorPoolSize ds_type_count = {};
6805 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6806 ds_type_count.descriptorCount = 1;
6807
6808 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6809 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6810 ds_pool_ci.pNext = NULL;
6811 ds_pool_ci.maxSets = 1;
6812 ds_pool_ci.poolSizeCount = 1;
6813 ds_pool_ci.pPoolSizes = &ds_type_count;
6814
6815 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006816 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006817 ASSERT_VK_SUCCESS(err);
6818
6819 VkDescriptorSetLayoutBinding dsl_binding = {};
6820 dsl_binding.binding = 0;
6821 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6822 dsl_binding.descriptorCount = 1;
6823 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6824 dsl_binding.pImmutableSamplers = NULL;
6825
6826 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6827 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6828 ds_layout_ci.pNext = NULL;
6829 ds_layout_ci.bindingCount = 1;
6830 ds_layout_ci.pBindings = &dsl_binding;
6831 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006833 ASSERT_VK_SUCCESS(err);
6834
6835 VkDescriptorSet descriptorSet;
6836 VkDescriptorSetAllocateInfo alloc_info = {};
6837 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6838 alloc_info.descriptorSetCount = 1;
6839 alloc_info.descriptorPool = ds_pool;
6840 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006842 ASSERT_VK_SUCCESS(err);
6843
6844 // Create a buffer to update the descriptor with
6845 uint32_t qfi = 0;
6846 VkBufferCreateInfo buffCI = {};
6847 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6848 buffCI.size = 1024;
6849 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6850 buffCI.queueFamilyIndexCount = 1;
6851 buffCI.pQueueFamilyIndices = &qfi;
6852
6853 VkBuffer dyub;
6854 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6855 ASSERT_VK_SUCCESS(err);
6856
6857 // Attempt to update descriptor without binding memory to it
6858 VkDescriptorBufferInfo buffInfo = {};
6859 buffInfo.buffer = dyub;
6860 buffInfo.offset = 0;
6861 buffInfo.range = 1024;
6862
6863 VkWriteDescriptorSet descriptor_write;
6864 memset(&descriptor_write, 0, sizeof(descriptor_write));
6865 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6866 descriptor_write.dstSet = descriptorSet;
6867 descriptor_write.dstBinding = 0;
6868 descriptor_write.descriptorCount = 1;
6869 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6870 descriptor_write.pBufferInfo = &buffInfo;
6871
6872 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6873 m_errorMonitor->VerifyFound();
6874
6875 vkDestroyBuffer(m_device->device(), dyub, NULL);
6876 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6877 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6878}
6879
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006880TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006881 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006882 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006883 ASSERT_NO_FATAL_FAILURE(InitViewport());
6884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6885
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006886 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006887 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006888 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6889 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6890 pipeline_layout_ci.pushConstantRangeCount = 1;
6891 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6892
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006893 //
6894 // Check for invalid push constant ranges in pipeline layouts.
6895 //
6896 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006897 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006898 char const *msg;
6899 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006900
Karl Schultzc81037d2016-05-12 08:11:23 -06006901 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6902 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6903 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6904 "vkCreatePipelineLayout() call has push constants index 0 with "
6905 "size 0."},
6906 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6907 "vkCreatePipelineLayout() call has push constants index 0 with "
6908 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006909 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006910 "vkCreatePipelineLayout() call has push constants index 0 with "
6911 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006912 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006913 "vkCreatePipelineLayout() call has push constants index 0 with "
6914 "size 0."},
6915 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6916 "vkCreatePipelineLayout() call has push constants index 0 with "
6917 "offset 1. Offset must"},
6918 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6919 "vkCreatePipelineLayout() call has push constants index 0 "
6920 "with offset "},
6921 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6922 "vkCreatePipelineLayout() call has push constants "
6923 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006924 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006925 "vkCreatePipelineLayout() call has push constants index 0 "
6926 "with offset "},
6927 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6928 "vkCreatePipelineLayout() call has push "
6929 "constants index 0 with offset "},
6930 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6931 "vkCreatePipelineLayout() call has push "
6932 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006933 }};
6934
6935 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006936 for (const auto &iter : range_tests) {
6937 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6939 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006940 m_errorMonitor->VerifyFound();
6941 if (VK_SUCCESS == err) {
6942 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6943 }
6944 }
6945
6946 // Check for invalid stage flag
6947 pc_range.offset = 0;
6948 pc_range.size = 16;
6949 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006950 m_errorMonitor->SetDesiredFailureMsg(
6951 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6952 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006953 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006954 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006955 if (VK_SUCCESS == err) {
6956 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6957 }
6958
Karl Schultzc59b72d2017-02-24 15:45:05 -07006959 // Check for duplicate stage flags in a list of push constant ranges.
6960 // A shader can only have one push constant block and that block is mapped
6961 // to the push constant range that has that shader's stage flag set.
6962 // The shader's stage flag can only appear once in all the ranges, so the
6963 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006964 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006965 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006966 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006967 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006968 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006969 // Overlapping ranges are OK, but a stage flag can appear only once.
6970 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6971 {
6972 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6973 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6974 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6975 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006976 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006977 {
6978 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6979 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6980 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6981 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6982 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6983 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6984 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6985 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6986 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6987 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6988 }},
6989 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6990 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6991 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6992 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6993 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6994 {
6995 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6996 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6997 }},
6998 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6999 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7000 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7001 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7002 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7003 {
7004 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7005 }},
7006 },
7007 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007008
Karl Schultzc59b72d2017-02-24 15:45:05 -07007009 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007010 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007011 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007013 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007014 m_errorMonitor->VerifyFound();
7015 if (VK_SUCCESS == err) {
7016 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7017 }
7018 }
7019
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007020 //
7021 // CmdPushConstants tests
7022 //
7023
Karl Schultzc59b72d2017-02-24 15:45:05 -07007024 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007025 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007026 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007027 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007028 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007029 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007030 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007031 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007032
7033 const uint8_t dummy_values[100] = {};
7034
7035 m_commandBuffer->BeginCommandBuffer();
7036 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007037
7038 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007039 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007041 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007042 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007043
Karl Schultzc59b72d2017-02-24 15:45:05 -07007044 m_errorMonitor->ExpectSuccess();
7045 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7046 m_errorMonitor->VerifyNotFound();
7047 m_errorMonitor->ExpectSuccess();
7048 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7049 m_errorMonitor->VerifyNotFound();
7050 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7051 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7052 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7053 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7054 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7055 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7056 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007057 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007058 for (const auto &iter : cmd_range_tests) {
7059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7060 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7061 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007062 m_errorMonitor->VerifyFound();
7063 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007064
Tony Barbour552f6c02016-12-21 14:34:07 -07007065 m_commandBuffer->EndRenderPass();
7066 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007067 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007068}
7069
Karl Schultz6addd812016-02-02 17:17:23 -07007070TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007071 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007072 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007073
Tony Barbour1fa09702017-03-16 12:09:08 -06007074 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007075 ASSERT_NO_FATAL_FAILURE(InitViewport());
7076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7077
7078 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7079 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007080 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7081 ds_type_count[0].descriptorCount = 10;
7082 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7083 ds_type_count[1].descriptorCount = 2;
7084 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7085 ds_type_count[2].descriptorCount = 2;
7086 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7087 ds_type_count[3].descriptorCount = 5;
7088 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7089 // type
7090 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7091 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7092 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007093
7094 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007095 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7096 ds_pool_ci.pNext = NULL;
7097 ds_pool_ci.maxSets = 5;
7098 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7099 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007100
7101 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007102 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007103 ASSERT_VK_SUCCESS(err);
7104
7105 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7106 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007107 dsl_binding[0].binding = 0;
7108 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7109 dsl_binding[0].descriptorCount = 5;
7110 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7111 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007112
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007113 // Create layout identical to set0 layout but w/ different stageFlags
7114 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007115 dsl_fs_stage_only.binding = 0;
7116 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7117 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007118 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7119 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007120 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007121 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007122 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7123 ds_layout_ci.pNext = NULL;
7124 ds_layout_ci.bindingCount = 1;
7125 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007126 static const uint32_t NUM_LAYOUTS = 4;
7127 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007128 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007129 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7130 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007131 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007132 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007133 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007134 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007135 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007136 dsl_binding[0].binding = 0;
7137 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007138 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007139 dsl_binding[1].binding = 1;
7140 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7141 dsl_binding[1].descriptorCount = 2;
7142 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7143 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007144 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007145 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007146 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007147 ASSERT_VK_SUCCESS(err);
7148 dsl_binding[0].binding = 0;
7149 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007150 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007151 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007152 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007153 ASSERT_VK_SUCCESS(err);
7154 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007155 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007156 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007157 ASSERT_VK_SUCCESS(err);
7158
7159 static const uint32_t NUM_SETS = 4;
7160 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7161 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007162 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007163 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007164 alloc_info.descriptorPool = ds_pool;
7165 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007166 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007167 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007168 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007169 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007170 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007171 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007172 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007173
7174 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007175 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7176 pipeline_layout_ci.pNext = NULL;
7177 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7178 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007179
7180 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007181 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007182 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007183 // Create pipelineLayout with only one setLayout
7184 pipeline_layout_ci.setLayoutCount = 1;
7185 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007186 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007187 ASSERT_VK_SUCCESS(err);
7188 // Create pipelineLayout with 2 descriptor setLayout at index 0
7189 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7190 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007191 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007192 ASSERT_VK_SUCCESS(err);
7193 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7194 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7195 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007196 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007197 ASSERT_VK_SUCCESS(err);
7198 // Create pipelineLayout with UB type, but stageFlags for FS only
7199 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7200 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007201 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007202 ASSERT_VK_SUCCESS(err);
7203 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7204 VkDescriptorSetLayout pl_bad_s0[2] = {};
7205 pl_bad_s0[0] = ds_layout_fs_only;
7206 pl_bad_s0[1] = ds_layout[1];
7207 pipeline_layout_ci.setLayoutCount = 2;
7208 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7209 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007210 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007211 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007212
Tobin Ehlis88452832015-12-03 09:40:56 -07007213 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007214 char const *vsSource =
7215 "#version 450\n"
7216 "\n"
7217 "out gl_PerVertex {\n"
7218 " vec4 gl_Position;\n"
7219 "};\n"
7220 "void main(){\n"
7221 " gl_Position = vec4(1);\n"
7222 "}\n";
7223 char const *fsSource =
7224 "#version 450\n"
7225 "\n"
7226 "layout(location=0) out vec4 x;\n"
7227 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7228 "void main(){\n"
7229 " x = vec4(bar.y);\n"
7230 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007231 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7232 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007233 VkPipelineObj pipe(m_device);
7234 pipe.AddShader(&vs);
7235 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007236 pipe.AddColorAttachment();
7237 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007238
Tony Barbour552f6c02016-12-21 14:34:07 -07007239 m_commandBuffer->BeginCommandBuffer();
7240 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007241
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007242 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007243 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7244 // of PSO
7245 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7246 // cmd_pipeline.c
7247 // due to the fact that cmd_alloc_dset_data() has not been called in
7248 // cmd_bind_graphics_pipeline()
7249 // TODO : Want to cause various binding incompatibility issues here to test
7250 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007251 // First cause various verify_layout_compatibility() fails
7252 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007253 // verify_set_layout_compatibility fail cases:
7254 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007256 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7257 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007258 m_errorMonitor->VerifyFound();
7259
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007260 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7262 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7263 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007264 m_errorMonitor->VerifyFound();
7265
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007266 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007267 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7268 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7270 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7271 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007272 m_errorMonitor->VerifyFound();
7273
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007274 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7275 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7277 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7278 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007279 m_errorMonitor->VerifyFound();
7280
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007281 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7282 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7284 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7285 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7286 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007287 m_errorMonitor->VerifyFound();
7288
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007289 // Cause INFO messages due to disturbing previously bound Sets
7290 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007291 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7292 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007293 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7295 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7296 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007297 m_errorMonitor->VerifyFound();
7298
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007299 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7300 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007301 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7303 " newly bound as set #0 so set #1 and "
7304 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007305 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7306 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007307 m_errorMonitor->VerifyFound();
7308
Tobin Ehlis10fad692016-07-07 12:00:36 -06007309 // Now that we're done actively using the pipelineLayout that gfx pipeline
7310 // was created with, we should be able to delete it. Do that now to verify
7311 // that validation obeys pipelineLayout lifetime
7312 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7313
Tobin Ehlis88452832015-12-03 09:40:56 -07007314 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007315 // 1. Error due to not binding required set (we actually use same code as
7316 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007317 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7318 &descriptorSet[0], 0, NULL);
7319 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7320 &descriptorSet[1], 0, NULL);
7321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007322
7323 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7324 VkRect2D scissor = {{0, 0}, {16, 16}};
7325 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7326 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7327
Tobin Ehlis88452832015-12-03 09:40:56 -07007328 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007329 m_errorMonitor->VerifyFound();
7330
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007331 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007332 // 2. Error due to bound set not being compatible with PSO's
7333 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007334 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7335 &descriptorSet[0], 0, NULL);
7336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007337 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007338 m_errorMonitor->VerifyFound();
7339
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007340 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007341 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7343 }
7344 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007345 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7346 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7347}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007348
Karl Schultz6addd812016-02-02 17:17:23 -07007349TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7351 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007352
Tony Barbour1fa09702017-03-16 12:09:08 -06007353 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007354 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007355 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007356 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007357
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007358 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007359}
7360
Karl Schultz6addd812016-02-02 17:17:23 -07007361TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7362 VkResult err;
7363 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007364
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007366
Tony Barbour1fa09702017-03-16 12:09:08 -06007367 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007368
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007369 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007370 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007371 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007372 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007373 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007374 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007375
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007376 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007377 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007378
7379 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007380 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007381 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7382
7383 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007384 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007385 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007386 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007387 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007388
7389 // The error should be caught by validation of the BeginCommandBuffer call
7390 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7391
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007392 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007393 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007394}
7395
Karl Schultz6addd812016-02-02 17:17:23 -07007396TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007397 // Cause error due to Begin while recording CB
7398 // Then cause 2 errors for attempting to reset CB w/o having
7399 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7400 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007402
Tony Barbour1fa09702017-03-16 12:09:08 -06007403 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007404
7405 // Calls AllocateCommandBuffers
7406 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7407
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007408 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007409 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007410 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7411 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007412 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7413 cmd_buf_info.pNext = NULL;
7414 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007415 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007416
7417 // Begin CB to transition to recording state
7418 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7419 // Can't re-begin. This should trigger error
7420 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007421 m_errorMonitor->VerifyFound();
7422
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007424 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007425 // Reset attempt will trigger error due to incorrect CommandPool state
7426 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007427 m_errorMonitor->VerifyFound();
7428
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007430 // Transition CB to RECORDED state
7431 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7432 // Now attempting to Begin will implicitly reset, which triggers error
7433 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007434 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007435}
7436
Karl Schultz6addd812016-02-02 17:17:23 -07007437TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007438 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007439 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7442 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007443
Tony Barbour1fa09702017-03-16 12:09:08 -06007444 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007445 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007446
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007447 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007448 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7449 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007450
7451 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007452 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7453 ds_pool_ci.pNext = NULL;
7454 ds_pool_ci.maxSets = 1;
7455 ds_pool_ci.poolSizeCount = 1;
7456 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007457
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007458 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007459 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007460 ASSERT_VK_SUCCESS(err);
7461
Tony Barboureb254902015-07-15 12:50:33 -06007462 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007463 dsl_binding.binding = 0;
7464 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7465 dsl_binding.descriptorCount = 1;
7466 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7467 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007468
Tony Barboureb254902015-07-15 12:50:33 -06007469 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007470 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7471 ds_layout_ci.pNext = NULL;
7472 ds_layout_ci.bindingCount = 1;
7473 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007474
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007475 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007476 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007477 ASSERT_VK_SUCCESS(err);
7478
7479 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007480 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007481 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007482 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007483 alloc_info.descriptorPool = ds_pool;
7484 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007486 ASSERT_VK_SUCCESS(err);
7487
Tony Barboureb254902015-07-15 12:50:33 -06007488 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007489 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7490 pipeline_layout_ci.setLayoutCount = 1;
7491 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007492
7493 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007494 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007495 ASSERT_VK_SUCCESS(err);
7496
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007497 VkViewport vp = {}; // Just need dummy vp to point to
7498 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007499
7500 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007501 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7502 vp_state_ci.scissorCount = 1;
7503 vp_state_ci.pScissors = &sc;
7504 vp_state_ci.viewportCount = 1;
7505 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007506
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007507 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7508 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7509 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7510 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7511 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7512 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007513 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007514 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007515 rs_state_ci.lineWidth = 1.0f;
7516
7517 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7518 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7519 vi_ci.pNext = nullptr;
7520 vi_ci.vertexBindingDescriptionCount = 0;
7521 vi_ci.pVertexBindingDescriptions = nullptr;
7522 vi_ci.vertexAttributeDescriptionCount = 0;
7523 vi_ci.pVertexAttributeDescriptions = nullptr;
7524
7525 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7526 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7527 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7528
7529 VkPipelineShaderStageCreateInfo shaderStages[2];
7530 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7531
7532 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7533 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007534 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007535 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007536
Tony Barboureb254902015-07-15 12:50:33 -06007537 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007538 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7539 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007540 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007541 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7542 gp_ci.layout = pipeline_layout;
7543 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007544 gp_ci.pVertexInputState = &vi_ci;
7545 gp_ci.pInputAssemblyState = &ia_ci;
7546
7547 gp_ci.stageCount = 1;
7548 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007549
7550 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007551 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7552 pc_ci.initialDataSize = 0;
7553 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007554
7555 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007556 VkPipelineCache pipelineCache;
7557
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007558 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007559 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007560 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007561 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007562
Chia-I Wuf7458c52015-10-26 21:10:41 +08007563 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7564 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7565 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7566 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007567}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007568
Tobin Ehlis912df022015-09-17 08:46:18 -06007569/*// TODO : This test should be good, but needs Tess support in compiler to run
7570TEST_F(VkLayerTest, InvalidPatchControlPoints)
7571{
7572 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007573 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007574
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007576 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7577primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007578
Tony Barbour1fa09702017-03-16 12:09:08 -06007579 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007580 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007581
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007582 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007583 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007584 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007585
7586 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7587 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7588 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007589 ds_pool_ci.poolSizeCount = 1;
7590 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007591
7592 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007593 err = vkCreateDescriptorPool(m_device->device(),
7594VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007595 ASSERT_VK_SUCCESS(err);
7596
7597 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007598 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007599 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007600 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007601 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7602 dsl_binding.pImmutableSamplers = NULL;
7603
7604 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007605 ds_layout_ci.sType =
7606VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007607 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007608 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007609 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007610
7611 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007612 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7613&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007614 ASSERT_VK_SUCCESS(err);
7615
7616 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007617 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7618VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007619 ASSERT_VK_SUCCESS(err);
7620
7621 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007622 pipeline_layout_ci.sType =
7623VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007624 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007625 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007626 pipeline_layout_ci.pSetLayouts = &ds_layout;
7627
7628 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007629 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7630&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007631 ASSERT_VK_SUCCESS(err);
7632
7633 VkPipelineShaderStageCreateInfo shaderStages[3];
7634 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7635
Karl Schultz6addd812016-02-02 17:17:23 -07007636 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7637this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007638 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007639 VkShaderObj
7640tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7641this);
7642 VkShaderObj
7643te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7644this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007645
Karl Schultz6addd812016-02-02 17:17:23 -07007646 shaderStages[0].sType =
7647VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007648 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007649 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007650 shaderStages[1].sType =
7651VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007652 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007653 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007654 shaderStages[2].sType =
7655VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007656 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007657 shaderStages[2].shader = te.handle();
7658
7659 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007660 iaCI.sType =
7661VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007662 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007663
7664 VkPipelineTessellationStateCreateInfo tsCI = {};
7665 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7666 tsCI.patchControlPoints = 0; // This will cause an error
7667
7668 VkGraphicsPipelineCreateInfo gp_ci = {};
7669 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7670 gp_ci.pNext = NULL;
7671 gp_ci.stageCount = 3;
7672 gp_ci.pStages = shaderStages;
7673 gp_ci.pVertexInputState = NULL;
7674 gp_ci.pInputAssemblyState = &iaCI;
7675 gp_ci.pTessellationState = &tsCI;
7676 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007677 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007678 gp_ci.pMultisampleState = NULL;
7679 gp_ci.pDepthStencilState = NULL;
7680 gp_ci.pColorBlendState = NULL;
7681 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7682 gp_ci.layout = pipeline_layout;
7683 gp_ci.renderPass = renderPass();
7684
7685 VkPipelineCacheCreateInfo pc_ci = {};
7686 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7687 pc_ci.pNext = NULL;
7688 pc_ci.initialSize = 0;
7689 pc_ci.initialData = 0;
7690 pc_ci.maxSize = 0;
7691
7692 VkPipeline pipeline;
7693 VkPipelineCache pipelineCache;
7694
Karl Schultz6addd812016-02-02 17:17:23 -07007695 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7696&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007697 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007698 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7699&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007700
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007701 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007702
Chia-I Wuf7458c52015-10-26 21:10:41 +08007703 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7705 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7706 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007707}
7708*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007709
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007710TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007711 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007712
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007713 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007714
Tony Barbour1fa09702017-03-16 12:09:08 -06007715 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007717
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007718 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007719 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7720 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007721
7722 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007723 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7724 ds_pool_ci.maxSets = 1;
7725 ds_pool_ci.poolSizeCount = 1;
7726 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007727
7728 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007729 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007730 ASSERT_VK_SUCCESS(err);
7731
7732 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007733 dsl_binding.binding = 0;
7734 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7735 dsl_binding.descriptorCount = 1;
7736 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007737
7738 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007739 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7740 ds_layout_ci.bindingCount = 1;
7741 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007742
7743 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007744 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007745 ASSERT_VK_SUCCESS(err);
7746
7747 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007748 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007749 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007750 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007751 alloc_info.descriptorPool = ds_pool;
7752 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007753 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007754 ASSERT_VK_SUCCESS(err);
7755
7756 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007757 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7758 pipeline_layout_ci.setLayoutCount = 1;
7759 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007760
7761 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007762 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007763 ASSERT_VK_SUCCESS(err);
7764
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007765 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007766 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007767 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007768 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007769 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007770 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007771
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007772 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7773 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7774 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7775 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7776 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7777 rs_state_ci.depthClampEnable = VK_FALSE;
7778 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7779 rs_state_ci.depthBiasEnable = VK_FALSE;
7780
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007781 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7782 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7783 vi_ci.pNext = nullptr;
7784 vi_ci.vertexBindingDescriptionCount = 0;
7785 vi_ci.pVertexBindingDescriptions = nullptr;
7786 vi_ci.vertexAttributeDescriptionCount = 0;
7787 vi_ci.pVertexAttributeDescriptions = nullptr;
7788
7789 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7790 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7791 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7792
7793 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7794 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7795 pipe_ms_state_ci.pNext = NULL;
7796 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7797 pipe_ms_state_ci.sampleShadingEnable = 0;
7798 pipe_ms_state_ci.minSampleShading = 1.0;
7799 pipe_ms_state_ci.pSampleMask = NULL;
7800
Cody Northropeb3a6c12015-10-05 14:44:45 -06007801 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007802 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007803
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007804 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007805 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007806 shaderStages[0] = vs.GetStageCreateInfo();
7807 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007808
7809 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007810 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7811 gp_ci.stageCount = 2;
7812 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007813 gp_ci.pVertexInputState = &vi_ci;
7814 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007815 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007816 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007817 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007818 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7819 gp_ci.layout = pipeline_layout;
7820 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007821
7822 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007823 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007824
7825 VkPipeline pipeline;
7826 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007827 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007828 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007829
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007830 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007831 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007832
7833 // Check case where multiViewport is disabled and viewport count is not 1
7834 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7837 vp_state_ci.scissorCount = 0;
7838 vp_state_ci.viewportCount = 0;
7839 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7840 m_errorMonitor->VerifyFound();
7841 } else {
7842 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007843 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007844 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007845 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007846
7847 // Check is that viewportcount and scissorcount match
7848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7849 vp_state_ci.scissorCount = 1;
7850 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7851 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7852 m_errorMonitor->VerifyFound();
7853
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007854 // Check case where multiViewport is enabled and viewport count is greater than max
7855 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7858 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7859 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7860 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7861 m_errorMonitor->VerifyFound();
7862 }
7863 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007864
Chia-I Wuf7458c52015-10-26 21:10:41 +08007865 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7866 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7867 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7868 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007869}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007870
7871// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
7872// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007873TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007874 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007875
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007876 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7877
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007879
Tony Barbour1fa09702017-03-16 12:09:08 -06007880 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007882
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007883 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007884 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7885 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007886
7887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7889 ds_pool_ci.maxSets = 1;
7890 ds_pool_ci.poolSizeCount = 1;
7891 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007892
7893 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007894 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007895 ASSERT_VK_SUCCESS(err);
7896
7897 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007898 dsl_binding.binding = 0;
7899 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7900 dsl_binding.descriptorCount = 1;
7901 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007902
7903 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007904 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7905 ds_layout_ci.bindingCount = 1;
7906 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007907
7908 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007909 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910 ASSERT_VK_SUCCESS(err);
7911
7912 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007913 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007914 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007915 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007916 alloc_info.descriptorPool = ds_pool;
7917 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007918 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007919 ASSERT_VK_SUCCESS(err);
7920
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007921 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7922 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7923 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7924
7925 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7926 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7927 vi_ci.pNext = nullptr;
7928 vi_ci.vertexBindingDescriptionCount = 0;
7929 vi_ci.pVertexBindingDescriptions = nullptr;
7930 vi_ci.vertexAttributeDescriptionCount = 0;
7931 vi_ci.pVertexAttributeDescriptions = nullptr;
7932
7933 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7934 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7935 pipe_ms_state_ci.pNext = NULL;
7936 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7937 pipe_ms_state_ci.sampleShadingEnable = 0;
7938 pipe_ms_state_ci.minSampleShading = 1.0;
7939 pipe_ms_state_ci.pSampleMask = NULL;
7940
Tobin Ehlise68360f2015-10-01 11:15:13 -06007941 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007942 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7943 pipeline_layout_ci.setLayoutCount = 1;
7944 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007945
7946 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007947 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007948 ASSERT_VK_SUCCESS(err);
7949
7950 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7951 // Set scissor as dynamic to avoid second error
7952 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007953 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7954 dyn_state_ci.dynamicStateCount = 1;
7955 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007956
Cody Northropeb3a6c12015-10-05 14:44:45 -06007957 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007958 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007960 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007961 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7962 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007963 shaderStages[0] = vs.GetStageCreateInfo();
7964 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007965
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007966 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7967 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7968 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7969 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7970 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7971 rs_state_ci.depthClampEnable = VK_FALSE;
7972 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7973 rs_state_ci.depthBiasEnable = VK_FALSE;
7974
Tobin Ehlise68360f2015-10-01 11:15:13 -06007975 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007976 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7977 gp_ci.stageCount = 2;
7978 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007979 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007980 // Not setting VP state w/o dynamic vp state should cause validation error
7981 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007982 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007983 gp_ci.pVertexInputState = &vi_ci;
7984 gp_ci.pInputAssemblyState = &ia_ci;
7985 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007986 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7987 gp_ci.layout = pipeline_layout;
7988 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007989
7990 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007991 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992
7993 VkPipeline pipeline;
7994 VkPipelineCache pipelineCache;
7995
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007996 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007997 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007998 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007999
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008000 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008001
Chia-I Wuf7458c52015-10-26 21:10:41 +08008002 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8003 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8004 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8005 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008006}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008007
8008// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8009// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008010TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8011 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008012
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008014
Tony Barbour1fa09702017-03-16 12:09:08 -06008015 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008016
8017 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008018 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008019 return;
8020 }
8021
Tobin Ehlise68360f2015-10-01 11:15:13 -06008022 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008023
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008024 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008025 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8026 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008027
8028 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008029 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8030 ds_pool_ci.maxSets = 1;
8031 ds_pool_ci.poolSizeCount = 1;
8032 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008033
8034 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008035 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036 ASSERT_VK_SUCCESS(err);
8037
8038 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008039 dsl_binding.binding = 0;
8040 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8041 dsl_binding.descriptorCount = 1;
8042 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008043
8044 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008045 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8046 ds_layout_ci.bindingCount = 1;
8047 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008048
8049 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008050 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008051 ASSERT_VK_SUCCESS(err);
8052
8053 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008054 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008055 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008056 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008057 alloc_info.descriptorPool = ds_pool;
8058 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008059 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008060 ASSERT_VK_SUCCESS(err);
8061
8062 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008063 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8064 pipeline_layout_ci.setLayoutCount = 1;
8065 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008066
8067 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008068 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008069 ASSERT_VK_SUCCESS(err);
8070
8071 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008072 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8073 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008074 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008075 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008076 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008077
8078 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8079 // Set scissor as dynamic to avoid that error
8080 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008081 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8082 dyn_state_ci.dynamicStateCount = 1;
8083 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008084
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008085 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8086 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8087 pipe_ms_state_ci.pNext = NULL;
8088 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8089 pipe_ms_state_ci.sampleShadingEnable = 0;
8090 pipe_ms_state_ci.minSampleShading = 1.0;
8091 pipe_ms_state_ci.pSampleMask = NULL;
8092
Cody Northropeb3a6c12015-10-05 14:44:45 -06008093 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008094 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008095
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008096 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008097 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8098 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008099 shaderStages[0] = vs.GetStageCreateInfo();
8100 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008101
Cody Northropf6622dc2015-10-06 10:33:21 -06008102 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8103 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8104 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008105 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008106 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008107 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008108 vi_ci.pVertexAttributeDescriptions = nullptr;
8109
8110 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8111 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8112 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8113
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008114 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008115 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008116 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008117 rs_ci.pNext = nullptr;
8118
Mark Youngc89c6312016-03-31 16:03:20 -06008119 VkPipelineColorBlendAttachmentState att = {};
8120 att.blendEnable = VK_FALSE;
8121 att.colorWriteMask = 0xf;
8122
Cody Northropf6622dc2015-10-06 10:33:21 -06008123 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8124 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8125 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008126 cb_ci.attachmentCount = 1;
8127 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008128
Tobin Ehlise68360f2015-10-01 11:15:13 -06008129 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008130 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8131 gp_ci.stageCount = 2;
8132 gp_ci.pStages = shaderStages;
8133 gp_ci.pVertexInputState = &vi_ci;
8134 gp_ci.pInputAssemblyState = &ia_ci;
8135 gp_ci.pViewportState = &vp_state_ci;
8136 gp_ci.pRasterizationState = &rs_ci;
8137 gp_ci.pColorBlendState = &cb_ci;
8138 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008139 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008140 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8141 gp_ci.layout = pipeline_layout;
8142 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008143
8144 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008145 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008146
8147 VkPipeline pipeline;
8148 VkPipelineCache pipelineCache;
8149
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008150 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008151 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008152 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008153
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008154 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008155
Tobin Ehlisd332f282015-10-02 11:00:56 -06008156 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008157 // First need to successfully create the PSO from above by setting
8158 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008159 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008160
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008161 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008162 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008163 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008164 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008165 m_commandBuffer->BeginCommandBuffer();
8166 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008167 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008168 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008169 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008170 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008171 Draw(1, 0, 0, 0);
8172
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008173 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008174
8175 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8176 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8177 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8178 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008179 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008180}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008181
8182// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008183// viewportCount
8184TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8185 VkResult err;
8186
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008188
Tony Barbour1fa09702017-03-16 12:09:08 -06008189 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008190
8191 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008192 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008193 return;
8194 }
8195
Karl Schultz6addd812016-02-02 17:17:23 -07008196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8197
8198 VkDescriptorPoolSize ds_type_count = {};
8199 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8200 ds_type_count.descriptorCount = 1;
8201
8202 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8203 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8204 ds_pool_ci.maxSets = 1;
8205 ds_pool_ci.poolSizeCount = 1;
8206 ds_pool_ci.pPoolSizes = &ds_type_count;
8207
8208 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008209 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008210 ASSERT_VK_SUCCESS(err);
8211
8212 VkDescriptorSetLayoutBinding dsl_binding = {};
8213 dsl_binding.binding = 0;
8214 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8215 dsl_binding.descriptorCount = 1;
8216 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8217
8218 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8219 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8220 ds_layout_ci.bindingCount = 1;
8221 ds_layout_ci.pBindings = &dsl_binding;
8222
8223 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008224 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008225 ASSERT_VK_SUCCESS(err);
8226
8227 VkDescriptorSet descriptorSet;
8228 VkDescriptorSetAllocateInfo alloc_info = {};
8229 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8230 alloc_info.descriptorSetCount = 1;
8231 alloc_info.descriptorPool = ds_pool;
8232 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008233 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008234 ASSERT_VK_SUCCESS(err);
8235
8236 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8237 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8238 pipeline_layout_ci.setLayoutCount = 1;
8239 pipeline_layout_ci.pSetLayouts = &ds_layout;
8240
8241 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008242 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008243 ASSERT_VK_SUCCESS(err);
8244
8245 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8246 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8247 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008248 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008249 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008250 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008251
8252 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8253 // Set scissor as dynamic to avoid that error
8254 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8255 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8256 dyn_state_ci.dynamicStateCount = 1;
8257 dyn_state_ci.pDynamicStates = &vp_state;
8258
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008259 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8260 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8261 pipe_ms_state_ci.pNext = NULL;
8262 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8263 pipe_ms_state_ci.sampleShadingEnable = 0;
8264 pipe_ms_state_ci.minSampleShading = 1.0;
8265 pipe_ms_state_ci.pSampleMask = NULL;
8266
Karl Schultz6addd812016-02-02 17:17:23 -07008267 VkPipelineShaderStageCreateInfo shaderStages[2];
8268 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8269
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008270 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008271 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8272 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008273 shaderStages[0] = vs.GetStageCreateInfo();
8274 shaderStages[1] = fs.GetStageCreateInfo();
8275
8276 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8277 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8278 vi_ci.pNext = nullptr;
8279 vi_ci.vertexBindingDescriptionCount = 0;
8280 vi_ci.pVertexBindingDescriptions = nullptr;
8281 vi_ci.vertexAttributeDescriptionCount = 0;
8282 vi_ci.pVertexAttributeDescriptions = nullptr;
8283
8284 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8285 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8286 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8287
8288 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8289 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008290 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008291 rs_ci.pNext = nullptr;
8292
Mark Youngc89c6312016-03-31 16:03:20 -06008293 VkPipelineColorBlendAttachmentState att = {};
8294 att.blendEnable = VK_FALSE;
8295 att.colorWriteMask = 0xf;
8296
Karl Schultz6addd812016-02-02 17:17:23 -07008297 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8298 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8299 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008300 cb_ci.attachmentCount = 1;
8301 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008302
8303 VkGraphicsPipelineCreateInfo gp_ci = {};
8304 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8305 gp_ci.stageCount = 2;
8306 gp_ci.pStages = shaderStages;
8307 gp_ci.pVertexInputState = &vi_ci;
8308 gp_ci.pInputAssemblyState = &ia_ci;
8309 gp_ci.pViewportState = &vp_state_ci;
8310 gp_ci.pRasterizationState = &rs_ci;
8311 gp_ci.pColorBlendState = &cb_ci;
8312 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008313 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008314 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8315 gp_ci.layout = pipeline_layout;
8316 gp_ci.renderPass = renderPass();
8317
8318 VkPipelineCacheCreateInfo pc_ci = {};
8319 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8320
8321 VkPipeline pipeline;
8322 VkPipelineCache pipelineCache;
8323
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008324 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008325 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008326 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008328 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008329
8330 // Now hit second fail case where we set scissor w/ different count than PSO
8331 // First need to successfully create the PSO from above by setting
8332 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8334 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008335
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008336 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008337 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008338 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008339 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008340 m_commandBuffer->BeginCommandBuffer();
8341 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008343 VkViewport viewports[1] = {};
8344 viewports[0].width = 8;
8345 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008346 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008347 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008348 Draw(1, 0, 0, 0);
8349
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008350 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008351
Chia-I Wuf7458c52015-10-26 21:10:41 +08008352 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8353 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8354 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8355 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008356 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008357}
8358
Mark Young7394fdd2016-03-31 14:56:43 -06008359TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8360 VkResult err;
8361
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008363
Tony Barbour1fa09702017-03-16 12:09:08 -06008364 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8366
8367 VkDescriptorPoolSize ds_type_count = {};
8368 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8369 ds_type_count.descriptorCount = 1;
8370
8371 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8372 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8373 ds_pool_ci.maxSets = 1;
8374 ds_pool_ci.poolSizeCount = 1;
8375 ds_pool_ci.pPoolSizes = &ds_type_count;
8376
8377 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008378 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008379 ASSERT_VK_SUCCESS(err);
8380
8381 VkDescriptorSetLayoutBinding dsl_binding = {};
8382 dsl_binding.binding = 0;
8383 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8384 dsl_binding.descriptorCount = 1;
8385 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8386
8387 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8388 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8389 ds_layout_ci.bindingCount = 1;
8390 ds_layout_ci.pBindings = &dsl_binding;
8391
8392 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008393 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008394 ASSERT_VK_SUCCESS(err);
8395
8396 VkDescriptorSet descriptorSet;
8397 VkDescriptorSetAllocateInfo alloc_info = {};
8398 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8399 alloc_info.descriptorSetCount = 1;
8400 alloc_info.descriptorPool = ds_pool;
8401 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008402 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008403 ASSERT_VK_SUCCESS(err);
8404
8405 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8406 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8407 pipeline_layout_ci.setLayoutCount = 1;
8408 pipeline_layout_ci.pSetLayouts = &ds_layout;
8409
8410 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008411 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008412 ASSERT_VK_SUCCESS(err);
8413
8414 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8415 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8416 vp_state_ci.scissorCount = 1;
8417 vp_state_ci.pScissors = NULL;
8418 vp_state_ci.viewportCount = 1;
8419 vp_state_ci.pViewports = NULL;
8420
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008421 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008422 // Set scissor as dynamic to avoid that error
8423 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8424 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8425 dyn_state_ci.dynamicStateCount = 2;
8426 dyn_state_ci.pDynamicStates = dynamic_states;
8427
8428 VkPipelineShaderStageCreateInfo shaderStages[2];
8429 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8430
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008431 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8432 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008433 this); // TODO - We shouldn't need a fragment shader
8434 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008435 shaderStages[0] = vs.GetStageCreateInfo();
8436 shaderStages[1] = fs.GetStageCreateInfo();
8437
8438 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8439 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8440 vi_ci.pNext = nullptr;
8441 vi_ci.vertexBindingDescriptionCount = 0;
8442 vi_ci.pVertexBindingDescriptions = nullptr;
8443 vi_ci.vertexAttributeDescriptionCount = 0;
8444 vi_ci.pVertexAttributeDescriptions = nullptr;
8445
8446 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8447 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8448 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8449
8450 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8451 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8452 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008453 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008454
Mark Young47107952016-05-02 15:59:55 -06008455 // Check too low (line width of -1.0f).
8456 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008457
8458 VkPipelineColorBlendAttachmentState att = {};
8459 att.blendEnable = VK_FALSE;
8460 att.colorWriteMask = 0xf;
8461
8462 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8463 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8464 cb_ci.pNext = nullptr;
8465 cb_ci.attachmentCount = 1;
8466 cb_ci.pAttachments = &att;
8467
8468 VkGraphicsPipelineCreateInfo gp_ci = {};
8469 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8470 gp_ci.stageCount = 2;
8471 gp_ci.pStages = shaderStages;
8472 gp_ci.pVertexInputState = &vi_ci;
8473 gp_ci.pInputAssemblyState = &ia_ci;
8474 gp_ci.pViewportState = &vp_state_ci;
8475 gp_ci.pRasterizationState = &rs_ci;
8476 gp_ci.pColorBlendState = &cb_ci;
8477 gp_ci.pDynamicState = &dyn_state_ci;
8478 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8479 gp_ci.layout = pipeline_layout;
8480 gp_ci.renderPass = renderPass();
8481
8482 VkPipelineCacheCreateInfo pc_ci = {};
8483 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8484
8485 VkPipeline pipeline;
8486 VkPipelineCache pipelineCache;
8487
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008489 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008490 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008491
8492 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008493 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008494
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008496
8497 // Check too high (line width of 65536.0f).
8498 rs_ci.lineWidth = 65536.0f;
8499
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008500 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008501 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008502 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008503
8504 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008505 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008506
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008508
8509 dyn_state_ci.dynamicStateCount = 3;
8510
8511 rs_ci.lineWidth = 1.0f;
8512
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008513 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008514 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008515 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008516 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008517 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008518
8519 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008520 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008521 m_errorMonitor->VerifyFound();
8522
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008524
8525 // Check too high with dynamic setting.
8526 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8527 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008528 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008529
8530 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8531 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8532 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8533 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008534 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008535}
8536
Karl Schultz6addd812016-02-02 17:17:23 -07008537TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008538 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008540 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008541
Tony Barbour1fa09702017-03-16 12:09:08 -06008542 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008543 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008544
Tony Barbour552f6c02016-12-21 14:34:07 -07008545 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008546 // Don't care about RenderPass handle b/c error should be flagged before
8547 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008548 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008549
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008550 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008551}
8552
Karl Schultz6addd812016-02-02 17:17:23 -07008553TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008554 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8556 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008557
Tony Barbour1fa09702017-03-16 12:09:08 -06008558 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008560
Tony Barbour552f6c02016-12-21 14:34:07 -07008561 m_commandBuffer->BeginCommandBuffer();
8562 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008563 // Just create a dummy Renderpass that's non-NULL so we can get to the
8564 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008565 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008566
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008567 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008568}
8569
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008570TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008571 TEST_DESCRIPTION(
8572 "Begin a renderPass where clearValueCount is less than"
8573 "the number of renderPass attachments that use loadOp"
8574 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008575
Tony Barbour1fa09702017-03-16 12:09:08 -06008576 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8578
8579 // Create a renderPass with a single attachment that uses loadOp CLEAR
8580 VkAttachmentReference attach = {};
8581 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8582 VkSubpassDescription subpass = {};
8583 subpass.inputAttachmentCount = 1;
8584 subpass.pInputAttachments = &attach;
8585 VkRenderPassCreateInfo rpci = {};
8586 rpci.subpassCount = 1;
8587 rpci.pSubpasses = &subpass;
8588 rpci.attachmentCount = 1;
8589 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008590 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008591 // Set loadOp to CLEAR
8592 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8593 rpci.pAttachments = &attach_desc;
8594 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8595 VkRenderPass rp;
8596 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8597
8598 VkCommandBufferInheritanceInfo hinfo = {};
8599 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8600 hinfo.renderPass = VK_NULL_HANDLE;
8601 hinfo.subpass = 0;
8602 hinfo.framebuffer = VK_NULL_HANDLE;
8603 hinfo.occlusionQueryEnable = VK_FALSE;
8604 hinfo.queryFlags = 0;
8605 hinfo.pipelineStatistics = 0;
8606 VkCommandBufferBeginInfo info = {};
8607 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8608 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8609 info.pInheritanceInfo = &hinfo;
8610
8611 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8612 VkRenderPassBeginInfo rp_begin = {};
8613 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8614 rp_begin.pNext = NULL;
8615 rp_begin.renderPass = renderPass();
8616 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008617 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008618
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008620
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008621 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008622
8623 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008624
8625 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008626}
8627
Slawomir Cygan0808f392016-11-28 17:53:23 +01008628TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008629 TEST_DESCRIPTION(
8630 "Begin a renderPass where clearValueCount is greater than"
8631 "the number of renderPass attachments that use loadOp"
8632 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008633
Tony Barbour1fa09702017-03-16 12:09:08 -06008634 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8636
8637 // Create a renderPass with a single attachment that uses loadOp CLEAR
8638 VkAttachmentReference attach = {};
8639 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8640 VkSubpassDescription subpass = {};
8641 subpass.inputAttachmentCount = 1;
8642 subpass.pInputAttachments = &attach;
8643 VkRenderPassCreateInfo rpci = {};
8644 rpci.subpassCount = 1;
8645 rpci.pSubpasses = &subpass;
8646 rpci.attachmentCount = 1;
8647 VkAttachmentDescription attach_desc = {};
8648 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8649 // Set loadOp to CLEAR
8650 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8651 rpci.pAttachments = &attach_desc;
8652 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8653 VkRenderPass rp;
8654 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8655
8656 VkCommandBufferBeginInfo info = {};
8657 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8658 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8659
8660 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8661 VkRenderPassBeginInfo rp_begin = {};
8662 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8663 rp_begin.pNext = NULL;
8664 rp_begin.renderPass = renderPass();
8665 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008666 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008667
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8669 " has a clearValueCount of"
8670 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008671
8672 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8673
8674 m_errorMonitor->VerifyFound();
8675
8676 vkDestroyRenderPass(m_device->device(), rp, NULL);
8677}
8678
Cody Northrop3bb4d962016-05-09 16:15:57 -06008679TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008680 TEST_DESCRIPTION("End a command buffer with an active render pass");
8681
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8683 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008684
Tony Barbour1fa09702017-03-16 12:09:08 -06008685 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8687
Tony Barbour552f6c02016-12-21 14:34:07 -07008688 m_commandBuffer->BeginCommandBuffer();
8689 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8690 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008691
8692 m_errorMonitor->VerifyFound();
8693
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008694 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8695 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008696}
8697
Karl Schultz6addd812016-02-02 17:17:23 -07008698TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008699 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8701 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008702
Tony Barbour1fa09702017-03-16 12:09:08 -06008703 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008704 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008705
Tony Barbour552f6c02016-12-21 14:34:07 -07008706 m_commandBuffer->BeginCommandBuffer();
8707 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008708
8709 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008710 vk_testing::Buffer dstBuffer;
8711 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008712
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008713 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008714
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008715 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008716}
8717
Karl Schultz6addd812016-02-02 17:17:23 -07008718TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008719 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8721 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008722
Tony Barbour1fa09702017-03-16 12:09:08 -06008723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008725
Tony Barbour552f6c02016-12-21 14:34:07 -07008726 m_commandBuffer->BeginCommandBuffer();
8727 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008728
8729 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008730 vk_testing::Buffer dstBuffer;
8731 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008732
Karl Schultz6addd812016-02-02 17:17:23 -07008733 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008734 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8735 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8736 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008737
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008738 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008739}
8740
Karl Schultz6addd812016-02-02 17:17:23 -07008741TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008742 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8744 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008745
Tony Barbour1fa09702017-03-16 12:09:08 -06008746 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008748
Tony Barbour552f6c02016-12-21 14:34:07 -07008749 m_commandBuffer->BeginCommandBuffer();
8750 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008751
Michael Lentine0a369f62016-02-03 16:51:46 -06008752 VkClearColorValue clear_color;
8753 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008754 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8755 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8756 const int32_t tex_width = 32;
8757 const int32_t tex_height = 32;
8758 VkImageCreateInfo image_create_info = {};
8759 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8760 image_create_info.pNext = NULL;
8761 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8762 image_create_info.format = tex_format;
8763 image_create_info.extent.width = tex_width;
8764 image_create_info.extent.height = tex_height;
8765 image_create_info.extent.depth = 1;
8766 image_create_info.mipLevels = 1;
8767 image_create_info.arrayLayers = 1;
8768 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8769 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008770 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008771
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008772 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008773 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008774
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008775 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008776
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008777 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008778
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008779 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008780}
8781
Karl Schultz6addd812016-02-02 17:17:23 -07008782TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008783 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8785 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008786
Tony Barbour1fa09702017-03-16 12:09:08 -06008787 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008789
Dave Houlton1d2022c2017-03-29 11:43:58 -06008790 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008791 if (!depth_format) {
8792 printf(" No Depth + Stencil format found. Skipped.\n");
8793 return;
8794 }
8795
Tony Barbour552f6c02016-12-21 14:34:07 -07008796 m_commandBuffer->BeginCommandBuffer();
8797 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008798
8799 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008800 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008801 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8802 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008803 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008804 image_create_info.extent.width = 64;
8805 image_create_info.extent.height = 64;
8806 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8807 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008808
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008809 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008810 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008811
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008812 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008813
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008814 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8815 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008817 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008818}
8819
Karl Schultz6addd812016-02-02 17:17:23 -07008820TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008821 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008822 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008823
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8825 "vkCmdClearAttachments(): This call "
8826 "must be issued inside an active "
8827 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008828
Tony Barbour1fa09702017-03-16 12:09:08 -06008829 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008830 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008831
8832 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008833 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008834 ASSERT_VK_SUCCESS(err);
8835
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008836 VkClearAttachment color_attachment;
8837 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8838 color_attachment.clearValue.color.float32[0] = 0;
8839 color_attachment.clearValue.color.float32[1] = 0;
8840 color_attachment.clearValue.color.float32[2] = 0;
8841 color_attachment.clearValue.color.float32[3] = 0;
8842 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008843 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008844 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008845
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008846 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008847}
8848
Chris Forbes3b97e932016-09-07 11:29:24 +12008849TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008850 TEST_DESCRIPTION(
8851 "Test that an error is produced when CmdNextSubpass is "
8852 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008853
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8855 "vkCmdNextSubpass(): Attempted to advance "
8856 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008857
Tony Barbour1fa09702017-03-16 12:09:08 -06008858 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008859 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8860
Tony Barbour552f6c02016-12-21 14:34:07 -07008861 m_commandBuffer->BeginCommandBuffer();
8862 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008863
8864 // error here.
8865 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8866 m_errorMonitor->VerifyFound();
8867
Tony Barbour552f6c02016-12-21 14:34:07 -07008868 m_commandBuffer->EndRenderPass();
8869 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008870}
8871
Chris Forbes6d624702016-09-07 13:57:05 +12008872TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008873 TEST_DESCRIPTION(
8874 "Test that an error is produced when CmdEndRenderPass is "
8875 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008876
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008877 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8878 "vkCmdEndRenderPass(): Called before reaching "
8879 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008880
Tony Barbour1fa09702017-03-16 12:09:08 -06008881 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008882 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8883 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008884
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008885 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008886
8887 VkRenderPass rp;
8888 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8889 ASSERT_VK_SUCCESS(err);
8890
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008891 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008892
8893 VkFramebuffer fb;
8894 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8895 ASSERT_VK_SUCCESS(err);
8896
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008897 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008898
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008899 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008900
8901 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8902
8903 // Error here.
8904 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8905 m_errorMonitor->VerifyFound();
8906
8907 // Clean up.
8908 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8909 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8910}
8911
Karl Schultz9e66a292016-04-21 15:57:51 -06008912TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8913 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8915 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008916
Tony Barbour1fa09702017-03-16 12:09:08 -06008917 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008918 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008919
8920 VkBufferMemoryBarrier buf_barrier = {};
8921 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8922 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8923 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8924 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8925 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8926 buf_barrier.buffer = VK_NULL_HANDLE;
8927 buf_barrier.offset = 0;
8928 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8930 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008931
8932 m_errorMonitor->VerifyFound();
8933}
8934
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008935TEST_F(VkLayerTest, InvalidBarriers) {
8936 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8937
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008939
Tony Barbour1fa09702017-03-16 12:09:08 -06008940 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06008941 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008942 if (!depth_format) {
8943 printf(" No Depth + Stencil format found. Skipped.\n");
8944 return;
8945 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008946 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8947
8948 VkMemoryBarrier mem_barrier = {};
8949 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8950 mem_barrier.pNext = NULL;
8951 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8952 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008953 m_commandBuffer->BeginCommandBuffer();
8954 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008955 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008956 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008957 &mem_barrier, 0, nullptr, 0, nullptr);
8958 m_errorMonitor->VerifyFound();
8959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008961 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06008962 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008963 ASSERT_TRUE(image.initialized());
8964 VkImageMemoryBarrier img_barrier = {};
8965 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8966 img_barrier.pNext = NULL;
8967 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8968 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8969 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8970 // New layout can't be UNDEFINED
8971 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8972 img_barrier.image = image.handle();
8973 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8974 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8975 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8976 img_barrier.subresourceRange.baseArrayLayer = 0;
8977 img_barrier.subresourceRange.baseMipLevel = 0;
8978 img_barrier.subresourceRange.layerCount = 1;
8979 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008980 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8981 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008982 m_errorMonitor->VerifyFound();
8983 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8984
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8986 "Subresource must have the sum of the "
8987 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008988 // baseArrayLayer + layerCount must be <= image's arrayLayers
8989 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008990 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8991 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008992 m_errorMonitor->VerifyFound();
8993 img_barrier.subresourceRange.baseArrayLayer = 0;
8994
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008996 // baseMipLevel + levelCount must be <= image's mipLevels
8997 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008998 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8999 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009000 m_errorMonitor->VerifyFound();
9001 img_barrier.subresourceRange.baseMipLevel = 0;
9002
Mike Weiblen7053aa32017-01-25 15:21:10 -07009003 // levelCount must be non-zero.
9004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9005 img_barrier.subresourceRange.levelCount = 0;
9006 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9007 nullptr, 0, nullptr, 1, &img_barrier);
9008 m_errorMonitor->VerifyFound();
9009 img_barrier.subresourceRange.levelCount = 1;
9010
9011 // layerCount must be non-zero.
9012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9013 img_barrier.subresourceRange.layerCount = 0;
9014 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9015 nullptr, 0, nullptr, 1, &img_barrier);
9016 m_errorMonitor->VerifyFound();
9017 img_barrier.subresourceRange.layerCount = 1;
9018
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009020 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009021 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9022 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023 VkBufferMemoryBarrier buf_barrier = {};
9024 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9025 buf_barrier.pNext = NULL;
9026 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9027 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9028 buf_barrier.buffer = buffer.handle();
9029 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9030 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9031 buf_barrier.offset = 0;
9032 buf_barrier.size = VK_WHOLE_SIZE;
9033 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009034 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9035 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009036 m_errorMonitor->VerifyFound();
9037 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9038
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009040 buf_barrier.offset = 257;
9041 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009042 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9043 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009044 m_errorMonitor->VerifyFound();
9045 buf_barrier.offset = 0;
9046
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009048 buf_barrier.size = 257;
9049 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009050 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9051 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009052 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009053
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009054 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009055 m_errorMonitor->SetDesiredFailureMsg(
9056 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009057 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009058 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009059 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009060 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009061 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9062 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009063 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009064
9065 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009066 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009067 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9068 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009069 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009070
9071 // Having anything other than DEPTH or STENCIL is an error
9072 m_errorMonitor->SetDesiredFailureMsg(
9073 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9074 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9075 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9076 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9077 nullptr, 0, nullptr, 1, &img_barrier);
9078 m_errorMonitor->VerifyFound();
9079
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009080 // Now test depth-only
9081 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009082 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9083 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009084 VkDepthStencilObj d_image(m_device);
9085 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9086 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009087 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009088 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009089 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009090
9091 // DEPTH bit must be set
9092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9093 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009094 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009095 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9096 0, nullptr, 0, nullptr, 1, &img_barrier);
9097 m_errorMonitor->VerifyFound();
9098
9099 // No bits other than DEPTH may be set
9100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9101 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9102 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009103 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9104 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009105 m_errorMonitor->VerifyFound();
9106 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009107
9108 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009109 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9110 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009111 VkDepthStencilObj s_image(m_device);
9112 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9113 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009114 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009115 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009116 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009117 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9119 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009120 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009121 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9122 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009123 m_errorMonitor->VerifyFound();
9124 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009125
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009126 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009127 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009128 c_image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009129 ASSERT_TRUE(c_image.initialized());
9130 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9131 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9132 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009133
9134 // COLOR bit must be set
9135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9136 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009137 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009138 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9139 nullptr, 0, nullptr, 1, &img_barrier);
9140 m_errorMonitor->VerifyFound();
9141
9142 // No bits other than COLOR may be set
9143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9144 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9145 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009146 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9147 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009148 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009149
Mike Weiblene6e01172017-03-07 22:18:40 -07009150 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9151 {
9152 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009153 img_color.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009154 ASSERT_TRUE(img_color.initialized());
9155
9156 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009157 img_ds.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009158 ASSERT_TRUE(img_ds.initialized());
9159
9160 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009161 img_xfer_src.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009162 ASSERT_TRUE(img_xfer_src.initialized());
9163
9164 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009165 img_xfer_dst.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009166 ASSERT_TRUE(img_xfer_dst.initialized());
9167
9168 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009169 img_sampled.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009170 ASSERT_TRUE(img_sampled.initialized());
9171
9172 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009173 img_input.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009174 ASSERT_TRUE(img_input.initialized());
9175
9176 const struct {
9177 VkImageObj &image_obj;
9178 VkImageLayout bad_layout;
9179 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9180 } bad_buffer_layouts[] = {
9181 // clang-format off
9182 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9183 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9184 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9185 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9186 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9187 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9188 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9189 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9190 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9191 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9192 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9193 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9194 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9195 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9196 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9197 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9198 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9199 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9200 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9201 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9202 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9203 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9204 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9205 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9206 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9207 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9208 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9209 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9210 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9211 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9212 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9213 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9214 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9215 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9216 // clang-format on
9217 };
9218 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9219
9220 for (uint32_t i = 0; i < layout_count; ++i) {
9221 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9222 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9223 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9224 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9225 : VK_IMAGE_ASPECT_COLOR_BIT;
9226
9227 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9228 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9230 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9231 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9232 m_errorMonitor->VerifyFound();
9233
9234 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9235 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9237 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9238 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9239 m_errorMonitor->VerifyFound();
9240 }
9241
9242 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9243 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9244 }
9245
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009246 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9247
9248 // Create command pool with incompatible queueflags
9249 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009250 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009251 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009252 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009253 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009254 }
9255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9256
9257 VkCommandPool command_pool;
9258 VkCommandPoolCreateInfo pool_create_info{};
9259 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9260 pool_create_info.queueFamilyIndex = queue_family_index;
9261 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9262 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9263
9264 // Allocate a command buffer
9265 VkCommandBuffer bad_command_buffer;
9266 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9267 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9268 command_buffer_allocate_info.commandPool = command_pool;
9269 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9270 command_buffer_allocate_info.commandBufferCount = 1;
9271 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9272
9273 VkCommandBufferBeginInfo cbbi = {};
9274 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9275 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9276 buf_barrier.offset = 0;
9277 buf_barrier.size = VK_WHOLE_SIZE;
9278 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9279 &buf_barrier, 0, nullptr);
9280 m_errorMonitor->VerifyFound();
9281
9282 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9283 vkEndCommandBuffer(bad_command_buffer);
9284 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009285 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009286 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009287 }
9288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9289 VkEvent event;
9290 VkEventCreateInfo event_create_info{};
9291 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9292 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9293 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9294 nullptr, 0, nullptr);
9295 m_errorMonitor->VerifyFound();
9296
9297 vkEndCommandBuffer(bad_command_buffer);
9298 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009299}
9300
Tony Barbour18ba25c2016-09-29 13:42:40 -06009301TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9302 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9303
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009305 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009306 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009307 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
Mike Weiblen62d08a32017-03-07 22:18:27 -07009308 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009309 ASSERT_TRUE(image.initialized());
9310
9311 VkImageMemoryBarrier barrier = {};
9312 VkImageSubresourceRange range;
9313 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9314 barrier.srcAccessMask = 0;
9315 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9316 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9317 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9318 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9319 barrier.image = image.handle();
9320 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9321 range.baseMipLevel = 0;
9322 range.levelCount = 1;
9323 range.baseArrayLayer = 0;
9324 range.layerCount = 1;
9325 barrier.subresourceRange = range;
9326 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9327 cmdbuf.BeginCommandBuffer();
9328 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9329 &barrier);
9330 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9331 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9332 barrier.srcAccessMask = 0;
9333 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9334 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9335 &barrier);
9336
9337 m_errorMonitor->VerifyFound();
9338}
9339
Karl Schultz6addd812016-02-02 17:17:23 -07009340TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009341 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009342 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009343 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009344
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009345 uint32_t const indices[] = {0};
9346 VkBufferCreateInfo buf_info = {};
9347 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9348 buf_info.size = 1024;
9349 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9350 buf_info.queueFamilyIndexCount = 1;
9351 buf_info.pQueueFamilyIndices = indices;
9352
9353 VkBuffer buffer;
9354 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9355 ASSERT_VK_SUCCESS(err);
9356
9357 VkMemoryRequirements requirements;
9358 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9359
9360 VkMemoryAllocateInfo alloc_info{};
9361 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9362 alloc_info.pNext = NULL;
9363 alloc_info.memoryTypeIndex = 0;
9364 alloc_info.allocationSize = requirements.size;
9365 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9366 ASSERT_TRUE(pass);
9367
9368 VkDeviceMemory memory;
9369 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9370 ASSERT_VK_SUCCESS(err);
9371
9372 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009373 ASSERT_VK_SUCCESS(err);
9374
Tony Barbour552f6c02016-12-21 14:34:07 -07009375 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009376 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009377
Karl Schultz6addd812016-02-02 17:17:23 -07009378 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9379 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009380 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009381 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9382 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009383 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009384
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009385 vkFreeMemory(m_device->device(), memory, NULL);
9386 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009387}
9388
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009389TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9390 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009391 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9393 VkBufferCreateInfo buffCI = {};
9394 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9395 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009396 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009397 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009398 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009399 uint32_t qfi[2];
9400 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009401 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009402
9403 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009404 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009405
9406 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9408 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9409 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009410 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009411 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009412
9413 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009414 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009415 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9416
9417 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9418 buffCI.queueFamilyIndexCount = 2;
9419 qfi[0] = 1;
9420 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009421 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009422 VkDeviceMemory mem;
9423 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009424 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009425
9426 VkMemoryAllocateInfo alloc_info = {};
9427 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9428 alloc_info.allocationSize = 1024;
9429 bool pass = false;
9430 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9431 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009432 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009433 return;
9434 }
9435 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009436 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009437
9438 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009439 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009440 m_commandBuffer->end();
9441 QueueCommandBuffer(false);
9442 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009443 vkDestroyBuffer(m_device->device(), ib2, NULL);
9444 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009445 }
9446
Tony Barbourdf4c0042016-06-01 15:55:43 -06009447 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009448}
9449
Karl Schultz6addd812016-02-02 17:17:23 -07009450TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009451 TEST_DESCRIPTION(
9452 "Attempt vkCmdExecuteCommands with a primary command buffer"
9453 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009454
Tony Barbour1fa09702017-03-16 12:09:08 -06009455 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009457
Chris Forbesf29a84f2016-10-06 18:39:28 +13009458 // An empty primary command buffer
9459 VkCommandBufferObj cb(m_device, m_commandPool);
9460 cb.BeginCommandBuffer();
9461 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009462
Chris Forbesf29a84f2016-10-06 18:39:28 +13009463 m_commandBuffer->BeginCommandBuffer();
9464 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9465 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009466
Chris Forbesf29a84f2016-10-06 18:39:28 +13009467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9468 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009469 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009470
9471 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009472}
9473
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009474TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009475 TEST_DESCRIPTION(
9476 "Attempt to update descriptor sets for images and buffers "
9477 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009478 VkResult err;
9479
Tony Barbour1fa09702017-03-16 12:09:08 -06009480 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009481 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9482 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9483 ds_type_count[i].type = VkDescriptorType(i);
9484 ds_type_count[i].descriptorCount = 1;
9485 }
9486 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9487 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9488 ds_pool_ci.pNext = NULL;
9489 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9490 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9491 ds_pool_ci.pPoolSizes = ds_type_count;
9492
9493 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009494 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009495 ASSERT_VK_SUCCESS(err);
9496
9497 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009498 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009499 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9500 dsl_binding[i].binding = 0;
9501 dsl_binding[i].descriptorType = VkDescriptorType(i);
9502 dsl_binding[i].descriptorCount = 1;
9503 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9504 dsl_binding[i].pImmutableSamplers = NULL;
9505 }
9506
9507 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9508 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9509 ds_layout_ci.pNext = NULL;
9510 ds_layout_ci.bindingCount = 1;
9511 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9512 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9513 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009515 ASSERT_VK_SUCCESS(err);
9516 }
9517 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9518 VkDescriptorSetAllocateInfo alloc_info = {};
9519 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9520 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9521 alloc_info.descriptorPool = ds_pool;
9522 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009523 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009524 ASSERT_VK_SUCCESS(err);
9525
9526 // Create a buffer & bufferView to be used for invalid updates
9527 VkBufferCreateInfo buff_ci = {};
9528 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009529 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009530 buff_ci.size = 256;
9531 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009532 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009533 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9534 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009535
9536 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9537 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9538 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9539 ASSERT_VK_SUCCESS(err);
9540
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009541 VkMemoryRequirements mem_reqs;
9542 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9543 VkMemoryAllocateInfo mem_alloc_info = {};
9544 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9545 mem_alloc_info.pNext = NULL;
9546 mem_alloc_info.memoryTypeIndex = 0;
9547 mem_alloc_info.allocationSize = mem_reqs.size;
9548 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9549 if (!pass) {
9550 vkDestroyBuffer(m_device->device(), buffer, NULL);
9551 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9552 return;
9553 }
9554 VkDeviceMemory mem;
9555 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9556 ASSERT_VK_SUCCESS(err);
9557 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9558 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009559
9560 VkBufferViewCreateInfo buff_view_ci = {};
9561 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9562 buff_view_ci.buffer = buffer;
9563 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9564 buff_view_ci.range = VK_WHOLE_SIZE;
9565 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009566 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009567 ASSERT_VK_SUCCESS(err);
9568
Tony Barbour415497c2017-01-24 10:06:09 -07009569 // Now get resources / view for storage_texel_buffer
9570 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9571 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9572 if (!pass) {
9573 vkDestroyBuffer(m_device->device(), buffer, NULL);
9574 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9575 vkFreeMemory(m_device->device(), mem, NULL);
9576 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9577 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9578 return;
9579 }
9580 VkDeviceMemory storage_texel_buffer_mem;
9581 VkBufferView storage_texel_buffer_view;
9582 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9583 ASSERT_VK_SUCCESS(err);
9584 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9585 ASSERT_VK_SUCCESS(err);
9586 buff_view_ci.buffer = storage_texel_buffer;
9587 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9588 ASSERT_VK_SUCCESS(err);
9589
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009590 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009591 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009592 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009593 image_ci.format = VK_FORMAT_UNDEFINED;
9594 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9595 VkFormat format = static_cast<VkFormat>(f);
9596 VkFormatProperties fProps = m_device->format_properties(format);
9597 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9598 image_ci.format = format;
9599 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9600 break;
9601 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9602 image_ci.format = format;
9603 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9604 break;
9605 }
9606 }
9607 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9608 return;
9609 }
9610
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009611 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9612 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009613 image_ci.extent.width = 64;
9614 image_ci.extent.height = 64;
9615 image_ci.extent.depth = 1;
9616 image_ci.mipLevels = 1;
9617 image_ci.arrayLayers = 1;
9618 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009619 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009620 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009621 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9622 VkImage image;
9623 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9624 ASSERT_VK_SUCCESS(err);
9625 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009626 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009627
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009628 VkMemoryAllocateInfo mem_alloc = {};
9629 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9630 mem_alloc.pNext = NULL;
9631 mem_alloc.allocationSize = 0;
9632 mem_alloc.memoryTypeIndex = 0;
9633 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9634 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009635 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009636 ASSERT_TRUE(pass);
9637 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9638 ASSERT_VK_SUCCESS(err);
9639 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9640 ASSERT_VK_SUCCESS(err);
9641 // Now create view for image
9642 VkImageViewCreateInfo image_view_ci = {};
9643 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9644 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009645 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009646 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9647 image_view_ci.subresourceRange.layerCount = 1;
9648 image_view_ci.subresourceRange.baseArrayLayer = 0;
9649 image_view_ci.subresourceRange.levelCount = 1;
9650 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9651 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009652 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009653 ASSERT_VK_SUCCESS(err);
9654
9655 VkDescriptorBufferInfo buff_info = {};
9656 buff_info.buffer = buffer;
9657 VkDescriptorImageInfo img_info = {};
9658 img_info.imageView = image_view;
9659 VkWriteDescriptorSet descriptor_write = {};
9660 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9661 descriptor_write.dstBinding = 0;
9662 descriptor_write.descriptorCount = 1;
9663 descriptor_write.pTexelBufferView = &buff_view;
9664 descriptor_write.pBufferInfo = &buff_info;
9665 descriptor_write.pImageInfo = &img_info;
9666
9667 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009668 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009669 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9670 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9671 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9672 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9673 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9674 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9675 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9676 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9677 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9678 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9679 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009680 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 // Start loop at 1 as SAMPLER desc type has no usage bit error
9682 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009683 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9684 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9685 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9686 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009687 descriptor_write.descriptorType = VkDescriptorType(i);
9688 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009690
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009692
9693 m_errorMonitor->VerifyFound();
9694 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009695 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9696 descriptor_write.pTexelBufferView = &buff_view;
9697 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009698 }
Tony Barbour415497c2017-01-24 10:06:09 -07009699
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009700 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9701 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009702 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009703 vkDestroyImageView(m_device->device(), image_view, NULL);
9704 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009705 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009706 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009707 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009708 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009709 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009710 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9711}
9712
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009713TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009714 TEST_DESCRIPTION(
9715 "Attempt to update buffer descriptor set that has incorrect "
9716 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009717 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009718 "2. range value of 0\n"
9719 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009720 VkResult err;
9721
Tony Barbour1fa09702017-03-16 12:09:08 -06009722 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009723 VkDescriptorPoolSize ds_type_count = {};
9724 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9725 ds_type_count.descriptorCount = 1;
9726
9727 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9728 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9729 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009730 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009731 ds_pool_ci.maxSets = 1;
9732 ds_pool_ci.poolSizeCount = 1;
9733 ds_pool_ci.pPoolSizes = &ds_type_count;
9734
9735 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009736 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009737 ASSERT_VK_SUCCESS(err);
9738
9739 // Create layout with single uniform buffer descriptor
9740 VkDescriptorSetLayoutBinding dsl_binding = {};
9741 dsl_binding.binding = 0;
9742 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9743 dsl_binding.descriptorCount = 1;
9744 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9745 dsl_binding.pImmutableSamplers = NULL;
9746
9747 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9748 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9749 ds_layout_ci.pNext = NULL;
9750 ds_layout_ci.bindingCount = 1;
9751 ds_layout_ci.pBindings = &dsl_binding;
9752 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009753 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009754 ASSERT_VK_SUCCESS(err);
9755
9756 VkDescriptorSet descriptor_set = {};
9757 VkDescriptorSetAllocateInfo alloc_info = {};
9758 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9759 alloc_info.descriptorSetCount = 1;
9760 alloc_info.descriptorPool = ds_pool;
9761 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009762 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009763 ASSERT_VK_SUCCESS(err);
9764
9765 // Create a buffer to be used for invalid updates
9766 VkBufferCreateInfo buff_ci = {};
9767 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9768 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009769 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009770 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9771 VkBuffer buffer;
9772 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9773 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009774
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009775 // Have to bind memory to buffer before descriptor update
9776 VkMemoryAllocateInfo mem_alloc = {};
9777 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9778 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009779 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009780 mem_alloc.memoryTypeIndex = 0;
9781
9782 VkMemoryRequirements mem_reqs;
9783 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009784 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009785 if (!pass) {
9786 vkDestroyBuffer(m_device->device(), buffer, NULL);
9787 return;
9788 }
9789
9790 VkDeviceMemory mem;
9791 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9792 ASSERT_VK_SUCCESS(err);
9793 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9794 ASSERT_VK_SUCCESS(err);
9795
9796 VkDescriptorBufferInfo buff_info = {};
9797 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009798 // Cause error due to offset out of range
9799 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009800 buff_info.range = VK_WHOLE_SIZE;
9801 VkWriteDescriptorSet descriptor_write = {};
9802 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9803 descriptor_write.dstBinding = 0;
9804 descriptor_write.descriptorCount = 1;
9805 descriptor_write.pTexelBufferView = nullptr;
9806 descriptor_write.pBufferInfo = &buff_info;
9807 descriptor_write.pImageInfo = nullptr;
9808
9809 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9810 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009812
9813 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9814
9815 m_errorMonitor->VerifyFound();
9816 // Now cause error due to range of 0
9817 buff_info.offset = 0;
9818 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009820
9821 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9822
9823 m_errorMonitor->VerifyFound();
9824 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009825 buff_info.offset = 0;
9826 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009828
9829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9830
9831 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009832 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009833 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9834 vkDestroyBuffer(m_device->device(), buffer, NULL);
9835 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9836 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9837}
9838
Tobin Ehlis845887e2017-02-02 19:01:44 -07009839TEST_F(VkLayerTest, DSBufferLimitErrors) {
9840 TEST_DESCRIPTION(
9841 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9842 "Test cases include:\n"
9843 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9844 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9845 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9846 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9847 VkResult err;
9848
Tony Barbour1fa09702017-03-16 12:09:08 -06009849 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009850 VkDescriptorPoolSize ds_type_count[2] = {};
9851 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9852 ds_type_count[0].descriptorCount = 1;
9853 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9854 ds_type_count[1].descriptorCount = 1;
9855
9856 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9857 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9858 ds_pool_ci.pNext = NULL;
9859 ds_pool_ci.maxSets = 1;
9860 ds_pool_ci.poolSizeCount = 2;
9861 ds_pool_ci.pPoolSizes = ds_type_count;
9862
9863 VkDescriptorPool ds_pool;
9864 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9865 ASSERT_VK_SUCCESS(err);
9866
9867 // Create layout with single uniform buffer & single storage buffer descriptor
9868 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9869 dsl_binding[0].binding = 0;
9870 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9871 dsl_binding[0].descriptorCount = 1;
9872 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9873 dsl_binding[0].pImmutableSamplers = NULL;
9874 dsl_binding[1].binding = 1;
9875 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9876 dsl_binding[1].descriptorCount = 1;
9877 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9878 dsl_binding[1].pImmutableSamplers = NULL;
9879
9880 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9881 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9882 ds_layout_ci.pNext = NULL;
9883 ds_layout_ci.bindingCount = 2;
9884 ds_layout_ci.pBindings = dsl_binding;
9885 VkDescriptorSetLayout ds_layout;
9886 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9887 ASSERT_VK_SUCCESS(err);
9888
9889 VkDescriptorSet descriptor_set = {};
9890 VkDescriptorSetAllocateInfo alloc_info = {};
9891 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9892 alloc_info.descriptorSetCount = 1;
9893 alloc_info.descriptorPool = ds_pool;
9894 alloc_info.pSetLayouts = &ds_layout;
9895 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9896 ASSERT_VK_SUCCESS(err);
9897
9898 // Create a buffer to be used for invalid updates
9899 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9900 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9901 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9902 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9903 VkBufferCreateInfo ub_ci = {};
9904 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9905 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9906 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9907 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9908 VkBuffer uniform_buffer;
9909 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9910 ASSERT_VK_SUCCESS(err);
9911 VkBufferCreateInfo sb_ci = {};
9912 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9913 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9914 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9915 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9916 VkBuffer storage_buffer;
9917 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9918 ASSERT_VK_SUCCESS(err);
9919 // Have to bind memory to buffer before descriptor update
9920 VkMemoryAllocateInfo mem_alloc = {};
9921 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9922 mem_alloc.pNext = NULL;
9923 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9924 mem_alloc.memoryTypeIndex = 0;
9925
Cort Stratton77a0d592017-02-17 13:14:13 -08009926 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9927 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9928 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9929 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9930 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009931 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009932 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009933 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009934 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9935 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009936 return;
9937 }
9938
9939 VkDeviceMemory mem;
9940 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009941 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009942 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009943 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9944 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9945 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9946 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9947 return;
9948 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009949 ASSERT_VK_SUCCESS(err);
9950 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9951 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009952 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009953 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9954 ASSERT_VK_SUCCESS(err);
9955
9956 VkDescriptorBufferInfo buff_info = {};
9957 buff_info.buffer = uniform_buffer;
9958 buff_info.range = ub_ci.size; // This will exceed limit
9959 VkWriteDescriptorSet descriptor_write = {};
9960 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9961 descriptor_write.dstBinding = 0;
9962 descriptor_write.descriptorCount = 1;
9963 descriptor_write.pTexelBufferView = nullptr;
9964 descriptor_write.pBufferInfo = &buff_info;
9965 descriptor_write.pImageInfo = nullptr;
9966
9967 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9968 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009969 if (max_ub_range != UINT32_MAX) {
9970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9971 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9972 m_errorMonitor->VerifyFound();
9973 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009974 // Reduce size of range to acceptable limit & cause offset error
9975 buff_info.range = max_ub_range;
9976 buff_info.offset = min_ub_align - 1;
9977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9978 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9979 m_errorMonitor->VerifyFound();
9980
9981 // Now break storage updates
9982 buff_info.buffer = storage_buffer;
9983 buff_info.range = sb_ci.size; // This will exceed limit
9984 buff_info.offset = 0; // Reset offset for this update
9985
9986 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9987 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009988 if (max_ub_range != UINT32_MAX) {
9989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9990 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9991 m_errorMonitor->VerifyFound();
9992 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009993
9994 // Reduce size of range to acceptable limit & cause offset error
9995 buff_info.range = max_sb_range;
9996 buff_info.offset = min_sb_align - 1;
9997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9998 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9999 m_errorMonitor->VerifyFound();
10000
10001 vkFreeMemory(m_device->device(), mem, NULL);
10002 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10003 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10004 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10005 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10006}
10007
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010008TEST_F(VkLayerTest, DSAspectBitsErrors) {
10009 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10010 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010011 TEST_DESCRIPTION(
10012 "Attempt to update descriptor sets for images "
10013 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010014 VkResult err;
10015
Tony Barbour1fa09702017-03-16 12:09:08 -060010016 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010017 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010018 if (!depth_format) {
10019 printf(" No Depth + Stencil format found. Skipped.\n");
10020 return;
10021 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010022 VkDescriptorPoolSize ds_type_count = {};
10023 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10024 ds_type_count.descriptorCount = 1;
10025
10026 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10027 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10028 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010029 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010030 ds_pool_ci.maxSets = 5;
10031 ds_pool_ci.poolSizeCount = 1;
10032 ds_pool_ci.pPoolSizes = &ds_type_count;
10033
10034 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010035 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010036 ASSERT_VK_SUCCESS(err);
10037
10038 VkDescriptorSetLayoutBinding dsl_binding = {};
10039 dsl_binding.binding = 0;
10040 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10041 dsl_binding.descriptorCount = 1;
10042 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10043 dsl_binding.pImmutableSamplers = NULL;
10044
10045 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10046 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10047 ds_layout_ci.pNext = NULL;
10048 ds_layout_ci.bindingCount = 1;
10049 ds_layout_ci.pBindings = &dsl_binding;
10050 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010051 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010052 ASSERT_VK_SUCCESS(err);
10053
10054 VkDescriptorSet descriptor_set = {};
10055 VkDescriptorSetAllocateInfo alloc_info = {};
10056 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10057 alloc_info.descriptorSetCount = 1;
10058 alloc_info.descriptorPool = ds_pool;
10059 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010060 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010061 ASSERT_VK_SUCCESS(err);
10062
10063 // Create an image to be used for invalid updates
10064 VkImageCreateInfo image_ci = {};
10065 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10066 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010067 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010068 image_ci.extent.width = 64;
10069 image_ci.extent.height = 64;
10070 image_ci.extent.depth = 1;
10071 image_ci.mipLevels = 1;
10072 image_ci.arrayLayers = 1;
10073 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010074 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010075 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10076 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10077 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10078 VkImage image;
10079 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10080 ASSERT_VK_SUCCESS(err);
10081 // Bind memory to image
10082 VkMemoryRequirements mem_reqs;
10083 VkDeviceMemory image_mem;
10084 bool pass;
10085 VkMemoryAllocateInfo mem_alloc = {};
10086 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10087 mem_alloc.pNext = NULL;
10088 mem_alloc.allocationSize = 0;
10089 mem_alloc.memoryTypeIndex = 0;
10090 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10091 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010092 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010093 ASSERT_TRUE(pass);
10094 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10095 ASSERT_VK_SUCCESS(err);
10096 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10097 ASSERT_VK_SUCCESS(err);
10098 // Now create view for image
10099 VkImageViewCreateInfo image_view_ci = {};
10100 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10101 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010102 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010103 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10104 image_view_ci.subresourceRange.layerCount = 1;
10105 image_view_ci.subresourceRange.baseArrayLayer = 0;
10106 image_view_ci.subresourceRange.levelCount = 1;
10107 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010108 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010109
10110 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010111 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010112 ASSERT_VK_SUCCESS(err);
10113
10114 VkDescriptorImageInfo img_info = {};
10115 img_info.imageView = image_view;
10116 VkWriteDescriptorSet descriptor_write = {};
10117 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10118 descriptor_write.dstBinding = 0;
10119 descriptor_write.descriptorCount = 1;
10120 descriptor_write.pTexelBufferView = NULL;
10121 descriptor_write.pBufferInfo = NULL;
10122 descriptor_write.pImageInfo = &img_info;
10123 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10124 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010125 const char *error_msg =
10126 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10127 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010129
10130 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10131
10132 m_errorMonitor->VerifyFound();
10133 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10134 vkDestroyImage(m_device->device(), image, NULL);
10135 vkFreeMemory(m_device->device(), image_mem, NULL);
10136 vkDestroyImageView(m_device->device(), image_view, NULL);
10137 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10138 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10139}
10140
Karl Schultz6addd812016-02-02 17:17:23 -070010141TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010142 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010143 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010144
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10146 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10147 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010148
Tony Barbour1fa09702017-03-16 12:09:08 -060010149 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010150 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010151 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010152 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10153 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010154
10155 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010156 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10157 ds_pool_ci.pNext = NULL;
10158 ds_pool_ci.maxSets = 1;
10159 ds_pool_ci.poolSizeCount = 1;
10160 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010161
Tobin Ehlis3b780662015-05-28 12:11:26 -060010162 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010163 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010164 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010165 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010166 dsl_binding.binding = 0;
10167 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10168 dsl_binding.descriptorCount = 1;
10169 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10170 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010171
Tony Barboureb254902015-07-15 12:50:33 -060010172 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010173 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10174 ds_layout_ci.pNext = NULL;
10175 ds_layout_ci.bindingCount = 1;
10176 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010177
Tobin Ehlis3b780662015-05-28 12:11:26 -060010178 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010179 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010180 ASSERT_VK_SUCCESS(err);
10181
10182 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010183 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010184 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010185 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010186 alloc_info.descriptorPool = ds_pool;
10187 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010188 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010189 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010190
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010191 VkSamplerCreateInfo sampler_ci = {};
10192 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10193 sampler_ci.pNext = NULL;
10194 sampler_ci.magFilter = VK_FILTER_NEAREST;
10195 sampler_ci.minFilter = VK_FILTER_NEAREST;
10196 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10197 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10198 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10199 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10200 sampler_ci.mipLodBias = 1.0;
10201 sampler_ci.anisotropyEnable = VK_FALSE;
10202 sampler_ci.maxAnisotropy = 1;
10203 sampler_ci.compareEnable = VK_FALSE;
10204 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10205 sampler_ci.minLod = 1.0;
10206 sampler_ci.maxLod = 1.0;
10207 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10208 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10209 VkSampler sampler;
10210 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10211 ASSERT_VK_SUCCESS(err);
10212
10213 VkDescriptorImageInfo info = {};
10214 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010215
10216 VkWriteDescriptorSet descriptor_write;
10217 memset(&descriptor_write, 0, sizeof(descriptor_write));
10218 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010219 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010220 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010221 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010222 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010223 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010224
10225 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10226
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010227 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010228
Chia-I Wuf7458c52015-10-26 21:10:41 +080010229 vkDestroySampler(m_device->device(), sampler, NULL);
10230 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10231 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010232}
10233
Karl Schultz6addd812016-02-02 17:17:23 -070010234TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010235 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010236 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010237
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010239
Tony Barbour1fa09702017-03-16 12:09:08 -060010240 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010241 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010242 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010243 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10244 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010245
10246 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010247 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10248 ds_pool_ci.pNext = NULL;
10249 ds_pool_ci.maxSets = 1;
10250 ds_pool_ci.poolSizeCount = 1;
10251 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010252
Tobin Ehlis3b780662015-05-28 12:11:26 -060010253 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010254 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010255 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010256
Tony Barboureb254902015-07-15 12:50:33 -060010257 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010258 dsl_binding.binding = 0;
10259 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10260 dsl_binding.descriptorCount = 1;
10261 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10262 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010263
10264 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010265 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10266 ds_layout_ci.pNext = NULL;
10267 ds_layout_ci.bindingCount = 1;
10268 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010269
Tobin Ehlis3b780662015-05-28 12:11:26 -060010270 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010271 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010272 ASSERT_VK_SUCCESS(err);
10273
10274 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010275 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010276 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010277 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010278 alloc_info.descriptorPool = ds_pool;
10279 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010280 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010281 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010282
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010283 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10284
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010285 // Correctly update descriptor to avoid "NOT_UPDATED" error
10286 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010287 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010288 buff_info.offset = 0;
10289 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010290
10291 VkWriteDescriptorSet descriptor_write;
10292 memset(&descriptor_write, 0, sizeof(descriptor_write));
10293 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010294 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010295 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010296 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010297 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10298 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010299
10300 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10301
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010302 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010303
Chia-I Wuf7458c52015-10-26 21:10:41 +080010304 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10305 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010306}
10307
Karl Schultz6addd812016-02-02 17:17:23 -070010308TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010309 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010310 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010311
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010312 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010313
Tony Barbour1fa09702017-03-16 12:09:08 -060010314 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010315 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010316 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010317 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10318 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010319
10320 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010321 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10322 ds_pool_ci.pNext = NULL;
10323 ds_pool_ci.maxSets = 1;
10324 ds_pool_ci.poolSizeCount = 1;
10325 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010326
Tobin Ehlis3b780662015-05-28 12:11:26 -060010327 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010328 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010329 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010330
Tony Barboureb254902015-07-15 12:50:33 -060010331 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010332 dsl_binding.binding = 0;
10333 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10334 dsl_binding.descriptorCount = 1;
10335 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10336 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010337
10338 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010339 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10340 ds_layout_ci.pNext = NULL;
10341 ds_layout_ci.bindingCount = 1;
10342 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010343 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010344 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010345 ASSERT_VK_SUCCESS(err);
10346
10347 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010348 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010349 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010350 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010351 alloc_info.descriptorPool = ds_pool;
10352 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010353 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010354 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010355
Tony Barboureb254902015-07-15 12:50:33 -060010356 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010357 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10358 sampler_ci.pNext = NULL;
10359 sampler_ci.magFilter = VK_FILTER_NEAREST;
10360 sampler_ci.minFilter = VK_FILTER_NEAREST;
10361 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10362 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10363 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10364 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10365 sampler_ci.mipLodBias = 1.0;
10366 sampler_ci.anisotropyEnable = VK_FALSE;
10367 sampler_ci.maxAnisotropy = 1;
10368 sampler_ci.compareEnable = VK_FALSE;
10369 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10370 sampler_ci.minLod = 1.0;
10371 sampler_ci.maxLod = 1.0;
10372 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10373 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010374
Tobin Ehlis3b780662015-05-28 12:11:26 -060010375 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010376 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010377 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010378
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010379 VkDescriptorImageInfo info = {};
10380 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010381
10382 VkWriteDescriptorSet descriptor_write;
10383 memset(&descriptor_write, 0, sizeof(descriptor_write));
10384 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010385 descriptor_write.dstSet = descriptorSet;
10386 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010387 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010388 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010389 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010390 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010391
10392 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10393
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010394 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010395
Chia-I Wuf7458c52015-10-26 21:10:41 +080010396 vkDestroySampler(m_device->device(), sampler, NULL);
10397 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10398 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010399}
10400
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010401TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10402 // Create layout w/ empty binding and attempt to update it
10403 VkResult err;
10404
Tony Barbour1fa09702017-03-16 12:09:08 -060010405 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010406
10407 VkDescriptorPoolSize ds_type_count = {};
10408 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10409 ds_type_count.descriptorCount = 1;
10410
10411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10413 ds_pool_ci.pNext = NULL;
10414 ds_pool_ci.maxSets = 1;
10415 ds_pool_ci.poolSizeCount = 1;
10416 ds_pool_ci.pPoolSizes = &ds_type_count;
10417
10418 VkDescriptorPool ds_pool;
10419 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10420 ASSERT_VK_SUCCESS(err);
10421
10422 VkDescriptorSetLayoutBinding dsl_binding = {};
10423 dsl_binding.binding = 0;
10424 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10425 dsl_binding.descriptorCount = 0;
10426 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10427 dsl_binding.pImmutableSamplers = NULL;
10428
10429 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10430 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10431 ds_layout_ci.pNext = NULL;
10432 ds_layout_ci.bindingCount = 1;
10433 ds_layout_ci.pBindings = &dsl_binding;
10434 VkDescriptorSetLayout ds_layout;
10435 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10436 ASSERT_VK_SUCCESS(err);
10437
10438 VkDescriptorSet descriptor_set;
10439 VkDescriptorSetAllocateInfo alloc_info = {};
10440 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10441 alloc_info.descriptorSetCount = 1;
10442 alloc_info.descriptorPool = ds_pool;
10443 alloc_info.pSetLayouts = &ds_layout;
10444 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10445 ASSERT_VK_SUCCESS(err);
10446
10447 VkSamplerCreateInfo sampler_ci = {};
10448 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10449 sampler_ci.magFilter = VK_FILTER_NEAREST;
10450 sampler_ci.minFilter = VK_FILTER_NEAREST;
10451 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10452 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10453 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10454 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10455 sampler_ci.mipLodBias = 1.0;
10456 sampler_ci.maxAnisotropy = 1;
10457 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10458 sampler_ci.minLod = 1.0;
10459 sampler_ci.maxLod = 1.0;
10460 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10461
10462 VkSampler sampler;
10463 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10464 ASSERT_VK_SUCCESS(err);
10465
10466 VkDescriptorImageInfo info = {};
10467 info.sampler = sampler;
10468
10469 VkWriteDescriptorSet descriptor_write;
10470 memset(&descriptor_write, 0, sizeof(descriptor_write));
10471 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10472 descriptor_write.dstSet = descriptor_set;
10473 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010474 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010475 // This is the wrong type, but empty binding error will be flagged first
10476 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10477 descriptor_write.pImageInfo = &info;
10478
10479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10480 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10481 m_errorMonitor->VerifyFound();
10482
10483 vkDestroySampler(m_device->device(), sampler, NULL);
10484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10486}
10487
Karl Schultz6addd812016-02-02 17:17:23 -070010488TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10489 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10490 // types
10491 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010492
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010494
Tony Barbour1fa09702017-03-16 12:09:08 -060010495 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010496
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010497 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010498 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10499 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010500
10501 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010502 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10503 ds_pool_ci.pNext = NULL;
10504 ds_pool_ci.maxSets = 1;
10505 ds_pool_ci.poolSizeCount = 1;
10506 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010507
Tobin Ehlis3b780662015-05-28 12:11:26 -060010508 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010509 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010510 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010511 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010512 dsl_binding.binding = 0;
10513 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10514 dsl_binding.descriptorCount = 1;
10515 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10516 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010517
Tony Barboureb254902015-07-15 12:50:33 -060010518 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010519 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10520 ds_layout_ci.pNext = NULL;
10521 ds_layout_ci.bindingCount = 1;
10522 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010523
Tobin Ehlis3b780662015-05-28 12:11:26 -060010524 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010525 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010526 ASSERT_VK_SUCCESS(err);
10527
10528 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010529 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010530 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010531 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010532 alloc_info.descriptorPool = ds_pool;
10533 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010534 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010535 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010536
Tony Barboureb254902015-07-15 12:50:33 -060010537 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010538 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10539 sampler_ci.pNext = NULL;
10540 sampler_ci.magFilter = VK_FILTER_NEAREST;
10541 sampler_ci.minFilter = VK_FILTER_NEAREST;
10542 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10543 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10544 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10545 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10546 sampler_ci.mipLodBias = 1.0;
10547 sampler_ci.anisotropyEnable = VK_FALSE;
10548 sampler_ci.maxAnisotropy = 1;
10549 sampler_ci.compareEnable = VK_FALSE;
10550 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10551 sampler_ci.minLod = 1.0;
10552 sampler_ci.maxLod = 1.0;
10553 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10554 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010555 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010556 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010557 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010558
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010559 VkDescriptorImageInfo info = {};
10560 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010561
10562 VkWriteDescriptorSet descriptor_write;
10563 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010564 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010565 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010566 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010567 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010568 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010569 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010570
10571 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10572
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010573 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010574
Chia-I Wuf7458c52015-10-26 21:10:41 +080010575 vkDestroySampler(m_device->device(), sampler, NULL);
10576 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10577 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010578}
10579
Karl Schultz6addd812016-02-02 17:17:23 -070010580TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010581 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010582 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010583
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010585
Tony Barbour1fa09702017-03-16 12:09:08 -060010586 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010587 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10588 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010589 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010590 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10591 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010592
10593 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010594 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10595 ds_pool_ci.pNext = NULL;
10596 ds_pool_ci.maxSets = 1;
10597 ds_pool_ci.poolSizeCount = 1;
10598 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010599
10600 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010601 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010602 ASSERT_VK_SUCCESS(err);
10603
10604 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010605 dsl_binding.binding = 0;
10606 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10607 dsl_binding.descriptorCount = 1;
10608 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10609 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010610
10611 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010612 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10613 ds_layout_ci.pNext = NULL;
10614 ds_layout_ci.bindingCount = 1;
10615 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010616 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010617 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010618 ASSERT_VK_SUCCESS(err);
10619
10620 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010621 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010622 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010623 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010624 alloc_info.descriptorPool = ds_pool;
10625 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010626 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010627 ASSERT_VK_SUCCESS(err);
10628
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010629 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010630
10631 VkDescriptorImageInfo descriptor_info;
10632 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10633 descriptor_info.sampler = sampler;
10634
10635 VkWriteDescriptorSet descriptor_write;
10636 memset(&descriptor_write, 0, sizeof(descriptor_write));
10637 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010638 descriptor_write.dstSet = descriptorSet;
10639 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010640 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010641 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10642 descriptor_write.pImageInfo = &descriptor_info;
10643
10644 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10645
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010646 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010647
Chia-I Wuf7458c52015-10-26 21:10:41 +080010648 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10649 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010650}
10651
Karl Schultz6addd812016-02-02 17:17:23 -070010652TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10653 // Create a single combined Image/Sampler descriptor and send it an invalid
10654 // imageView
10655 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010656
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010658
Tony Barbour1fa09702017-03-16 12:09:08 -060010659 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010660 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010661 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10662 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010663
10664 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010665 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10666 ds_pool_ci.pNext = NULL;
10667 ds_pool_ci.maxSets = 1;
10668 ds_pool_ci.poolSizeCount = 1;
10669 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010670
10671 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010672 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010673 ASSERT_VK_SUCCESS(err);
10674
10675 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010676 dsl_binding.binding = 0;
10677 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10678 dsl_binding.descriptorCount = 1;
10679 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10680 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010681
10682 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010683 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10684 ds_layout_ci.pNext = NULL;
10685 ds_layout_ci.bindingCount = 1;
10686 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010687 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010688 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010689 ASSERT_VK_SUCCESS(err);
10690
10691 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010692 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010693 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010694 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010695 alloc_info.descriptorPool = ds_pool;
10696 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010697 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010698 ASSERT_VK_SUCCESS(err);
10699
10700 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010701 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10702 sampler_ci.pNext = NULL;
10703 sampler_ci.magFilter = VK_FILTER_NEAREST;
10704 sampler_ci.minFilter = VK_FILTER_NEAREST;
10705 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10706 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10707 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10708 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10709 sampler_ci.mipLodBias = 1.0;
10710 sampler_ci.anisotropyEnable = VK_FALSE;
10711 sampler_ci.maxAnisotropy = 1;
10712 sampler_ci.compareEnable = VK_FALSE;
10713 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10714 sampler_ci.minLod = 1.0;
10715 sampler_ci.maxLod = 1.0;
10716 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10717 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010718
10719 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010720 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010721 ASSERT_VK_SUCCESS(err);
10722
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010723 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010724
10725 VkDescriptorImageInfo descriptor_info;
10726 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10727 descriptor_info.sampler = sampler;
10728 descriptor_info.imageView = view;
10729
10730 VkWriteDescriptorSet descriptor_write;
10731 memset(&descriptor_write, 0, sizeof(descriptor_write));
10732 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010733 descriptor_write.dstSet = descriptorSet;
10734 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010735 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010736 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10737 descriptor_write.pImageInfo = &descriptor_info;
10738
10739 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10740
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010741 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010742
Chia-I Wuf7458c52015-10-26 21:10:41 +080010743 vkDestroySampler(m_device->device(), sampler, NULL);
10744 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10745 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010746}
10747
Karl Schultz6addd812016-02-02 17:17:23 -070010748TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10749 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10750 // into the other
10751 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010752
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10754 " binding #1 with type "
10755 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10756 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010757
Tony Barbour1fa09702017-03-16 12:09:08 -060010758 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010759 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010760 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010761 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10762 ds_type_count[0].descriptorCount = 1;
10763 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10764 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010765
10766 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010767 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10768 ds_pool_ci.pNext = NULL;
10769 ds_pool_ci.maxSets = 1;
10770 ds_pool_ci.poolSizeCount = 2;
10771 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010772
10773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010774 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010775 ASSERT_VK_SUCCESS(err);
10776 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010777 dsl_binding[0].binding = 0;
10778 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10779 dsl_binding[0].descriptorCount = 1;
10780 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10781 dsl_binding[0].pImmutableSamplers = NULL;
10782 dsl_binding[1].binding = 1;
10783 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10784 dsl_binding[1].descriptorCount = 1;
10785 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10786 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010787
10788 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010789 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10790 ds_layout_ci.pNext = NULL;
10791 ds_layout_ci.bindingCount = 2;
10792 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010793
10794 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010796 ASSERT_VK_SUCCESS(err);
10797
10798 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010799 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010800 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010801 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010802 alloc_info.descriptorPool = ds_pool;
10803 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010805 ASSERT_VK_SUCCESS(err);
10806
10807 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010808 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10809 sampler_ci.pNext = NULL;
10810 sampler_ci.magFilter = VK_FILTER_NEAREST;
10811 sampler_ci.minFilter = VK_FILTER_NEAREST;
10812 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10813 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10814 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10815 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10816 sampler_ci.mipLodBias = 1.0;
10817 sampler_ci.anisotropyEnable = VK_FALSE;
10818 sampler_ci.maxAnisotropy = 1;
10819 sampler_ci.compareEnable = VK_FALSE;
10820 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10821 sampler_ci.minLod = 1.0;
10822 sampler_ci.maxLod = 1.0;
10823 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10824 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010825
10826 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010827 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010828 ASSERT_VK_SUCCESS(err);
10829
10830 VkDescriptorImageInfo info = {};
10831 info.sampler = sampler;
10832
10833 VkWriteDescriptorSet descriptor_write;
10834 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010836 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010837 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010838 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10840 descriptor_write.pImageInfo = &info;
10841 // This write update should succeed
10842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10843 // Now perform a copy update that fails due to type mismatch
10844 VkCopyDescriptorSet copy_ds_update;
10845 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10846 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10847 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010848 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010849 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010850 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10851 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010852 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10853
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010854 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010855 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010857 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10858 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10859 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010860 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010861 copy_ds_update.dstSet = descriptorSet;
10862 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010863 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010864 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10865
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010866 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010867
Tobin Ehlis04356f92015-10-27 16:35:27 -060010868 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10870 " binding#1 with offset index of 1 plus "
10871 "update array offset of 0 and update of "
10872 "5 descriptors oversteps total number "
10873 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010874
Tobin Ehlis04356f92015-10-27 16:35:27 -060010875 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10876 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10877 copy_ds_update.srcSet = descriptorSet;
10878 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010879 copy_ds_update.dstSet = descriptorSet;
10880 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010881 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010882 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10883
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010884 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010885
Chia-I Wuf7458c52015-10-26 21:10:41 +080010886 vkDestroySampler(m_device->device(), sampler, NULL);
10887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010889}
10890
Karl Schultz6addd812016-02-02 17:17:23 -070010891TEST_F(VkLayerTest, NumSamplesMismatch) {
10892 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10893 // sampleCount
10894 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010895
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010897
Tony Barbour1fa09702017-03-16 12:09:08 -060010898 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010899 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010900 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010901 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010902 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010903
10904 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010905 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10906 ds_pool_ci.pNext = NULL;
10907 ds_pool_ci.maxSets = 1;
10908 ds_pool_ci.poolSizeCount = 1;
10909 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010910
Tobin Ehlis3b780662015-05-28 12:11:26 -060010911 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010912 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010913 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010914
Tony Barboureb254902015-07-15 12:50:33 -060010915 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010916 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010917 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010918 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010919 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10920 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010921
Tony Barboureb254902015-07-15 12:50:33 -060010922 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10923 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10924 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010925 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010926 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010927
Tobin Ehlis3b780662015-05-28 12:11:26 -060010928 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010929 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010930 ASSERT_VK_SUCCESS(err);
10931
10932 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010933 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010934 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010935 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010936 alloc_info.descriptorPool = ds_pool;
10937 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010938 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010939 ASSERT_VK_SUCCESS(err);
10940
Tony Barboureb254902015-07-15 12:50:33 -060010941 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010942 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010943 pipe_ms_state_ci.pNext = NULL;
10944 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10945 pipe_ms_state_ci.sampleShadingEnable = 0;
10946 pipe_ms_state_ci.minSampleShading = 1.0;
10947 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010948
Tony Barboureb254902015-07-15 12:50:33 -060010949 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010950 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10951 pipeline_layout_ci.pNext = NULL;
10952 pipeline_layout_ci.setLayoutCount = 1;
10953 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010954
10955 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010956 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010957 ASSERT_VK_SUCCESS(err);
10958
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010959 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010960 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010961 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010962 VkPipelineObj pipe(m_device);
10963 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010964 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010965 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010966 pipe.SetMSAA(&pipe_ms_state_ci);
10967 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010968
Tony Barbour552f6c02016-12-21 14:34:07 -070010969 m_commandBuffer->BeginCommandBuffer();
10970 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010971 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010972
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010973 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10974 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10975 VkRect2D scissor = {{0, 0}, {16, 16}};
10976 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10977
Mark Young29927482016-05-04 14:38:51 -060010978 // Render triangle (the error should trigger on the attempt to draw).
10979 Draw(3, 1, 0, 0);
10980
10981 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010982 m_commandBuffer->EndRenderPass();
10983 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010984
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010985 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010986
Chia-I Wuf7458c52015-10-26 21:10:41 +080010987 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10988 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10989 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010990}
Mark Young29927482016-05-04 14:38:51 -060010991
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010992TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010993 TEST_DESCRIPTION(
10994 "Hit RenderPass incompatible cases. "
10995 "Initial case is drawing with an active renderpass that's "
10996 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010997 VkResult err;
10998
Tony Barbour1fa09702017-03-16 12:09:08 -060010999 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11001
11002 VkDescriptorSetLayoutBinding dsl_binding = {};
11003 dsl_binding.binding = 0;
11004 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11005 dsl_binding.descriptorCount = 1;
11006 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11007 dsl_binding.pImmutableSamplers = NULL;
11008
11009 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11010 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11011 ds_layout_ci.pNext = NULL;
11012 ds_layout_ci.bindingCount = 1;
11013 ds_layout_ci.pBindings = &dsl_binding;
11014
11015 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011016 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011017 ASSERT_VK_SUCCESS(err);
11018
11019 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11020 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11021 pipeline_layout_ci.pNext = NULL;
11022 pipeline_layout_ci.setLayoutCount = 1;
11023 pipeline_layout_ci.pSetLayouts = &ds_layout;
11024
11025 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011026 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011027 ASSERT_VK_SUCCESS(err);
11028
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011029 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011030 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011031 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011032 // Create a renderpass that will be incompatible with default renderpass
11033 VkAttachmentReference attach = {};
11034 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11035 VkAttachmentReference color_att = {};
11036 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11037 VkSubpassDescription subpass = {};
11038 subpass.inputAttachmentCount = 1;
11039 subpass.pInputAttachments = &attach;
11040 subpass.colorAttachmentCount = 1;
11041 subpass.pColorAttachments = &color_att;
11042 VkRenderPassCreateInfo rpci = {};
11043 rpci.subpassCount = 1;
11044 rpci.pSubpasses = &subpass;
11045 rpci.attachmentCount = 1;
11046 VkAttachmentDescription attach_desc = {};
11047 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011048 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11049 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011050 rpci.pAttachments = &attach_desc;
11051 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11052 VkRenderPass rp;
11053 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11054 VkPipelineObj pipe(m_device);
11055 pipe.AddShader(&vs);
11056 pipe.AddShader(&fs);
11057 pipe.AddColorAttachment();
11058 VkViewport view_port = {};
11059 m_viewports.push_back(view_port);
11060 pipe.SetViewport(m_viewports);
11061 VkRect2D rect = {};
11062 m_scissors.push_back(rect);
11063 pipe.SetScissor(m_scissors);
11064 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11065
11066 VkCommandBufferInheritanceInfo cbii = {};
11067 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11068 cbii.renderPass = rp;
11069 cbii.subpass = 0;
11070 VkCommandBufferBeginInfo cbbi = {};
11071 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11072 cbbi.pInheritanceInfo = &cbii;
11073 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11074 VkRenderPassBeginInfo rpbi = {};
11075 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11076 rpbi.framebuffer = m_framebuffer;
11077 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011078 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11079 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011080
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011082 // Render triangle (the error should trigger on the attempt to draw).
11083 Draw(3, 1, 0, 0);
11084
11085 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011086 m_commandBuffer->EndRenderPass();
11087 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011088
11089 m_errorMonitor->VerifyFound();
11090
11091 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11092 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11093 vkDestroyRenderPass(m_device->device(), rp, NULL);
11094}
11095
Mark Youngc89c6312016-03-31 16:03:20 -060011096TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11097 // Create Pipeline where the number of blend attachments doesn't match the
11098 // number of color attachments. In this case, we don't add any color
11099 // blend attachments even though we have a color attachment.
11100 VkResult err;
11101
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011102 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011103
Tony Barbour1fa09702017-03-16 12:09:08 -060011104 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11106 VkDescriptorPoolSize ds_type_count = {};
11107 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11108 ds_type_count.descriptorCount = 1;
11109
11110 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11111 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11112 ds_pool_ci.pNext = NULL;
11113 ds_pool_ci.maxSets = 1;
11114 ds_pool_ci.poolSizeCount = 1;
11115 ds_pool_ci.pPoolSizes = &ds_type_count;
11116
11117 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011119 ASSERT_VK_SUCCESS(err);
11120
11121 VkDescriptorSetLayoutBinding dsl_binding = {};
11122 dsl_binding.binding = 0;
11123 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11124 dsl_binding.descriptorCount = 1;
11125 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11126 dsl_binding.pImmutableSamplers = NULL;
11127
11128 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11129 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11130 ds_layout_ci.pNext = NULL;
11131 ds_layout_ci.bindingCount = 1;
11132 ds_layout_ci.pBindings = &dsl_binding;
11133
11134 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011136 ASSERT_VK_SUCCESS(err);
11137
11138 VkDescriptorSet descriptorSet;
11139 VkDescriptorSetAllocateInfo alloc_info = {};
11140 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11141 alloc_info.descriptorSetCount = 1;
11142 alloc_info.descriptorPool = ds_pool;
11143 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011144 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011145 ASSERT_VK_SUCCESS(err);
11146
11147 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011148 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011149 pipe_ms_state_ci.pNext = NULL;
11150 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11151 pipe_ms_state_ci.sampleShadingEnable = 0;
11152 pipe_ms_state_ci.minSampleShading = 1.0;
11153 pipe_ms_state_ci.pSampleMask = NULL;
11154
11155 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11156 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11157 pipeline_layout_ci.pNext = NULL;
11158 pipeline_layout_ci.setLayoutCount = 1;
11159 pipeline_layout_ci.pSetLayouts = &ds_layout;
11160
11161 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011163 ASSERT_VK_SUCCESS(err);
11164
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011165 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011166 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011167 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011168 VkPipelineObj pipe(m_device);
11169 pipe.AddShader(&vs);
11170 pipe.AddShader(&fs);
11171 pipe.SetMSAA(&pipe_ms_state_ci);
11172 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011173 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011174
11175 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11176 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11177 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11178}
Mark Young29927482016-05-04 14:38:51 -060011179
Mark Muellerd4914412016-06-13 17:52:06 -060011180TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011181 TEST_DESCRIPTION(
11182 "Points to a wrong colorAttachment index in a VkClearAttachment "
11183 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011184 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011186
11187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11188 m_errorMonitor->VerifyFound();
11189}
11190
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011191TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011192 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11193 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011194
Tony Barbour1fa09702017-03-16 12:09:08 -060011195 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011196 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011197
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011198 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011199 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11200 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011201
11202 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011203 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11204 ds_pool_ci.pNext = NULL;
11205 ds_pool_ci.maxSets = 1;
11206 ds_pool_ci.poolSizeCount = 1;
11207 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011208
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011209 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011210 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011211 ASSERT_VK_SUCCESS(err);
11212
Tony Barboureb254902015-07-15 12:50:33 -060011213 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011214 dsl_binding.binding = 0;
11215 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11216 dsl_binding.descriptorCount = 1;
11217 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11218 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011219
Tony Barboureb254902015-07-15 12:50:33 -060011220 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011221 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11222 ds_layout_ci.pNext = NULL;
11223 ds_layout_ci.bindingCount = 1;
11224 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011225
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011226 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011228 ASSERT_VK_SUCCESS(err);
11229
11230 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011231 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011232 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011233 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011234 alloc_info.descriptorPool = ds_pool;
11235 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011236 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011237 ASSERT_VK_SUCCESS(err);
11238
Tony Barboureb254902015-07-15 12:50:33 -060011239 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011240 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011241 pipe_ms_state_ci.pNext = NULL;
11242 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11243 pipe_ms_state_ci.sampleShadingEnable = 0;
11244 pipe_ms_state_ci.minSampleShading = 1.0;
11245 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011246
Tony Barboureb254902015-07-15 12:50:33 -060011247 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011248 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11249 pipeline_layout_ci.pNext = NULL;
11250 pipeline_layout_ci.setLayoutCount = 1;
11251 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011252
11253 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011254 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011255 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011256
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011257 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011258 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011259 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011260 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011261
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011262 VkPipelineObj pipe(m_device);
11263 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011264 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011265 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011266 pipe.SetMSAA(&pipe_ms_state_ci);
11267 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011268
Tony Barbour552f6c02016-12-21 14:34:07 -070011269 m_commandBuffer->BeginCommandBuffer();
11270 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011271
Karl Schultz6addd812016-02-02 17:17:23 -070011272 // Main thing we care about for this test is that the VkImage obj we're
11273 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011274 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011275 VkClearAttachment color_attachment;
11276 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11277 color_attachment.clearValue.color.float32[0] = 1.0;
11278 color_attachment.clearValue.color.float32[1] = 1.0;
11279 color_attachment.clearValue.color.float32[2] = 1.0;
11280 color_attachment.clearValue.color.float32[3] = 1.0;
11281 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011282 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011283
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011284 // Call for full-sized FB Color attachment prior to issuing a Draw
11285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011286 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011287 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011288 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011289
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011290 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11291 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11293 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11294 m_errorMonitor->VerifyFound();
11295
11296 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11297 clear_rect.layerCount = 2;
11298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11299 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011300 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011301
Chia-I Wuf7458c52015-10-26 21:10:41 +080011302 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11303 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11304 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011305}
11306
Karl Schultz6addd812016-02-02 17:17:23 -070011307TEST_F(VkLayerTest, VtxBufferBadIndex) {
11308 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011309
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11311 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011312
Tony Barbour1fa09702017-03-16 12:09:08 -060011313 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011314 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011315 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011316
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011317 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011318 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11319 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011320
11321 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011322 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11323 ds_pool_ci.pNext = NULL;
11324 ds_pool_ci.maxSets = 1;
11325 ds_pool_ci.poolSizeCount = 1;
11326 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011327
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011328 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011329 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011330 ASSERT_VK_SUCCESS(err);
11331
Tony Barboureb254902015-07-15 12:50:33 -060011332 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011333 dsl_binding.binding = 0;
11334 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11335 dsl_binding.descriptorCount = 1;
11336 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11337 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011338
Tony Barboureb254902015-07-15 12:50:33 -060011339 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011340 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11341 ds_layout_ci.pNext = NULL;
11342 ds_layout_ci.bindingCount = 1;
11343 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011344
Tobin Ehlis502480b2015-06-24 15:53:07 -060011345 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011346 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011347 ASSERT_VK_SUCCESS(err);
11348
11349 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011350 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011351 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011352 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011353 alloc_info.descriptorPool = ds_pool;
11354 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011355 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011356 ASSERT_VK_SUCCESS(err);
11357
Tony Barboureb254902015-07-15 12:50:33 -060011358 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011359 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011360 pipe_ms_state_ci.pNext = NULL;
11361 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11362 pipe_ms_state_ci.sampleShadingEnable = 0;
11363 pipe_ms_state_ci.minSampleShading = 1.0;
11364 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011365
Tony Barboureb254902015-07-15 12:50:33 -060011366 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011367 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11368 pipeline_layout_ci.pNext = NULL;
11369 pipeline_layout_ci.setLayoutCount = 1;
11370 pipeline_layout_ci.pSetLayouts = &ds_layout;
11371 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011372
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011373 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011374 ASSERT_VK_SUCCESS(err);
11375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011376 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011377 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011378 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011379 VkPipelineObj pipe(m_device);
11380 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011381 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011382 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011383 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011384 pipe.SetViewport(m_viewports);
11385 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011386 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011387
Tony Barbour552f6c02016-12-21 14:34:07 -070011388 m_commandBuffer->BeginCommandBuffer();
11389 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011390 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011391 // Don't care about actual data, just need to get to draw to flag error
11392 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011393 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011394 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011395 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011396
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011397 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011398
Chia-I Wuf7458c52015-10-26 21:10:41 +080011399 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11400 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11401 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011402}
Mark Muellerdfe37552016-07-07 14:47:42 -060011403
Mark Mueller2ee294f2016-08-04 12:59:48 -060011404TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011405 TEST_DESCRIPTION(
11406 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11407 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011408 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011409
Mark Mueller880fce52016-08-17 15:23:23 -060011410 // The following test fails with recent NVidia drivers.
11411 // By the time core_validation is reached, the NVidia
11412 // driver has sanitized the invalid condition and core_validation
11413 // is not introduced to the failure condition. This is not the case
11414 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011415 // uint32_t count = static_cast<uint32_t>(~0);
11416 // VkPhysicalDevice physical_device;
11417 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11418 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011419
Mark Mueller2ee294f2016-08-04 12:59:48 -060011420 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011421 VkDeviceQueueCreateInfo queue_create_info = {};
11422 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11423 queue_create_info.queueCount = 1;
11424 queue_create_info.pQueuePriorities = &queue_priority;
11425 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11426
11427 VkPhysicalDeviceFeatures features = m_device->phy().features();
11428 VkDevice testDevice;
11429 VkDeviceCreateInfo device_create_info = {};
11430 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11431 device_create_info.queueCreateInfoCount = 1;
11432 device_create_info.pQueueCreateInfos = &queue_create_info;
11433 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011434
11435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11436 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011437 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11438 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11439 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011440 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11441 m_errorMonitor->VerifyFound();
11442
11443 queue_create_info.queueFamilyIndex = 1;
11444
11445 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11446 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11447 for (unsigned i = 0; i < feature_count; i++) {
11448 if (VK_FALSE == feature_array[i]) {
11449 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011450 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11452 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011453 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11454 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11455 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11457 "You requested features that are unavailable on this device. You should first "
11458 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011459 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11460 m_errorMonitor->VerifyFound();
11461 break;
11462 }
11463 }
11464}
11465
Tobin Ehlis16edf082016-11-21 12:33:49 -070011466TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11467 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11468
Tony Barbour1fa09702017-03-16 12:09:08 -060011469 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011470
11471 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11472 std::vector<VkDeviceQueueCreateInfo> queue_info;
11473 queue_info.reserve(queue_props.size());
11474 std::vector<std::vector<float>> queue_priorities;
11475 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11476 VkDeviceQueueCreateInfo qi{};
11477 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11478 qi.queueFamilyIndex = i;
11479 qi.queueCount = queue_props[i].queueCount;
11480 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11481 qi.pQueuePriorities = queue_priorities[i].data();
11482 queue_info.push_back(qi);
11483 }
11484
11485 std::vector<const char *> device_extension_names;
11486
11487 VkDevice local_device;
11488 VkDeviceCreateInfo device_create_info = {};
11489 auto features = m_device->phy().features();
11490 // Intentionally disable pipeline stats
11491 features.pipelineStatisticsQuery = VK_FALSE;
11492 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11493 device_create_info.pNext = NULL;
11494 device_create_info.queueCreateInfoCount = queue_info.size();
11495 device_create_info.pQueueCreateInfos = queue_info.data();
11496 device_create_info.enabledLayerCount = 0;
11497 device_create_info.ppEnabledLayerNames = NULL;
11498 device_create_info.pEnabledFeatures = &features;
11499 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11500 ASSERT_VK_SUCCESS(err);
11501
11502 VkQueryPoolCreateInfo qpci{};
11503 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11504 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11505 qpci.queryCount = 1;
11506 VkQueryPool query_pool;
11507
11508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11509 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11510 m_errorMonitor->VerifyFound();
11511
11512 vkDestroyDevice(local_device, nullptr);
11513}
11514
Mark Mueller2ee294f2016-08-04 12:59:48 -060011515TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011516 TEST_DESCRIPTION(
11517 "Use an invalid queue index in a vkCmdWaitEvents call."
11518 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011519
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011520 const char *invalid_queue_index =
11521 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11522 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11523 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011524
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011525 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011526
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011528
Tony Barbour1fa09702017-03-16 12:09:08 -060011529 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011530
11531 VkEvent event;
11532 VkEventCreateInfo event_create_info{};
11533 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11534 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11535
Mark Mueller2ee294f2016-08-04 12:59:48 -060011536 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011537 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011538
Tony Barbour552f6c02016-12-21 14:34:07 -070011539 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011540
11541 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011542 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011543 ASSERT_TRUE(image.initialized());
11544 VkImageMemoryBarrier img_barrier = {};
11545 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11546 img_barrier.pNext = NULL;
11547 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11548 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11549 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11550 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11551 img_barrier.image = image.handle();
11552 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011553
11554 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11555 // that layer validation catches the case when it is not.
11556 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011557 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11558 img_barrier.subresourceRange.baseArrayLayer = 0;
11559 img_barrier.subresourceRange.baseMipLevel = 0;
11560 img_barrier.subresourceRange.layerCount = 1;
11561 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011562 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11563 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011564 m_errorMonitor->VerifyFound();
11565
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011567
11568 VkQueryPool query_pool;
11569 VkQueryPoolCreateInfo query_pool_create_info = {};
11570 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11571 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11572 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011573 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011574
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011575 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011576 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11577
11578 vkEndCommandBuffer(m_commandBuffer->handle());
11579 m_errorMonitor->VerifyFound();
11580
11581 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11582 vkDestroyEvent(m_device->device(), event, nullptr);
11583}
11584
Mark Muellerdfe37552016-07-07 14:47:42 -060011585TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011586 TEST_DESCRIPTION(
11587 "Submit a command buffer using deleted vertex buffer, "
11588 "delete a buffer twice, use an invalid offset for each "
11589 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011590
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011591 const char *deleted_buffer_in_command_buffer =
11592 "Cannot submit cmd buffer "
11593 "using deleted buffer ";
11594 const char *invalid_offset_message =
11595 "vkBindBufferMemory(): "
11596 "memoryOffset is 0x";
11597 const char *invalid_storage_buffer_offset_message =
11598 "vkBindBufferMemory(): "
11599 "storage memoryOffset "
11600 "is 0x";
11601 const char *invalid_texel_buffer_offset_message =
11602 "vkBindBufferMemory(): "
11603 "texel memoryOffset "
11604 "is 0x";
11605 const char *invalid_uniform_buffer_offset_message =
11606 "vkBindBufferMemory(): "
11607 "uniform memoryOffset "
11608 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011609
Tony Barbour1fa09702017-03-16 12:09:08 -060011610 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011611 ASSERT_NO_FATAL_FAILURE(InitViewport());
11612 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11613
11614 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011615 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011616 pipe_ms_state_ci.pNext = NULL;
11617 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11618 pipe_ms_state_ci.sampleShadingEnable = 0;
11619 pipe_ms_state_ci.minSampleShading = 1.0;
11620 pipe_ms_state_ci.pSampleMask = nullptr;
11621
11622 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11623 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11624 VkPipelineLayout pipeline_layout;
11625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011626 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011627 ASSERT_VK_SUCCESS(err);
11628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011629 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11630 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011631 VkPipelineObj pipe(m_device);
11632 pipe.AddShader(&vs);
11633 pipe.AddShader(&fs);
11634 pipe.AddColorAttachment();
11635 pipe.SetMSAA(&pipe_ms_state_ci);
11636 pipe.SetViewport(m_viewports);
11637 pipe.SetScissor(m_scissors);
11638 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11639
Tony Barbour552f6c02016-12-21 14:34:07 -070011640 m_commandBuffer->BeginCommandBuffer();
11641 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011642 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011643
11644 {
11645 // Create and bind a vertex buffer in a reduced scope, which will cause
11646 // it to be deleted upon leaving this scope
11647 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011648 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011649 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11650 draw_verticies.AddVertexInputToPipe(pipe);
11651 }
11652
11653 Draw(1, 0, 0, 0);
11654
Tony Barbour552f6c02016-12-21 14:34:07 -070011655 m_commandBuffer->EndRenderPass();
11656 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011657
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011659 QueueCommandBuffer(false);
11660 m_errorMonitor->VerifyFound();
11661
11662 {
11663 // Create and bind a vertex buffer in a reduced scope, and delete it
11664 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011665 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011667 buffer_test.TestDoubleDestroy();
11668 }
11669 m_errorMonitor->VerifyFound();
11670
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011671 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011672 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011673 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011675 m_errorMonitor->SetUnexpectedError(
11676 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11677 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011678 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11679 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011680 m_errorMonitor->VerifyFound();
11681 }
11682
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011683 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11684 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011685 // Create and bind a memory buffer with an invalid offset again,
11686 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011688 m_errorMonitor->SetUnexpectedError(
11689 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11690 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011691 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11692 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011693 m_errorMonitor->VerifyFound();
11694 }
11695
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011696 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011697 // Create and bind a memory buffer with an invalid offset again, but
11698 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011700 m_errorMonitor->SetUnexpectedError(
11701 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11702 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011703 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11704 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011705 m_errorMonitor->VerifyFound();
11706 }
11707
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011708 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011709 // Create and bind a memory buffer with an invalid offset again, but
11710 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011712 m_errorMonitor->SetUnexpectedError(
11713 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11714 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011715 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11716 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011717 m_errorMonitor->VerifyFound();
11718 }
11719
11720 {
11721 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011722 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011723 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11724 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011725 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11726 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011727 m_errorMonitor->VerifyFound();
11728 }
11729
11730 {
11731 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011733 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11734 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011735 }
11736 m_errorMonitor->VerifyFound();
11737
11738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11739}
11740
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011741// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11742TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011743 TEST_DESCRIPTION(
11744 "Hit all possible validation checks associated with the "
11745 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11746 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011747 // 3 in ValidateCmdBufImageLayouts
11748 // * -1 Attempt to submit cmd buf w/ deleted image
11749 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11750 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011751
Tony Barbour1fa09702017-03-16 12:09:08 -060011752 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011753 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011754 if (!depth_format) {
11755 printf(" No Depth + Stencil format found. Skipped.\n");
11756 return;
11757 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011758 // Create src & dst images to use for copy operations
11759 VkImage src_image;
11760 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011761 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011762
11763 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11764 const int32_t tex_width = 32;
11765 const int32_t tex_height = 32;
11766
11767 VkImageCreateInfo image_create_info = {};
11768 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11769 image_create_info.pNext = NULL;
11770 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11771 image_create_info.format = tex_format;
11772 image_create_info.extent.width = tex_width;
11773 image_create_info.extent.height = tex_height;
11774 image_create_info.extent.depth = 1;
11775 image_create_info.mipLevels = 1;
11776 image_create_info.arrayLayers = 4;
11777 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11778 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11779 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011780 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011781 image_create_info.flags = 0;
11782
11783 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11784 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011785 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011786 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11787 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011788 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11789 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11790 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11791 ASSERT_VK_SUCCESS(err);
11792
11793 // Allocate memory
11794 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011795 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011796 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011797 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11798 mem_alloc.pNext = NULL;
11799 mem_alloc.allocationSize = 0;
11800 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011801
11802 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011803 mem_alloc.allocationSize = img_mem_reqs.size;
11804 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011805 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011806 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011807 ASSERT_VK_SUCCESS(err);
11808
11809 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011810 mem_alloc.allocationSize = img_mem_reqs.size;
11811 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011812 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011813 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011814 ASSERT_VK_SUCCESS(err);
11815
11816 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011817 mem_alloc.allocationSize = img_mem_reqs.size;
11818 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011819 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011820 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011821 ASSERT_VK_SUCCESS(err);
11822
11823 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11824 ASSERT_VK_SUCCESS(err);
11825 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11826 ASSERT_VK_SUCCESS(err);
11827 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11828 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011829
Tony Barbour552f6c02016-12-21 14:34:07 -070011830 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011831 VkImageCopy copy_region;
11832 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11833 copy_region.srcSubresource.mipLevel = 0;
11834 copy_region.srcSubresource.baseArrayLayer = 0;
11835 copy_region.srcSubresource.layerCount = 1;
11836 copy_region.srcOffset.x = 0;
11837 copy_region.srcOffset.y = 0;
11838 copy_region.srcOffset.z = 0;
11839 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11840 copy_region.dstSubresource.mipLevel = 0;
11841 copy_region.dstSubresource.baseArrayLayer = 0;
11842 copy_region.dstSubresource.layerCount = 1;
11843 copy_region.dstOffset.x = 0;
11844 copy_region.dstOffset.y = 0;
11845 copy_region.dstOffset.z = 0;
11846 copy_region.extent.width = 1;
11847 copy_region.extent.height = 1;
11848 copy_region.extent.depth = 1;
11849
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11851 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11852 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011853
Cort530cf382016-12-08 09:59:47 -080011854 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011855 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011856 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11857 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011858 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11859 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011860 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011861 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011863 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11864 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011865 m_errorMonitor->SetUnexpectedError(
11866 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011867 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 -060011868 m_errorMonitor->VerifyFound();
11869 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011871 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011872 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011873 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011874 "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 -080011875 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 -060011876 m_errorMonitor->VerifyFound();
11877 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11879 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11880 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011881 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 -060011882 m_errorMonitor->VerifyFound();
11883 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011885 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011886 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011887 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011888 "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 -080011889 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 -060011890 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011892 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11893 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011894 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011895 "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 -080011896 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 -060011897 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011898
Cort3b021012016-12-07 12:00:57 -080011899 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11900 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11901 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11902 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11903 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11904 transfer_dst_image_barrier[0].srcAccessMask = 0;
11905 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11906 transfer_dst_image_barrier[0].image = dst_image;
11907 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11908 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11909 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11910 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11911 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11912 transfer_dst_image_barrier[0].image = depth_image;
11913 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11914 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11915 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11916
11917 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011918 VkClearColorValue color_clear_value = {};
11919 VkImageSubresourceRange clear_range;
11920 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11921 clear_range.baseMipLevel = 0;
11922 clear_range.baseArrayLayer = 0;
11923 clear_range.layerCount = 1;
11924 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011925
Cort3b021012016-12-07 12:00:57 -080011926 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11927 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011930 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011931 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011932 // Fail due to provided layout not matching actual current layout for color clear.
11933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011934 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011935 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011936
Cort530cf382016-12-08 09:59:47 -080011937 VkClearDepthStencilValue depth_clear_value = {};
11938 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011939
11940 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11941 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011944 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011945 m_errorMonitor->VerifyFound();
11946 // Fail due to provided layout not matching actual current layout for depth clear.
11947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011948 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011949 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011950
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011951 // Now cause error due to bad image layout transition in PipelineBarrier
11952 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011953 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011954 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011955 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011956 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011957 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11958 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011959 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011961 "you cannot transition the layout of aspect 1 from "
11962 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11963 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011965 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11966 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011967 m_errorMonitor->VerifyFound();
11968
11969 // Finally some layout errors at RenderPass create time
11970 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11971 VkAttachmentReference attach = {};
11972 // perf warning for GENERAL layout w/ non-DS input attachment
11973 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11974 VkSubpassDescription subpass = {};
11975 subpass.inputAttachmentCount = 1;
11976 subpass.pInputAttachments = &attach;
11977 VkRenderPassCreateInfo rpci = {};
11978 rpci.subpassCount = 1;
11979 rpci.pSubpasses = &subpass;
11980 rpci.attachmentCount = 1;
11981 VkAttachmentDescription attach_desc = {};
11982 attach_desc.format = VK_FORMAT_UNDEFINED;
11983 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011984 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011985 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11987 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011988 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11989 m_errorMonitor->VerifyFound();
11990 // error w/ non-general layout
11991 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11992
11993 m_errorMonitor->SetDesiredFailureMsg(
11994 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11995 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11996 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11997 m_errorMonitor->VerifyFound();
11998 subpass.inputAttachmentCount = 0;
11999 subpass.colorAttachmentCount = 1;
12000 subpass.pColorAttachments = &attach;
12001 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12002 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012003 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12004 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012005 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12006 m_errorMonitor->VerifyFound();
12007 // error w/ non-color opt or GENERAL layout for color attachment
12008 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12009 m_errorMonitor->SetDesiredFailureMsg(
12010 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12011 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12012 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12013 m_errorMonitor->VerifyFound();
12014 subpass.colorAttachmentCount = 0;
12015 subpass.pDepthStencilAttachment = &attach;
12016 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12017 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12019 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012020 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12021 m_errorMonitor->VerifyFound();
12022 // error w/ non-ds opt or GENERAL layout for color attachment
12023 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012024 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12025 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12026 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012027 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12028 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012029 // For this error we need a valid renderpass so create default one
12030 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12031 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012032 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012033 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12034 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12035 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12036 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12037 // Can't do a CLEAR load on READ_ONLY initialLayout
12038 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12039 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12040 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012042 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012043 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12044 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012045
Cort3b021012016-12-07 12:00:57 -080012046 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12047 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12048 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012049 vkDestroyImage(m_device->device(), src_image, NULL);
12050 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012051 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012052}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012053
Tobin Ehlise0936662016-10-11 08:10:51 -060012054TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12055 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12056 VkResult err;
12057
Tony Barbour1fa09702017-03-16 12:09:08 -060012058 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012059
12060 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12061 VkImageTiling tiling;
12062 VkFormatProperties format_properties;
12063 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12064 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12065 tiling = VK_IMAGE_TILING_LINEAR;
12066 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12067 tiling = VK_IMAGE_TILING_OPTIMAL;
12068 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012069 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012070 return;
12071 }
12072
12073 VkDescriptorPoolSize ds_type = {};
12074 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12075 ds_type.descriptorCount = 1;
12076
12077 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12078 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12079 ds_pool_ci.maxSets = 1;
12080 ds_pool_ci.poolSizeCount = 1;
12081 ds_pool_ci.pPoolSizes = &ds_type;
12082 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12083
12084 VkDescriptorPool ds_pool;
12085 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12086 ASSERT_VK_SUCCESS(err);
12087
12088 VkDescriptorSetLayoutBinding dsl_binding = {};
12089 dsl_binding.binding = 0;
12090 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12091 dsl_binding.descriptorCount = 1;
12092 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12093 dsl_binding.pImmutableSamplers = NULL;
12094
12095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12097 ds_layout_ci.pNext = NULL;
12098 ds_layout_ci.bindingCount = 1;
12099 ds_layout_ci.pBindings = &dsl_binding;
12100
12101 VkDescriptorSetLayout ds_layout;
12102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12103 ASSERT_VK_SUCCESS(err);
12104
12105 VkDescriptorSetAllocateInfo alloc_info = {};
12106 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12107 alloc_info.descriptorSetCount = 1;
12108 alloc_info.descriptorPool = ds_pool;
12109 alloc_info.pSetLayouts = &ds_layout;
12110 VkDescriptorSet descriptor_set;
12111 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12112 ASSERT_VK_SUCCESS(err);
12113
12114 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12115 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12116 pipeline_layout_ci.pNext = NULL;
12117 pipeline_layout_ci.setLayoutCount = 1;
12118 pipeline_layout_ci.pSetLayouts = &ds_layout;
12119 VkPipelineLayout pipeline_layout;
12120 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12121 ASSERT_VK_SUCCESS(err);
12122
12123 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012124 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012125 ASSERT_TRUE(image.initialized());
12126 VkImageView view = image.targetView(tex_format);
12127
12128 VkDescriptorImageInfo image_info = {};
12129 image_info.imageView = view;
12130 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12131
12132 VkWriteDescriptorSet descriptor_write = {};
12133 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12134 descriptor_write.dstSet = descriptor_set;
12135 descriptor_write.dstBinding = 0;
12136 descriptor_write.descriptorCount = 1;
12137 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12138 descriptor_write.pImageInfo = &image_info;
12139
12140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12141 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12142 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12143 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12144 m_errorMonitor->VerifyFound();
12145
12146 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12147 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12148 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12149 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12150}
12151
Mark Mueller93b938f2016-08-18 10:27:40 -060012152TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012153 TEST_DESCRIPTION(
12154 "Use vkCmdExecuteCommands with invalid state "
12155 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012156
Tony Barbour1fa09702017-03-16 12:09:08 -060012157 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012158 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12159
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012160 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012161 const char *simultaneous_use_message2 =
12162 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12163 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012164
12165 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012166 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012167 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012168 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12169 command_buffer_allocate_info.commandBufferCount = 1;
12170
12171 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012172 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012173 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12174 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012175 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012176 command_buffer_inheritance_info.renderPass = m_renderPass;
12177 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012178
Mark Mueller93b938f2016-08-18 10:27:40 -060012179 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012180 command_buffer_begin_info.flags =
12181 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012182 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12183
12184 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12185 vkEndCommandBuffer(secondary_command_buffer);
12186
Mark Mueller93b938f2016-08-18 10:27:40 -060012187 VkSubmitInfo submit_info = {};
12188 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12189 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012190 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012191
Mark Mueller4042b652016-09-05 22:52:21 -060012192 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012193 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12194 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12195 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012196 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012197 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012198 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12199 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012200
Dave Houltonfbf52152017-01-06 12:55:29 -070012201 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012202 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012203 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012204
Mark Mueller4042b652016-09-05 22:52:21 -060012205 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012206 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12207 m_errorMonitor->SetUnexpectedError(
12208 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12209 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012210 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012211 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012212
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12214 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012215 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012216 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12217 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012218
12219 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012220
12221 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012222}
12223
Tony Barbour626994c2017-02-08 15:29:37 -070012224TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12225 TEST_DESCRIPTION(
12226 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12227 "errors");
12228 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12229 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 -060012230 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012231
12232 VkCommandBuffer cmd_bufs[2];
12233 VkCommandBufferAllocateInfo alloc_info;
12234 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12235 alloc_info.pNext = NULL;
12236 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012237 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012238 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12239 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12240
12241 VkCommandBufferBeginInfo cb_binfo;
12242 cb_binfo.pNext = NULL;
12243 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12244 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12245 cb_binfo.flags = 0;
12246 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12247 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12248 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12249 vkEndCommandBuffer(cmd_bufs[0]);
12250 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12251
12252 VkSubmitInfo submit_info = {};
12253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12254 submit_info.commandBufferCount = 2;
12255 submit_info.pCommandBuffers = duplicates;
12256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12257 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12258 m_errorMonitor->VerifyFound();
12259 vkQueueWaitIdle(m_device->m_queue);
12260
12261 // Set one time use and now look for one time submit
12262 duplicates[0] = duplicates[1] = cmd_bufs[1];
12263 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12264 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12265 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12266 vkEndCommandBuffer(cmd_bufs[1]);
12267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12268 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12269 m_errorMonitor->VerifyFound();
12270 vkQueueWaitIdle(m_device->m_queue);
12271}
12272
Tobin Ehlisb093da82017-01-19 12:05:27 -070012273TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012274 TEST_DESCRIPTION(
12275 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12276 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012277
Tony Barbour1fa09702017-03-16 12:09:08 -060012278 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012279 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12280
12281 std::vector<const char *> device_extension_names;
12282 auto features = m_device->phy().features();
12283 // Make sure gs & ts are disabled
12284 features.geometryShader = false;
12285 features.tessellationShader = false;
12286 // The sacrificial device object
12287 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12288
12289 VkCommandPoolCreateInfo pool_create_info{};
12290 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12291 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12292
12293 VkCommandPool command_pool;
12294 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12295
12296 VkCommandBufferAllocateInfo cmd = {};
12297 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12298 cmd.pNext = NULL;
12299 cmd.commandPool = command_pool;
12300 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12301 cmd.commandBufferCount = 1;
12302
12303 VkCommandBuffer cmd_buffer;
12304 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12305 ASSERT_VK_SUCCESS(err);
12306
12307 VkEvent event;
12308 VkEventCreateInfo evci = {};
12309 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12310 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12311 ASSERT_VK_SUCCESS(result);
12312
12313 VkCommandBufferBeginInfo cbbi = {};
12314 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12315 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12317 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12318 m_errorMonitor->VerifyFound();
12319
12320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12321 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12322 m_errorMonitor->VerifyFound();
12323
12324 vkDestroyEvent(test_device.handle(), event, NULL);
12325 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12326}
12327
Mark Mueller917f6bc2016-08-30 10:57:19 -060012328TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012329 TEST_DESCRIPTION(
12330 "Use vkCmdExecuteCommands with invalid state "
12331 "in primary and secondary command buffers. "
12332 "Delete objects that are inuse. Call VkQueueSubmit "
12333 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012334
Tony Barbour1fa09702017-03-16 12:09:08 -060012335 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12337
Tony Barbour552f6c02016-12-21 14:34:07 -070012338 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012339
12340 VkEvent event;
12341 VkEventCreateInfo event_create_info = {};
12342 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12343 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012344 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012345
Tony Barbour552f6c02016-12-21 14:34:07 -070012346 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012347 vkDestroyEvent(m_device->device(), event, nullptr);
12348
12349 VkSubmitInfo submit_info = {};
12350 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12351 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012352 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012354 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12355 m_errorMonitor->VerifyFound();
12356
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012357 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012358 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12359
12360 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12361
Mark Mueller917f6bc2016-08-30 10:57:19 -060012362 VkSemaphoreCreateInfo semaphore_create_info = {};
12363 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12364 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012365 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012366 VkFenceCreateInfo fence_create_info = {};
12367 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12368 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012369 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012370
12371 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012372 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012373 descriptor_pool_type_count.descriptorCount = 1;
12374
12375 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12376 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12377 descriptor_pool_create_info.maxSets = 1;
12378 descriptor_pool_create_info.poolSizeCount = 1;
12379 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012380 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012381
12382 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012383 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012384
12385 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012386 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012387 descriptorset_layout_binding.descriptorCount = 1;
12388 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12389
12390 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012391 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012392 descriptorset_layout_create_info.bindingCount = 1;
12393 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12394
12395 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012396 ASSERT_VK_SUCCESS(
12397 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012398
12399 VkDescriptorSet descriptorset;
12400 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012401 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012402 descriptorset_allocate_info.descriptorSetCount = 1;
12403 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12404 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012405 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012406
Mark Mueller4042b652016-09-05 22:52:21 -060012407 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12408
12409 VkDescriptorBufferInfo buffer_info = {};
12410 buffer_info.buffer = buffer_test.GetBuffer();
12411 buffer_info.offset = 0;
12412 buffer_info.range = 1024;
12413
12414 VkWriteDescriptorSet write_descriptor_set = {};
12415 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12416 write_descriptor_set.dstSet = descriptorset;
12417 write_descriptor_set.descriptorCount = 1;
12418 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12419 write_descriptor_set.pBufferInfo = &buffer_info;
12420
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012421 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012422
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012423 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12424 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012425
12426 VkPipelineObj pipe(m_device);
12427 pipe.AddColorAttachment();
12428 pipe.AddShader(&vs);
12429 pipe.AddShader(&fs);
12430
12431 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012432 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012433 pipeline_layout_create_info.setLayoutCount = 1;
12434 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12435
12436 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012437 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012438
12439 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12440
Tony Barbour552f6c02016-12-21 14:34:07 -070012441 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012442 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012443
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012444 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12445 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12446 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012447
Tony Barbour552f6c02016-12-21 14:34:07 -070012448 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012449
Mark Mueller917f6bc2016-08-30 10:57:19 -060012450 submit_info.signalSemaphoreCount = 1;
12451 submit_info.pSignalSemaphores = &semaphore;
12452 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012453 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012454
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012456 vkDestroyEvent(m_device->device(), event, nullptr);
12457 m_errorMonitor->VerifyFound();
12458
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012460 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12461 m_errorMonitor->VerifyFound();
12462
Jeremy Hayes08369882017-02-02 10:31:06 -070012463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012464 vkDestroyFence(m_device->device(), fence, nullptr);
12465 m_errorMonitor->VerifyFound();
12466
Tobin Ehlis122207b2016-09-01 08:50:06 -070012467 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012468 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12469 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012470 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012471 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12472 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012473 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012474 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12475 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012476 vkDestroyEvent(m_device->device(), event, nullptr);
12477 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012478 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012479 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12480}
12481
Tobin Ehlis2adda372016-09-01 08:51:06 -070012482TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12483 TEST_DESCRIPTION("Delete in-use query pool.");
12484
Tony Barbour1fa09702017-03-16 12:09:08 -060012485 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12487
12488 VkQueryPool query_pool;
12489 VkQueryPoolCreateInfo query_pool_ci{};
12490 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12491 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12492 query_pool_ci.queryCount = 1;
12493 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012494 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012495 // Reset query pool to create binding with cmd buffer
12496 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12497
Tony Barbour552f6c02016-12-21 14:34:07 -070012498 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012499
12500 VkSubmitInfo submit_info = {};
12501 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12502 submit_info.commandBufferCount = 1;
12503 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12504 // Submit cmd buffer and then destroy query pool while in-flight
12505 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12506
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012508 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12509 m_errorMonitor->VerifyFound();
12510
12511 vkQueueWaitIdle(m_device->m_queue);
12512 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012513 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12514 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012515 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12516}
12517
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012518TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12519 TEST_DESCRIPTION("Delete in-use pipeline.");
12520
Tony Barbour1fa09702017-03-16 12:09:08 -060012521 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12523
12524 // Empty pipeline layout used for binding PSO
12525 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12526 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12527 pipeline_layout_ci.setLayoutCount = 0;
12528 pipeline_layout_ci.pSetLayouts = NULL;
12529
12530 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012531 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012532 ASSERT_VK_SUCCESS(err);
12533
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012535 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012536 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12537 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012538 // Store pipeline handle so we can actually delete it before test finishes
12539 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012540 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012541 VkPipelineObj pipe(m_device);
12542 pipe.AddShader(&vs);
12543 pipe.AddShader(&fs);
12544 pipe.AddColorAttachment();
12545 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12546 delete_this_pipeline = pipe.handle();
12547
Tony Barbour552f6c02016-12-21 14:34:07 -070012548 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012549 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012550 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012551
Tony Barbour552f6c02016-12-21 14:34:07 -070012552 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012553
12554 VkSubmitInfo submit_info = {};
12555 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12556 submit_info.commandBufferCount = 1;
12557 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12558 // Submit cmd buffer and then pipeline destroyed while in-flight
12559 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012560 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012561 m_errorMonitor->VerifyFound();
12562 // Make sure queue finished and then actually delete pipeline
12563 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012564 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12565 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012566 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12567 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12568}
12569
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012570TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12571 TEST_DESCRIPTION("Delete in-use imageView.");
12572
Tony Barbour1fa09702017-03-16 12:09:08 -060012573 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12575
12576 VkDescriptorPoolSize ds_type_count;
12577 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12578 ds_type_count.descriptorCount = 1;
12579
12580 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12581 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12582 ds_pool_ci.maxSets = 1;
12583 ds_pool_ci.poolSizeCount = 1;
12584 ds_pool_ci.pPoolSizes = &ds_type_count;
12585
12586 VkDescriptorPool ds_pool;
12587 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12588 ASSERT_VK_SUCCESS(err);
12589
12590 VkSamplerCreateInfo sampler_ci = {};
12591 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12592 sampler_ci.pNext = NULL;
12593 sampler_ci.magFilter = VK_FILTER_NEAREST;
12594 sampler_ci.minFilter = VK_FILTER_NEAREST;
12595 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12596 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12597 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12598 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12599 sampler_ci.mipLodBias = 1.0;
12600 sampler_ci.anisotropyEnable = VK_FALSE;
12601 sampler_ci.maxAnisotropy = 1;
12602 sampler_ci.compareEnable = VK_FALSE;
12603 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12604 sampler_ci.minLod = 1.0;
12605 sampler_ci.maxLod = 1.0;
12606 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12607 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12608 VkSampler sampler;
12609
12610 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12611 ASSERT_VK_SUCCESS(err);
12612
12613 VkDescriptorSetLayoutBinding layout_binding;
12614 layout_binding.binding = 0;
12615 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12616 layout_binding.descriptorCount = 1;
12617 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12618 layout_binding.pImmutableSamplers = NULL;
12619
12620 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12621 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12622 ds_layout_ci.bindingCount = 1;
12623 ds_layout_ci.pBindings = &layout_binding;
12624 VkDescriptorSetLayout ds_layout;
12625 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12626 ASSERT_VK_SUCCESS(err);
12627
12628 VkDescriptorSetAllocateInfo alloc_info = {};
12629 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12630 alloc_info.descriptorSetCount = 1;
12631 alloc_info.descriptorPool = ds_pool;
12632 alloc_info.pSetLayouts = &ds_layout;
12633 VkDescriptorSet descriptor_set;
12634 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12635 ASSERT_VK_SUCCESS(err);
12636
12637 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12638 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12639 pipeline_layout_ci.pNext = NULL;
12640 pipeline_layout_ci.setLayoutCount = 1;
12641 pipeline_layout_ci.pSetLayouts = &ds_layout;
12642
12643 VkPipelineLayout pipeline_layout;
12644 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12645 ASSERT_VK_SUCCESS(err);
12646
12647 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012648 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012649 ASSERT_TRUE(image.initialized());
12650
12651 VkImageView view;
12652 VkImageViewCreateInfo ivci = {};
12653 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12654 ivci.image = image.handle();
12655 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12656 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12657 ivci.subresourceRange.layerCount = 1;
12658 ivci.subresourceRange.baseMipLevel = 0;
12659 ivci.subresourceRange.levelCount = 1;
12660 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12661
12662 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12663 ASSERT_VK_SUCCESS(err);
12664
12665 VkDescriptorImageInfo image_info{};
12666 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12667 image_info.imageView = view;
12668 image_info.sampler = sampler;
12669
12670 VkWriteDescriptorSet descriptor_write = {};
12671 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12672 descriptor_write.dstSet = descriptor_set;
12673 descriptor_write.dstBinding = 0;
12674 descriptor_write.descriptorCount = 1;
12675 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12676 descriptor_write.pImageInfo = &image_info;
12677
12678 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12679
12680 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012681 char const *vsSource =
12682 "#version 450\n"
12683 "\n"
12684 "out gl_PerVertex { \n"
12685 " vec4 gl_Position;\n"
12686 "};\n"
12687 "void main(){\n"
12688 " gl_Position = vec4(1);\n"
12689 "}\n";
12690 char const *fsSource =
12691 "#version 450\n"
12692 "\n"
12693 "layout(set=0, binding=0) uniform sampler2D s;\n"
12694 "layout(location=0) out vec4 x;\n"
12695 "void main(){\n"
12696 " x = texture(s, vec2(1));\n"
12697 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012698 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12699 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12700 VkPipelineObj pipe(m_device);
12701 pipe.AddShader(&vs);
12702 pipe.AddShader(&fs);
12703 pipe.AddColorAttachment();
12704 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12705
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012707
Tony Barbour552f6c02016-12-21 14:34:07 -070012708 m_commandBuffer->BeginCommandBuffer();
12709 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012710 // Bind pipeline to cmd buffer
12711 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12712 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12713 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012714
12715 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12716 VkRect2D scissor = {{0, 0}, {16, 16}};
12717 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12718 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12719
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012720 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012721 m_commandBuffer->EndRenderPass();
12722 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012723 // Submit cmd buffer then destroy sampler
12724 VkSubmitInfo submit_info = {};
12725 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12726 submit_info.commandBufferCount = 1;
12727 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12728 // Submit cmd buffer and then destroy imageView while in-flight
12729 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12730
12731 vkDestroyImageView(m_device->device(), view, nullptr);
12732 m_errorMonitor->VerifyFound();
12733 vkQueueWaitIdle(m_device->m_queue);
12734 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012735 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12736 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012737 vkDestroyImageView(m_device->device(), view, NULL);
12738 vkDestroySampler(m_device->device(), sampler, nullptr);
12739 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12740 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12741 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12742}
12743
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012744TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12745 TEST_DESCRIPTION("Delete in-use bufferView.");
12746
Tony Barbour1fa09702017-03-16 12:09:08 -060012747 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12749
12750 VkDescriptorPoolSize ds_type_count;
12751 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12752 ds_type_count.descriptorCount = 1;
12753
12754 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12755 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12756 ds_pool_ci.maxSets = 1;
12757 ds_pool_ci.poolSizeCount = 1;
12758 ds_pool_ci.pPoolSizes = &ds_type_count;
12759
12760 VkDescriptorPool ds_pool;
12761 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12762 ASSERT_VK_SUCCESS(err);
12763
12764 VkDescriptorSetLayoutBinding layout_binding;
12765 layout_binding.binding = 0;
12766 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12767 layout_binding.descriptorCount = 1;
12768 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12769 layout_binding.pImmutableSamplers = NULL;
12770
12771 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12772 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12773 ds_layout_ci.bindingCount = 1;
12774 ds_layout_ci.pBindings = &layout_binding;
12775 VkDescriptorSetLayout ds_layout;
12776 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12777 ASSERT_VK_SUCCESS(err);
12778
12779 VkDescriptorSetAllocateInfo alloc_info = {};
12780 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12781 alloc_info.descriptorSetCount = 1;
12782 alloc_info.descriptorPool = ds_pool;
12783 alloc_info.pSetLayouts = &ds_layout;
12784 VkDescriptorSet descriptor_set;
12785 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12786 ASSERT_VK_SUCCESS(err);
12787
12788 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12789 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12790 pipeline_layout_ci.pNext = NULL;
12791 pipeline_layout_ci.setLayoutCount = 1;
12792 pipeline_layout_ci.pSetLayouts = &ds_layout;
12793
12794 VkPipelineLayout pipeline_layout;
12795 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12796 ASSERT_VK_SUCCESS(err);
12797
12798 VkBuffer buffer;
12799 uint32_t queue_family_index = 0;
12800 VkBufferCreateInfo buffer_create_info = {};
12801 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12802 buffer_create_info.size = 1024;
12803 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12804 buffer_create_info.queueFamilyIndexCount = 1;
12805 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12806
12807 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12808 ASSERT_VK_SUCCESS(err);
12809
12810 VkMemoryRequirements memory_reqs;
12811 VkDeviceMemory buffer_memory;
12812
12813 VkMemoryAllocateInfo memory_info = {};
12814 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12815 memory_info.allocationSize = 0;
12816 memory_info.memoryTypeIndex = 0;
12817
12818 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12819 memory_info.allocationSize = memory_reqs.size;
12820 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12821 ASSERT_TRUE(pass);
12822
12823 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12824 ASSERT_VK_SUCCESS(err);
12825 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12826 ASSERT_VK_SUCCESS(err);
12827
12828 VkBufferView view;
12829 VkBufferViewCreateInfo bvci = {};
12830 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12831 bvci.buffer = buffer;
12832 bvci.format = VK_FORMAT_R8_UNORM;
12833 bvci.range = VK_WHOLE_SIZE;
12834
12835 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12836 ASSERT_VK_SUCCESS(err);
12837
12838 VkWriteDescriptorSet descriptor_write = {};
12839 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12840 descriptor_write.dstSet = descriptor_set;
12841 descriptor_write.dstBinding = 0;
12842 descriptor_write.descriptorCount = 1;
12843 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12844 descriptor_write.pTexelBufferView = &view;
12845
12846 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12847
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012848 char const *vsSource =
12849 "#version 450\n"
12850 "\n"
12851 "out gl_PerVertex { \n"
12852 " vec4 gl_Position;\n"
12853 "};\n"
12854 "void main(){\n"
12855 " gl_Position = vec4(1);\n"
12856 "}\n";
12857 char const *fsSource =
12858 "#version 450\n"
12859 "\n"
12860 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12861 "layout(location=0) out vec4 x;\n"
12862 "void main(){\n"
12863 " x = imageLoad(s, 0);\n"
12864 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012865 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12866 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12867 VkPipelineObj pipe(m_device);
12868 pipe.AddShader(&vs);
12869 pipe.AddShader(&fs);
12870 pipe.AddColorAttachment();
12871 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12872
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012874
Tony Barbour552f6c02016-12-21 14:34:07 -070012875 m_commandBuffer->BeginCommandBuffer();
12876 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012877 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12878 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12879 VkRect2D scissor = {{0, 0}, {16, 16}};
12880 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12881 // Bind pipeline to cmd buffer
12882 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12883 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12884 &descriptor_set, 0, nullptr);
12885 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012886 m_commandBuffer->EndRenderPass();
12887 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012888
12889 VkSubmitInfo submit_info = {};
12890 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12891 submit_info.commandBufferCount = 1;
12892 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12893 // Submit cmd buffer and then destroy bufferView while in-flight
12894 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12895
12896 vkDestroyBufferView(m_device->device(), view, nullptr);
12897 m_errorMonitor->VerifyFound();
12898 vkQueueWaitIdle(m_device->m_queue);
12899 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012900 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12901 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012902 vkDestroyBufferView(m_device->device(), view, NULL);
12903 vkDestroyBuffer(m_device->device(), buffer, NULL);
12904 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12905 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12906 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12907 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12908}
12909
Tobin Ehlis209532e2016-09-07 13:52:18 -060012910TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12911 TEST_DESCRIPTION("Delete in-use sampler.");
12912
Tony Barbour1fa09702017-03-16 12:09:08 -060012913 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12915
12916 VkDescriptorPoolSize ds_type_count;
12917 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12918 ds_type_count.descriptorCount = 1;
12919
12920 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12921 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12922 ds_pool_ci.maxSets = 1;
12923 ds_pool_ci.poolSizeCount = 1;
12924 ds_pool_ci.pPoolSizes = &ds_type_count;
12925
12926 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012927 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012928 ASSERT_VK_SUCCESS(err);
12929
12930 VkSamplerCreateInfo sampler_ci = {};
12931 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12932 sampler_ci.pNext = NULL;
12933 sampler_ci.magFilter = VK_FILTER_NEAREST;
12934 sampler_ci.minFilter = VK_FILTER_NEAREST;
12935 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12936 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12937 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12938 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12939 sampler_ci.mipLodBias = 1.0;
12940 sampler_ci.anisotropyEnable = VK_FALSE;
12941 sampler_ci.maxAnisotropy = 1;
12942 sampler_ci.compareEnable = VK_FALSE;
12943 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12944 sampler_ci.minLod = 1.0;
12945 sampler_ci.maxLod = 1.0;
12946 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12947 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12948 VkSampler sampler;
12949
12950 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12951 ASSERT_VK_SUCCESS(err);
12952
12953 VkDescriptorSetLayoutBinding layout_binding;
12954 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012955 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012956 layout_binding.descriptorCount = 1;
12957 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12958 layout_binding.pImmutableSamplers = NULL;
12959
12960 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12961 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12962 ds_layout_ci.bindingCount = 1;
12963 ds_layout_ci.pBindings = &layout_binding;
12964 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012965 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012966 ASSERT_VK_SUCCESS(err);
12967
12968 VkDescriptorSetAllocateInfo alloc_info = {};
12969 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12970 alloc_info.descriptorSetCount = 1;
12971 alloc_info.descriptorPool = ds_pool;
12972 alloc_info.pSetLayouts = &ds_layout;
12973 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012974 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012975 ASSERT_VK_SUCCESS(err);
12976
12977 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12978 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12979 pipeline_layout_ci.pNext = NULL;
12980 pipeline_layout_ci.setLayoutCount = 1;
12981 pipeline_layout_ci.pSetLayouts = &ds_layout;
12982
12983 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012984 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012985 ASSERT_VK_SUCCESS(err);
12986
12987 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012988 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012989 ASSERT_TRUE(image.initialized());
12990
12991 VkImageView view;
12992 VkImageViewCreateInfo ivci = {};
12993 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12994 ivci.image = image.handle();
12995 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12996 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12997 ivci.subresourceRange.layerCount = 1;
12998 ivci.subresourceRange.baseMipLevel = 0;
12999 ivci.subresourceRange.levelCount = 1;
13000 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13001
13002 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13003 ASSERT_VK_SUCCESS(err);
13004
13005 VkDescriptorImageInfo image_info{};
13006 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13007 image_info.imageView = view;
13008 image_info.sampler = sampler;
13009
13010 VkWriteDescriptorSet descriptor_write = {};
13011 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13012 descriptor_write.dstSet = descriptor_set;
13013 descriptor_write.dstBinding = 0;
13014 descriptor_write.descriptorCount = 1;
13015 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13016 descriptor_write.pImageInfo = &image_info;
13017
13018 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13019
13020 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013021 char const *vsSource =
13022 "#version 450\n"
13023 "\n"
13024 "out gl_PerVertex { \n"
13025 " vec4 gl_Position;\n"
13026 "};\n"
13027 "void main(){\n"
13028 " gl_Position = vec4(1);\n"
13029 "}\n";
13030 char const *fsSource =
13031 "#version 450\n"
13032 "\n"
13033 "layout(set=0, binding=0) uniform sampler2D s;\n"
13034 "layout(location=0) out vec4 x;\n"
13035 "void main(){\n"
13036 " x = texture(s, vec2(1));\n"
13037 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013038 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13039 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13040 VkPipelineObj pipe(m_device);
13041 pipe.AddShader(&vs);
13042 pipe.AddShader(&fs);
13043 pipe.AddColorAttachment();
13044 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13045
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013047
Tony Barbour552f6c02016-12-21 14:34:07 -070013048 m_commandBuffer->BeginCommandBuffer();
13049 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013050 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013051 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13052 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13053 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013054
13055 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13056 VkRect2D scissor = {{0, 0}, {16, 16}};
13057 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13058 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13059
Tobin Ehlis209532e2016-09-07 13:52:18 -060013060 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013061 m_commandBuffer->EndRenderPass();
13062 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013063 // Submit cmd buffer then destroy sampler
13064 VkSubmitInfo submit_info = {};
13065 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13066 submit_info.commandBufferCount = 1;
13067 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13068 // Submit cmd buffer and then destroy sampler while in-flight
13069 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13070
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013071 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013072 m_errorMonitor->VerifyFound();
13073 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013074
Tobin Ehlis209532e2016-09-07 13:52:18 -060013075 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013076 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13077 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013078 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013079 vkDestroyImageView(m_device->device(), view, NULL);
13080 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13081 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13082 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13083}
13084
Mark Mueller1cd9f412016-08-25 13:23:52 -060013085TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013086 TEST_DESCRIPTION(
13087 "Call VkQueueSubmit with a semaphore that is already "
13088 "signaled but not waited on by the queue. Wait on a "
13089 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013090
Tony Barbour1fa09702017-03-16 12:09:08 -060013091 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013092 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013094 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 -070013095 const char *invalid_fence_wait_message =
13096 " which has not been submitted on a Queue or during "
13097 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013098
Tony Barbour552f6c02016-12-21 14:34:07 -070013099 m_commandBuffer->BeginCommandBuffer();
13100 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013101
13102 VkSemaphoreCreateInfo semaphore_create_info = {};
13103 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13104 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013105 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013106 VkSubmitInfo submit_info = {};
13107 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13108 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013109 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013110 submit_info.signalSemaphoreCount = 1;
13111 submit_info.pSignalSemaphores = &semaphore;
13112 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013113 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013114 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013115 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013116 m_commandBuffer->BeginCommandBuffer();
13117 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013119 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13120 m_errorMonitor->VerifyFound();
13121
Mark Mueller1cd9f412016-08-25 13:23:52 -060013122 VkFenceCreateInfo fence_create_info = {};
13123 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13124 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013125 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013126
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013128 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13129 m_errorMonitor->VerifyFound();
13130
Mark Mueller4042b652016-09-05 22:52:21 -060013131 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013132 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013133 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13134}
13135
Tobin Ehlis4af23302016-07-19 10:50:30 -060013136TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013137 TEST_DESCRIPTION(
13138 "Bind a secondary command buffer with with a framebuffer "
13139 "that does not match the framebuffer for the active "
13140 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013141 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13143
13144 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013145 VkAttachmentDescription attachment = {0,
13146 VK_FORMAT_B8G8R8A8_UNORM,
13147 VK_SAMPLE_COUNT_1_BIT,
13148 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13149 VK_ATTACHMENT_STORE_OP_STORE,
13150 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13151 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13152 VK_IMAGE_LAYOUT_UNDEFINED,
13153 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013155 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013156
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013157 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013158
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013159 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013160
13161 VkRenderPass rp;
13162 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13163 ASSERT_VK_SUCCESS(err);
13164
13165 // A compatible framebuffer.
13166 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013167 image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013168 ASSERT_TRUE(image.initialized());
13169
13170 VkImageViewCreateInfo ivci = {
13171 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13172 nullptr,
13173 0,
13174 image.handle(),
13175 VK_IMAGE_VIEW_TYPE_2D,
13176 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013177 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13178 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013179 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13180 };
13181 VkImageView view;
13182 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13183 ASSERT_VK_SUCCESS(err);
13184
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013185 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013186 VkFramebuffer fb;
13187 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13188 ASSERT_VK_SUCCESS(err);
13189
13190 VkCommandBufferAllocateInfo cbai = {};
13191 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013192 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013193 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13194 cbai.commandBufferCount = 1;
13195
13196 VkCommandBuffer sec_cb;
13197 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13198 ASSERT_VK_SUCCESS(err);
13199 VkCommandBufferBeginInfo cbbi = {};
13200 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013201 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013202 cbii.renderPass = renderPass();
13203 cbii.framebuffer = fb;
13204 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13205 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013206 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 -060013207 cbbi.pInheritanceInfo = &cbii;
13208 vkBeginCommandBuffer(sec_cb, &cbbi);
13209 vkEndCommandBuffer(sec_cb);
13210
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013211 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013212 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13213 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013214
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013216 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013217 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13218 m_errorMonitor->VerifyFound();
13219 // Cleanup
13220 vkDestroyImageView(m_device->device(), view, NULL);
13221 vkDestroyRenderPass(m_device->device(), rp, NULL);
13222 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13223}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013224
13225TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013226 TEST_DESCRIPTION(
13227 "If logicOp is available on the device, set it to an "
13228 "invalid value. If logicOp is not available, attempt to "
13229 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013230 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13232
13233 auto features = m_device->phy().features();
13234 // Set the expected error depending on whether or not logicOp available
13235 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13237 "If logic operations feature not "
13238 "enabled, logicOpEnable must be "
13239 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013240 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013242 }
13243 // Create a pipeline using logicOp
13244 VkResult err;
13245
13246 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13247 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13248
13249 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013250 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013251 ASSERT_VK_SUCCESS(err);
13252
13253 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13254 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13255 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013256 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013257 vp_state_ci.pViewports = &vp;
13258 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013259 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013260 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013261
13262 VkPipelineShaderStageCreateInfo shaderStages[2];
13263 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13264
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013265 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13266 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013267 shaderStages[0] = vs.GetStageCreateInfo();
13268 shaderStages[1] = fs.GetStageCreateInfo();
13269
13270 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13271 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13272
13273 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13274 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13275 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13276
13277 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13278 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013279 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013280
13281 VkPipelineColorBlendAttachmentState att = {};
13282 att.blendEnable = VK_FALSE;
13283 att.colorWriteMask = 0xf;
13284
13285 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13286 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13287 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13288 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013289 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013290 cb_ci.attachmentCount = 1;
13291 cb_ci.pAttachments = &att;
13292
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013293 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13294 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13295 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13296
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013297 VkGraphicsPipelineCreateInfo gp_ci = {};
13298 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13299 gp_ci.stageCount = 2;
13300 gp_ci.pStages = shaderStages;
13301 gp_ci.pVertexInputState = &vi_ci;
13302 gp_ci.pInputAssemblyState = &ia_ci;
13303 gp_ci.pViewportState = &vp_state_ci;
13304 gp_ci.pRasterizationState = &rs_ci;
13305 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013306 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013307 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13308 gp_ci.layout = pipeline_layout;
13309 gp_ci.renderPass = renderPass();
13310
13311 VkPipelineCacheCreateInfo pc_ci = {};
13312 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13313
13314 VkPipeline pipeline;
13315 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013316 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013317 ASSERT_VK_SUCCESS(err);
13318
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013319 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013320 m_errorMonitor->VerifyFound();
13321 if (VK_SUCCESS == err) {
13322 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13323 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013324 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13325 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13326}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013327
Mike Stroyanaccf7692015-05-12 16:00:45 -060013328#if GTEST_IS_THREADSAFE
13329struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013330 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013331 VkEvent event;
13332 bool bailout;
13333};
13334
Karl Schultz6addd812016-02-02 17:17:23 -070013335extern "C" void *AddToCommandBuffer(void *arg) {
13336 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013337
Mike Stroyana6d14942016-07-13 15:10:05 -060013338 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013339 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013340 if (data->bailout) {
13341 break;
13342 }
13343 }
13344 return NULL;
13345}
13346
Karl Schultz6addd812016-02-02 17:17:23 -070013347TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013348 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013351
Tony Barbour1fa09702017-03-16 12:09:08 -060013352 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013353 ASSERT_NO_FATAL_FAILURE(InitViewport());
13354 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13355
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013356 // Calls AllocateCommandBuffers
13357 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013358
13359 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013360 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013361
13362 VkEventCreateInfo event_info;
13363 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013364 VkResult err;
13365
13366 memset(&event_info, 0, sizeof(event_info));
13367 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13368
Chia-I Wuf7458c52015-10-26 21:10:41 +080013369 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013370 ASSERT_VK_SUCCESS(err);
13371
Mike Stroyanaccf7692015-05-12 16:00:45 -060013372 err = vkResetEvent(device(), event);
13373 ASSERT_VK_SUCCESS(err);
13374
13375 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013376 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013377 data.event = event;
13378 data.bailout = false;
13379 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013380
13381 // First do some correct operations using multiple threads.
13382 // Add many entries to command buffer from another thread.
13383 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13384 // Make non-conflicting calls from this thread at the same time.
13385 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013386 uint32_t count;
13387 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013388 }
13389 test_platform_thread_join(thread, NULL);
13390
13391 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013392 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013393 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013394 // Add many entries to command buffer from this thread at the same time.
13395 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013396
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013397 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013398 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013399
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013400 m_errorMonitor->SetBailout(NULL);
13401
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013402 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013403
Chia-I Wuf7458c52015-10-26 21:10:41 +080013404 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013405}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013406#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013407
Karl Schultz6addd812016-02-02 17:17:23 -070013408TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013409 TEST_DESCRIPTION(
13410 "Test that an error is produced for a spirv module "
13411 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013412
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013413 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013414
Tony Barbour1fa09702017-03-16 12:09:08 -060013415 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13417
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013418 VkShaderModule module;
13419 VkShaderModuleCreateInfo moduleCreateInfo;
13420 struct icd_spv_header spv;
13421
13422 spv.magic = ICD_SPV_MAGIC;
13423 spv.version = ICD_SPV_VERSION;
13424 spv.gen_magic = 0;
13425
13426 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13427 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013428 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013429 moduleCreateInfo.codeSize = 4;
13430 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013431 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013432
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013433 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013434}
13435
Karl Schultz6addd812016-02-02 17:17:23 -070013436TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013437 TEST_DESCRIPTION(
13438 "Test that an error is produced for a spirv module "
13439 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013440
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013442
Tony Barbour1fa09702017-03-16 12:09:08 -060013443 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013444 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13445
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013446 VkShaderModule module;
13447 VkShaderModuleCreateInfo moduleCreateInfo;
13448 struct icd_spv_header spv;
13449
13450 spv.magic = ~ICD_SPV_MAGIC;
13451 spv.version = ICD_SPV_VERSION;
13452 spv.gen_magic = 0;
13453
13454 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13455 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013456 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013457 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13458 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013459 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013460
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013461 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013462}
13463
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013464#if 0
13465// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013466TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013468 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013469
Tony Barbour1fa09702017-03-16 12:09:08 -060013470 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013471 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13472
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013473 VkShaderModule module;
13474 VkShaderModuleCreateInfo moduleCreateInfo;
13475 struct icd_spv_header spv;
13476
13477 spv.magic = ICD_SPV_MAGIC;
13478 spv.version = ~ICD_SPV_VERSION;
13479 spv.gen_magic = 0;
13480
13481 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13482 moduleCreateInfo.pNext = NULL;
13483
Karl Schultz6addd812016-02-02 17:17:23 -070013484 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013485 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13486 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013487 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013488
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013489 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013490}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013491#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013492
Karl Schultz6addd812016-02-02 17:17:23 -070013493TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013494 TEST_DESCRIPTION(
13495 "Test that a warning is produced for a vertex output that "
13496 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013498
Tony Barbour1fa09702017-03-16 12:09:08 -060013499 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013500 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013501
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013502 char const *vsSource =
13503 "#version 450\n"
13504 "\n"
13505 "layout(location=0) out float x;\n"
13506 "out gl_PerVertex {\n"
13507 " vec4 gl_Position;\n"
13508 "};\n"
13509 "void main(){\n"
13510 " gl_Position = vec4(1);\n"
13511 " x = 0;\n"
13512 "}\n";
13513 char const *fsSource =
13514 "#version 450\n"
13515 "\n"
13516 "layout(location=0) out vec4 color;\n"
13517 "void main(){\n"
13518 " color = vec4(1);\n"
13519 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013520
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013521 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13522 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013523
13524 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013525 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013526 pipe.AddShader(&vs);
13527 pipe.AddShader(&fs);
13528
Chris Forbes9f7ff632015-05-25 11:13:08 +120013529 VkDescriptorSetObj descriptorSet(m_device);
13530 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013531 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013532
Tony Barbour5781e8f2015-08-04 16:23:11 -060013533 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013534
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013535 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013536}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013537
Mark Mueller098c9cb2016-09-08 09:01:57 -060013538TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13539 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13540
Tony Barbour1fa09702017-03-16 12:09:08 -060013541 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013542 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13543
13544 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013545 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013546
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013547 char const *vsSource =
13548 "#version 450\n"
13549 "\n"
13550 "out gl_PerVertex {\n"
13551 " vec4 gl_Position;\n"
13552 "};\n"
13553 "void main(){\n"
13554 " gl_Position = vec4(1);\n"
13555 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013556
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013557 char const *fsSource =
13558 "#version 450\n"
13559 "\n"
13560 "layout (constant_id = 0) const float r = 0.0f;\n"
13561 "layout(location = 0) out vec4 uFragColor;\n"
13562 "void main(){\n"
13563 " uFragColor = vec4(r,1,0,1);\n"
13564 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013565
13566 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13567 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13568
13569 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13570 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13571
13572 VkPipelineLayout pipeline_layout;
13573 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13574
13575 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13576 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13577 vp_state_create_info.viewportCount = 1;
13578 VkViewport viewport = {};
13579 vp_state_create_info.pViewports = &viewport;
13580 vp_state_create_info.scissorCount = 1;
13581 VkRect2D scissors = {};
13582 vp_state_create_info.pScissors = &scissors;
13583
13584 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13585
13586 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13587 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13588 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13589 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13590
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013591 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013592
13593 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13594 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13595
13596 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13597 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13598 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13599
13600 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13601 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13602 rasterization_state_create_info.pNext = nullptr;
13603 rasterization_state_create_info.lineWidth = 1.0f;
13604 rasterization_state_create_info.rasterizerDiscardEnable = true;
13605
13606 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13607 color_blend_attachment_state.blendEnable = VK_FALSE;
13608 color_blend_attachment_state.colorWriteMask = 0xf;
13609
13610 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13611 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13612 color_blend_state_create_info.attachmentCount = 1;
13613 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13614
13615 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13616 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13617 graphicspipe_create_info.stageCount = 2;
13618 graphicspipe_create_info.pStages = shader_stage_create_info;
13619 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13620 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13621 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13622 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13623 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13624 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13625 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13626 graphicspipe_create_info.layout = pipeline_layout;
13627 graphicspipe_create_info.renderPass = renderPass();
13628
13629 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13630 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13631
13632 VkPipelineCache pipelineCache;
13633 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13634
13635 // This structure maps constant ids to data locations.
13636 const VkSpecializationMapEntry entry =
13637 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013638 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013639
13640 uint32_t data = 1;
13641
13642 // Set up the info describing spec map and data
13643 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013644 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013645 };
13646 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13647
13648 VkPipeline pipeline;
13649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13650 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13651 m_errorMonitor->VerifyFound();
13652
13653 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13654 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13655}
13656
13657TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13658 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13659
Tony Barbour1fa09702017-03-16 12:09:08 -060013660 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013661 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13662
13663 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13664
13665 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13666 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13667 descriptor_pool_type_count[0].descriptorCount = 1;
13668 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13669 descriptor_pool_type_count[1].descriptorCount = 1;
13670
13671 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13672 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13673 descriptor_pool_create_info.maxSets = 1;
13674 descriptor_pool_create_info.poolSizeCount = 2;
13675 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13676 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13677
13678 VkDescriptorPool descriptorset_pool;
13679 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13680
13681 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13682 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13683 descriptorset_layout_binding.descriptorCount = 1;
13684 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013685 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013686
13687 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13688 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13689 descriptorset_layout_create_info.bindingCount = 1;
13690 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13691
13692 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013693 ASSERT_VK_SUCCESS(
13694 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013695
13696 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13697 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13698 descriptorset_allocate_info.descriptorSetCount = 1;
13699 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13700 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13701 VkDescriptorSet descriptorset;
13702 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13703
13704 // Challenge core_validation with a non uniform buffer type.
13705 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13706
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013707 char const *vsSource =
13708 "#version 450\n"
13709 "\n"
13710 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13711 " mat4 mvp;\n"
13712 "} ubuf;\n"
13713 "out gl_PerVertex {\n"
13714 " vec4 gl_Position;\n"
13715 "};\n"
13716 "void main(){\n"
13717 " gl_Position = ubuf.mvp * vec4(1);\n"
13718 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013719
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013720 char const *fsSource =
13721 "#version 450\n"
13722 "\n"
13723 "layout(location = 0) out vec4 uFragColor;\n"
13724 "void main(){\n"
13725 " uFragColor = vec4(0,1,0,1);\n"
13726 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013727
13728 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13729 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13730
13731 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13732 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13733 pipeline_layout_create_info.setLayoutCount = 1;
13734 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13735
13736 VkPipelineLayout pipeline_layout;
13737 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13738
13739 VkPipelineObj pipe(m_device);
13740 pipe.AddColorAttachment();
13741 pipe.AddShader(&vs);
13742 pipe.AddShader(&fs);
13743
13744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13745 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13746 m_errorMonitor->VerifyFound();
13747
13748 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13749 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13750 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13751}
13752
13753TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13754 TEST_DESCRIPTION(
13755 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13756
Tony Barbour1fa09702017-03-16 12:09:08 -060013757 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13759
13760 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13761
13762 VkDescriptorPoolSize descriptor_pool_type_count = {};
13763 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13764 descriptor_pool_type_count.descriptorCount = 1;
13765
13766 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13767 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13768 descriptor_pool_create_info.maxSets = 1;
13769 descriptor_pool_create_info.poolSizeCount = 1;
13770 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13771 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13772
13773 VkDescriptorPool descriptorset_pool;
13774 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13775
13776 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13777 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13778 descriptorset_layout_binding.descriptorCount = 1;
13779 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13780 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013781 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013782
13783 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13784 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13785 descriptorset_layout_create_info.bindingCount = 1;
13786 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13787
13788 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013789 ASSERT_VK_SUCCESS(
13790 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013791
13792 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13793 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13794 descriptorset_allocate_info.descriptorSetCount = 1;
13795 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13796 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13797 VkDescriptorSet descriptorset;
13798 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13799
13800 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13801
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013802 char const *vsSource =
13803 "#version 450\n"
13804 "\n"
13805 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13806 " mat4 mvp;\n"
13807 "} ubuf;\n"
13808 "out gl_PerVertex {\n"
13809 " vec4 gl_Position;\n"
13810 "};\n"
13811 "void main(){\n"
13812 " gl_Position = ubuf.mvp * vec4(1);\n"
13813 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013814
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013815 char const *fsSource =
13816 "#version 450\n"
13817 "\n"
13818 "layout(location = 0) out vec4 uFragColor;\n"
13819 "void main(){\n"
13820 " uFragColor = vec4(0,1,0,1);\n"
13821 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013822
13823 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13824 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13825
13826 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13827 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13828 pipeline_layout_create_info.setLayoutCount = 1;
13829 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13830
13831 VkPipelineLayout pipeline_layout;
13832 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13833
13834 VkPipelineObj pipe(m_device);
13835 pipe.AddColorAttachment();
13836 pipe.AddShader(&vs);
13837 pipe.AddShader(&fs);
13838
13839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13840 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13841 m_errorMonitor->VerifyFound();
13842
13843 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13844 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13845 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13846}
13847
13848TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013849 TEST_DESCRIPTION(
13850 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13851 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013852
Tony Barbour1fa09702017-03-16 12:09:08 -060013853 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13855
13856 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013857 "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 -060013858
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013859 char const *vsSource =
13860 "#version 450\n"
13861 "\n"
13862 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13863 "out gl_PerVertex {\n"
13864 " vec4 gl_Position;\n"
13865 "};\n"
13866 "void main(){\n"
13867 " gl_Position = vec4(consts.x);\n"
13868 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013869
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013870 char const *fsSource =
13871 "#version 450\n"
13872 "\n"
13873 "layout(location = 0) out vec4 uFragColor;\n"
13874 "void main(){\n"
13875 " uFragColor = vec4(0,1,0,1);\n"
13876 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013877
13878 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13879 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13880
13881 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13882 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13883
13884 // Set up a push constant range
13885 VkPushConstantRange push_constant_ranges = {};
13886 // Set to the wrong stage to challenge core_validation
13887 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13888 push_constant_ranges.size = 4;
13889
13890 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13891 pipeline_layout_create_info.pushConstantRangeCount = 1;
13892
13893 VkPipelineLayout pipeline_layout;
13894 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13895
13896 VkPipelineObj pipe(m_device);
13897 pipe.AddColorAttachment();
13898 pipe.AddShader(&vs);
13899 pipe.AddShader(&fs);
13900
13901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13902 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13903 m_errorMonitor->VerifyFound();
13904
13905 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13906}
13907
13908TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13909 TEST_DESCRIPTION(
13910 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13911
Tony Barbour1fa09702017-03-16 12:09:08 -060013912 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013913 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13914
13915 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013916 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013917
13918 // Some awkward steps are required to test with custom device features.
13919 std::vector<const char *> device_extension_names;
13920 auto features = m_device->phy().features();
13921 // Disable support for 64 bit floats
13922 features.shaderFloat64 = false;
13923 // The sacrificial device object
13924 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13925
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013926 char const *vsSource =
13927 "#version 450\n"
13928 "\n"
13929 "out gl_PerVertex {\n"
13930 " vec4 gl_Position;\n"
13931 "};\n"
13932 "void main(){\n"
13933 " gl_Position = vec4(1);\n"
13934 "}\n";
13935 char const *fsSource =
13936 "#version 450\n"
13937 "\n"
13938 "layout(location=0) out vec4 color;\n"
13939 "void main(){\n"
13940 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13941 " color = vec4(green);\n"
13942 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013943
13944 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13945 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13946
13947 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013948
13949 VkPipelineObj pipe(&test_device);
13950 pipe.AddColorAttachment();
13951 pipe.AddShader(&vs);
13952 pipe.AddShader(&fs);
13953
13954 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13955 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13956 VkPipelineLayout pipeline_layout;
13957 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13958
13959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13960 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13961 m_errorMonitor->VerifyFound();
13962
13963 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13964}
13965
Mark Lobodzinski20832822017-03-24 14:49:45 -060013966TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
13967 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
13968 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013969
Tony Barbour1fa09702017-03-16 12:09:08 -060013970 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13972
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013973 char const *vsSource =
13974 "#version 450\n"
13975 "\n"
13976 "out gl_PerVertex {\n"
13977 " vec4 gl_Position;\n"
13978 "};\n"
13979 "layout(xfb_buffer = 1) out;"
13980 "void main(){\n"
13981 " gl_Position = vec4(1);\n"
13982 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013983
Mark Lobodzinski20832822017-03-24 14:49:45 -060013984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013985
Mark Lobodzinski20832822017-03-24 14:49:45 -060013986 std::vector<unsigned int> spv;
13987 VkShaderModuleCreateInfo module_create_info;
13988 VkShaderModule shader_module;
13989 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13990 module_create_info.pNext = NULL;
13991 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
13992 module_create_info.pCode = spv.data();
13993 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
13994 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013995
Mark Lobodzinski20832822017-03-24 14:49:45 -060013996 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013997
Mark Lobodzinski20832822017-03-24 14:49:45 -060013998 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013999}
14000
Karl Schultz6addd812016-02-02 17:17:23 -070014001TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014002 TEST_DESCRIPTION(
14003 "Test that an error is produced for a fragment shader input "
14004 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014005
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014007
Tony Barbour1fa09702017-03-16 12:09:08 -060014008 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014010
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014011 char const *vsSource =
14012 "#version 450\n"
14013 "\n"
14014 "out gl_PerVertex {\n"
14015 " vec4 gl_Position;\n"
14016 "};\n"
14017 "void main(){\n"
14018 " gl_Position = vec4(1);\n"
14019 "}\n";
14020 char const *fsSource =
14021 "#version 450\n"
14022 "\n"
14023 "layout(location=0) in float x;\n"
14024 "layout(location=0) out vec4 color;\n"
14025 "void main(){\n"
14026 " color = vec4(x);\n"
14027 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014028
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014029 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14030 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014031
14032 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014033 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014034 pipe.AddShader(&vs);
14035 pipe.AddShader(&fs);
14036
Chris Forbes59cb88d2015-05-25 11:13:13 +120014037 VkDescriptorSetObj descriptorSet(m_device);
14038 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014039 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014040
Tony Barbour5781e8f2015-08-04 16:23:11 -060014041 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014042
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014043 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014044}
14045
Karl Schultz6addd812016-02-02 17:17:23 -070014046TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014047 TEST_DESCRIPTION(
14048 "Test that an error is produced for a fragment shader input "
14049 "within an interace block, which is not present in the outputs "
14050 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014052
Tony Barbour1fa09702017-03-16 12:09:08 -060014053 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014054 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14055
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014056 char const *vsSource =
14057 "#version 450\n"
14058 "\n"
14059 "out gl_PerVertex {\n"
14060 " vec4 gl_Position;\n"
14061 "};\n"
14062 "void main(){\n"
14063 " gl_Position = vec4(1);\n"
14064 "}\n";
14065 char const *fsSource =
14066 "#version 450\n"
14067 "\n"
14068 "in block { layout(location=0) float x; } ins;\n"
14069 "layout(location=0) out vec4 color;\n"
14070 "void main(){\n"
14071 " color = vec4(ins.x);\n"
14072 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014073
14074 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14075 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14076
14077 VkPipelineObj pipe(m_device);
14078 pipe.AddColorAttachment();
14079 pipe.AddShader(&vs);
14080 pipe.AddShader(&fs);
14081
14082 VkDescriptorSetObj descriptorSet(m_device);
14083 descriptorSet.AppendDummy();
14084 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14085
14086 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14087
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014088 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014089}
14090
Karl Schultz6addd812016-02-02 17:17:23 -070014091TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014092 TEST_DESCRIPTION(
14093 "Test that an error is produced for mismatched array sizes "
14094 "across the vertex->fragment shader interface");
14095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14096 "Type mismatch on location 0.0: 'ptr to "
14097 "output arr[2] of float32' vs 'ptr to "
14098 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014099
Tony Barbour1fa09702017-03-16 12:09:08 -060014100 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014101 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14102
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014103 char const *vsSource =
14104 "#version 450\n"
14105 "\n"
14106 "layout(location=0) out float x[2];\n"
14107 "out gl_PerVertex {\n"
14108 " vec4 gl_Position;\n"
14109 "};\n"
14110 "void main(){\n"
14111 " x[0] = 0; x[1] = 0;\n"
14112 " gl_Position = vec4(1);\n"
14113 "}\n";
14114 char const *fsSource =
14115 "#version 450\n"
14116 "\n"
14117 "layout(location=0) in float x[1];\n"
14118 "layout(location=0) out vec4 color;\n"
14119 "void main(){\n"
14120 " color = vec4(x[0]);\n"
14121 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014122
14123 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14124 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14125
14126 VkPipelineObj pipe(m_device);
14127 pipe.AddColorAttachment();
14128 pipe.AddShader(&vs);
14129 pipe.AddShader(&fs);
14130
14131 VkDescriptorSetObj descriptorSet(m_device);
14132 descriptorSet.AppendDummy();
14133 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14134
14135 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14136
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014137 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014138}
14139
Karl Schultz6addd812016-02-02 17:17:23 -070014140TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014141 TEST_DESCRIPTION(
14142 "Test that an error is produced for mismatched types across "
14143 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014145
Tony Barbour1fa09702017-03-16 12:09:08 -060014146 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014147 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014148
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014149 char const *vsSource =
14150 "#version 450\n"
14151 "\n"
14152 "layout(location=0) out int x;\n"
14153 "out gl_PerVertex {\n"
14154 " vec4 gl_Position;\n"
14155 "};\n"
14156 "void main(){\n"
14157 " x = 0;\n"
14158 " gl_Position = vec4(1);\n"
14159 "}\n";
14160 char const *fsSource =
14161 "#version 450\n"
14162 "\n"
14163 "layout(location=0) in float x;\n" /* VS writes int */
14164 "layout(location=0) out vec4 color;\n"
14165 "void main(){\n"
14166 " color = vec4(x);\n"
14167 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014168
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014169 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14170 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014171
14172 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014173 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014174 pipe.AddShader(&vs);
14175 pipe.AddShader(&fs);
14176
Chris Forbesb56af562015-05-25 11:13:17 +120014177 VkDescriptorSetObj descriptorSet(m_device);
14178 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014179 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014180
Tony Barbour5781e8f2015-08-04 16:23:11 -060014181 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014182
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014183 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014184}
14185
Karl Schultz6addd812016-02-02 17:17:23 -070014186TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014187 TEST_DESCRIPTION(
14188 "Test that an error is produced for mismatched types across "
14189 "the vertex->fragment shader interface, when the variable is contained within "
14190 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014192
Tony Barbour1fa09702017-03-16 12:09:08 -060014193 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14195
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014196 char const *vsSource =
14197 "#version 450\n"
14198 "\n"
14199 "out block { layout(location=0) int x; } outs;\n"
14200 "out gl_PerVertex {\n"
14201 " vec4 gl_Position;\n"
14202 "};\n"
14203 "void main(){\n"
14204 " outs.x = 0;\n"
14205 " gl_Position = vec4(1);\n"
14206 "}\n";
14207 char const *fsSource =
14208 "#version 450\n"
14209 "\n"
14210 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14211 "layout(location=0) out vec4 color;\n"
14212 "void main(){\n"
14213 " color = vec4(ins.x);\n"
14214 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014215
14216 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14217 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14218
14219 VkPipelineObj pipe(m_device);
14220 pipe.AddColorAttachment();
14221 pipe.AddShader(&vs);
14222 pipe.AddShader(&fs);
14223
14224 VkDescriptorSetObj descriptorSet(m_device);
14225 descriptorSet.AppendDummy();
14226 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14227
14228 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14229
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014230 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014231}
14232
14233TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014234 TEST_DESCRIPTION(
14235 "Test that an error is produced for location mismatches across "
14236 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14237 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014238 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 +130014239
Tony Barbour1fa09702017-03-16 12:09:08 -060014240 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014241 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14242
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014243 char const *vsSource =
14244 "#version 450\n"
14245 "\n"
14246 "out block { layout(location=1) float x; } outs;\n"
14247 "out gl_PerVertex {\n"
14248 " vec4 gl_Position;\n"
14249 "};\n"
14250 "void main(){\n"
14251 " outs.x = 0;\n"
14252 " gl_Position = vec4(1);\n"
14253 "}\n";
14254 char const *fsSource =
14255 "#version 450\n"
14256 "\n"
14257 "in block { layout(location=0) float x; } ins;\n"
14258 "layout(location=0) out vec4 color;\n"
14259 "void main(){\n"
14260 " color = vec4(ins.x);\n"
14261 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014262
14263 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14264 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14265
14266 VkPipelineObj pipe(m_device);
14267 pipe.AddColorAttachment();
14268 pipe.AddShader(&vs);
14269 pipe.AddShader(&fs);
14270
14271 VkDescriptorSetObj descriptorSet(m_device);
14272 descriptorSet.AppendDummy();
14273 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14274
14275 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14276
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014277 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014278}
14279
14280TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014281 TEST_DESCRIPTION(
14282 "Test that an error is produced for component mismatches across the "
14283 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14284 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014285 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 +130014286
Tony Barbour1fa09702017-03-16 12:09:08 -060014287 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014288 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14289
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014290 char const *vsSource =
14291 "#version 450\n"
14292 "\n"
14293 "out block { layout(location=0, component=0) float x; } outs;\n"
14294 "out gl_PerVertex {\n"
14295 " vec4 gl_Position;\n"
14296 "};\n"
14297 "void main(){\n"
14298 " outs.x = 0;\n"
14299 " gl_Position = vec4(1);\n"
14300 "}\n";
14301 char const *fsSource =
14302 "#version 450\n"
14303 "\n"
14304 "in block { layout(location=0, component=1) float x; } ins;\n"
14305 "layout(location=0) out vec4 color;\n"
14306 "void main(){\n"
14307 " color = vec4(ins.x);\n"
14308 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014309
14310 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14311 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14312
14313 VkPipelineObj pipe(m_device);
14314 pipe.AddColorAttachment();
14315 pipe.AddShader(&vs);
14316 pipe.AddShader(&fs);
14317
14318 VkDescriptorSetObj descriptorSet(m_device);
14319 descriptorSet.AppendDummy();
14320 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14321
14322 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14323
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014324 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014325}
14326
Chris Forbes1f3b0152016-11-30 12:48:40 +130014327TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14328 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14329
Tony Barbour1fa09702017-03-16 12:09:08 -060014330 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014331 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14332
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014333 char const *vsSource =
14334 "#version 450\n"
14335 "layout(location=0) out mediump float x;\n"
14336 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14337 char const *fsSource =
14338 "#version 450\n"
14339 "layout(location=0) in highp float x;\n"
14340 "layout(location=0) out vec4 color;\n"
14341 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014342
14343 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14344 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14345
14346 VkPipelineObj pipe(m_device);
14347 pipe.AddColorAttachment();
14348 pipe.AddShader(&vs);
14349 pipe.AddShader(&fs);
14350
14351 VkDescriptorSetObj descriptorSet(m_device);
14352 descriptorSet.AppendDummy();
14353 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14354
14355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14356
14357 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14358
14359 m_errorMonitor->VerifyFound();
14360}
14361
Chris Forbes870a39e2016-11-30 12:55:56 +130014362TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14363 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14364
Tony Barbour1fa09702017-03-16 12:09:08 -060014365 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14367
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014368 char const *vsSource =
14369 "#version 450\n"
14370 "out block { layout(location=0) mediump float x; };\n"
14371 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14372 char const *fsSource =
14373 "#version 450\n"
14374 "in block { layout(location=0) highp float x; };\n"
14375 "layout(location=0) out vec4 color;\n"
14376 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014377
14378 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14380
14381 VkPipelineObj pipe(m_device);
14382 pipe.AddColorAttachment();
14383 pipe.AddShader(&vs);
14384 pipe.AddShader(&fs);
14385
14386 VkDescriptorSetObj descriptorSet(m_device);
14387 descriptorSet.AppendDummy();
14388 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14389
14390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14391
14392 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14393
14394 m_errorMonitor->VerifyFound();
14395}
14396
Karl Schultz6addd812016-02-02 17:17:23 -070014397TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014398 TEST_DESCRIPTION(
14399 "Test that a warning is produced for a vertex attribute which is "
14400 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014402
Tony Barbour1fa09702017-03-16 12:09:08 -060014403 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014405
14406 VkVertexInputBindingDescription input_binding;
14407 memset(&input_binding, 0, sizeof(input_binding));
14408
14409 VkVertexInputAttributeDescription input_attrib;
14410 memset(&input_attrib, 0, sizeof(input_attrib));
14411 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14412
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014413 char const *vsSource =
14414 "#version 450\n"
14415 "\n"
14416 "out gl_PerVertex {\n"
14417 " vec4 gl_Position;\n"
14418 "};\n"
14419 "void main(){\n"
14420 " gl_Position = vec4(1);\n"
14421 "}\n";
14422 char const *fsSource =
14423 "#version 450\n"
14424 "\n"
14425 "layout(location=0) out vec4 color;\n"
14426 "void main(){\n"
14427 " color = vec4(1);\n"
14428 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014429
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014430 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14431 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014432
14433 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014434 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014435 pipe.AddShader(&vs);
14436 pipe.AddShader(&fs);
14437
14438 pipe.AddVertexInputBindings(&input_binding, 1);
14439 pipe.AddVertexInputAttribs(&input_attrib, 1);
14440
Chris Forbesde136e02015-05-25 11:13:28 +120014441 VkDescriptorSetObj descriptorSet(m_device);
14442 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014443 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014444
Tony Barbour5781e8f2015-08-04 16:23:11 -060014445 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014446
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014447 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014448}
14449
Karl Schultz6addd812016-02-02 17:17:23 -070014450TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014451 TEST_DESCRIPTION(
14452 "Test that a warning is produced for a location mismatch on "
14453 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014455
Tony Barbour1fa09702017-03-16 12:09:08 -060014456 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14458
14459 VkVertexInputBindingDescription input_binding;
14460 memset(&input_binding, 0, sizeof(input_binding));
14461
14462 VkVertexInputAttributeDescription input_attrib;
14463 memset(&input_attrib, 0, sizeof(input_attrib));
14464 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14465
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014466 char const *vsSource =
14467 "#version 450\n"
14468 "\n"
14469 "layout(location=1) in float x;\n"
14470 "out gl_PerVertex {\n"
14471 " vec4 gl_Position;\n"
14472 "};\n"
14473 "void main(){\n"
14474 " gl_Position = vec4(x);\n"
14475 "}\n";
14476 char const *fsSource =
14477 "#version 450\n"
14478 "\n"
14479 "layout(location=0) out vec4 color;\n"
14480 "void main(){\n"
14481 " color = vec4(1);\n"
14482 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014483
14484 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14485 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14486
14487 VkPipelineObj pipe(m_device);
14488 pipe.AddColorAttachment();
14489 pipe.AddShader(&vs);
14490 pipe.AddShader(&fs);
14491
14492 pipe.AddVertexInputBindings(&input_binding, 1);
14493 pipe.AddVertexInputAttribs(&input_attrib, 1);
14494
14495 VkDescriptorSetObj descriptorSet(m_device);
14496 descriptorSet.AppendDummy();
14497 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14498
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014499 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014502 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014503}
14504
Karl Schultz6addd812016-02-02 17:17:23 -070014505TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014506 TEST_DESCRIPTION(
14507 "Test that an error is produced for a vertex shader input which is not "
14508 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14510 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014511
Tony Barbour1fa09702017-03-16 12:09:08 -060014512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014514
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014515 char const *vsSource =
14516 "#version 450\n"
14517 "\n"
14518 "layout(location=0) in vec4 x;\n" /* not provided */
14519 "out gl_PerVertex {\n"
14520 " vec4 gl_Position;\n"
14521 "};\n"
14522 "void main(){\n"
14523 " gl_Position = x;\n"
14524 "}\n";
14525 char const *fsSource =
14526 "#version 450\n"
14527 "\n"
14528 "layout(location=0) out vec4 color;\n"
14529 "void main(){\n"
14530 " color = vec4(1);\n"
14531 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014532
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014535
14536 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014537 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014538 pipe.AddShader(&vs);
14539 pipe.AddShader(&fs);
14540
Chris Forbes62e8e502015-05-25 11:13:29 +120014541 VkDescriptorSetObj descriptorSet(m_device);
14542 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014543 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014544
Tony Barbour5781e8f2015-08-04 16:23:11 -060014545 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014546
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014547 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014548}
14549
Karl Schultz6addd812016-02-02 17:17:23 -070014550TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014551 TEST_DESCRIPTION(
14552 "Test that an error is produced for a mismatch between the "
14553 "fundamental type (float/int/uint) of an attribute and the "
14554 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014555 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 -060014556
Tony Barbour1fa09702017-03-16 12:09:08 -060014557 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014559
14560 VkVertexInputBindingDescription input_binding;
14561 memset(&input_binding, 0, sizeof(input_binding));
14562
14563 VkVertexInputAttributeDescription input_attrib;
14564 memset(&input_attrib, 0, sizeof(input_attrib));
14565 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14566
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014567 char const *vsSource =
14568 "#version 450\n"
14569 "\n"
14570 "layout(location=0) in int x;\n" /* attrib provided float */
14571 "out gl_PerVertex {\n"
14572 " vec4 gl_Position;\n"
14573 "};\n"
14574 "void main(){\n"
14575 " gl_Position = vec4(x);\n"
14576 "}\n";
14577 char const *fsSource =
14578 "#version 450\n"
14579 "\n"
14580 "layout(location=0) out vec4 color;\n"
14581 "void main(){\n"
14582 " color = vec4(1);\n"
14583 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014584
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014585 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14586 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014587
14588 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014589 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014590 pipe.AddShader(&vs);
14591 pipe.AddShader(&fs);
14592
14593 pipe.AddVertexInputBindings(&input_binding, 1);
14594 pipe.AddVertexInputAttribs(&input_attrib, 1);
14595
Chris Forbesc97d98e2015-05-25 11:13:31 +120014596 VkDescriptorSetObj descriptorSet(m_device);
14597 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014598 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014599
Tony Barbour5781e8f2015-08-04 16:23:11 -060014600 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014601
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014602 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014603}
14604
Chris Forbesc68b43c2016-04-06 11:18:47 +120014605TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014606 TEST_DESCRIPTION(
14607 "Test that an error is produced for a pipeline containing multiple "
14608 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14610 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014611
Tony Barbour1fa09702017-03-16 12:09:08 -060014612 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014613 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14614
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014615 char const *vsSource =
14616 "#version 450\n"
14617 "\n"
14618 "out gl_PerVertex {\n"
14619 " vec4 gl_Position;\n"
14620 "};\n"
14621 "void main(){\n"
14622 " gl_Position = vec4(1);\n"
14623 "}\n";
14624 char const *fsSource =
14625 "#version 450\n"
14626 "\n"
14627 "layout(location=0) out vec4 color;\n"
14628 "void main(){\n"
14629 " color = vec4(1);\n"
14630 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014631
14632 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14633 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14634
14635 VkPipelineObj pipe(m_device);
14636 pipe.AddColorAttachment();
14637 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014638 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014639 pipe.AddShader(&fs);
14640
14641 VkDescriptorSetObj descriptorSet(m_device);
14642 descriptorSet.AppendDummy();
14643 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14644
14645 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14646
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014647 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014648}
14649
Chris Forbes82ff92a2016-09-09 10:50:24 +120014650TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014652
Tony Barbour1fa09702017-03-16 12:09:08 -060014653 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014654 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14655
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014656 char const *vsSource =
14657 "#version 450\n"
14658 "out gl_PerVertex {\n"
14659 " vec4 gl_Position;\n"
14660 "};\n"
14661 "void main(){\n"
14662 " gl_Position = vec4(0);\n"
14663 "}\n";
14664 char const *fsSource =
14665 "#version 450\n"
14666 "\n"
14667 "layout(location=0) out vec4 color;\n"
14668 "void main(){\n"
14669 " color = vec4(1);\n"
14670 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014671
14672 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14673 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14674
14675 VkPipelineObj pipe(m_device);
14676 pipe.AddColorAttachment();
14677 pipe.AddShader(&vs);
14678 pipe.AddShader(&fs);
14679
14680 VkDescriptorSetObj descriptorSet(m_device);
14681 descriptorSet.AppendDummy();
14682 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14683
14684 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14685
14686 m_errorMonitor->VerifyFound();
14687}
14688
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014689TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14691 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14692 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014693
Tony Barbour1fa09702017-03-16 12:09:08 -060014694 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014695 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14696
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014697 char const *vsSource =
14698 "#version 450\n"
14699 "void main(){ gl_Position = vec4(0); }\n";
14700 char const *fsSource =
14701 "#version 450\n"
14702 "\n"
14703 "layout(location=0) out vec4 color;\n"
14704 "void main(){\n"
14705 " color = vec4(1);\n"
14706 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014707
14708 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14709 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14710
14711 VkPipelineObj pipe(m_device);
14712 pipe.AddColorAttachment();
14713 pipe.AddShader(&vs);
14714 pipe.AddShader(&fs);
14715
14716 VkDescriptorSetObj descriptorSet(m_device);
14717 descriptorSet.AppendDummy();
14718 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14719
14720 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014721 {
14722 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14723 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14724 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014725 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014726 {
14727 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14728 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14729 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014730 },
14731 };
14732 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014733 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014734 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014735 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14736 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014737 VkRenderPass rp;
14738 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14739 ASSERT_VK_SUCCESS(err);
14740
14741 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14742
14743 m_errorMonitor->VerifyFound();
14744
14745 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14746}
14747
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014748TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014749 TEST_DESCRIPTION(
14750 "Test that an error is produced for a variable output from "
14751 "the TCS without the patch decoration, but consumed in the TES "
14752 "with the decoration.");
14753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14754 "is per-vertex in tessellation control shader stage "
14755 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014756
Tony Barbour1fa09702017-03-16 12:09:08 -060014757 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14759
Chris Forbesc1e852d2016-04-04 19:26:42 +120014760 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014761 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014762 return;
14763 }
14764
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014765 char const *vsSource =
14766 "#version 450\n"
14767 "void main(){}\n";
14768 char const *tcsSource =
14769 "#version 450\n"
14770 "layout(location=0) out int x[];\n"
14771 "layout(vertices=3) out;\n"
14772 "void main(){\n"
14773 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14774 " gl_TessLevelInner[0] = 1;\n"
14775 " x[gl_InvocationID] = gl_InvocationID;\n"
14776 "}\n";
14777 char const *tesSource =
14778 "#version 450\n"
14779 "layout(triangles, equal_spacing, cw) in;\n"
14780 "layout(location=0) patch in int x;\n"
14781 "out gl_PerVertex { vec4 gl_Position; };\n"
14782 "void main(){\n"
14783 " gl_Position.xyz = gl_TessCoord;\n"
14784 " gl_Position.w = x;\n"
14785 "}\n";
14786 char const *fsSource =
14787 "#version 450\n"
14788 "layout(location=0) out vec4 color;\n"
14789 "void main(){\n"
14790 " color = vec4(1);\n"
14791 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014792
14793 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14794 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14795 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14796 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14797
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014798 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14799 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014800
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014801 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014802
14803 VkPipelineObj pipe(m_device);
14804 pipe.SetInputAssembly(&iasci);
14805 pipe.SetTessellation(&tsci);
14806 pipe.AddColorAttachment();
14807 pipe.AddShader(&vs);
14808 pipe.AddShader(&tcs);
14809 pipe.AddShader(&tes);
14810 pipe.AddShader(&fs);
14811
14812 VkDescriptorSetObj descriptorSet(m_device);
14813 descriptorSet.AppendDummy();
14814 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14815
14816 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14817
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014818 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014819}
14820
Karl Schultz6addd812016-02-02 17:17:23 -070014821TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014822 TEST_DESCRIPTION(
14823 "Test that an error is produced for a vertex attribute setup where multiple "
14824 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14826 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014827
Tony Barbour1fa09702017-03-16 12:09:08 -060014828 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014830
14831 /* Two binding descriptions for binding 0 */
14832 VkVertexInputBindingDescription input_bindings[2];
14833 memset(input_bindings, 0, sizeof(input_bindings));
14834
14835 VkVertexInputAttributeDescription input_attrib;
14836 memset(&input_attrib, 0, sizeof(input_attrib));
14837 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14838
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014839 char const *vsSource =
14840 "#version 450\n"
14841 "\n"
14842 "layout(location=0) in float x;\n" /* attrib provided float */
14843 "out gl_PerVertex {\n"
14844 " vec4 gl_Position;\n"
14845 "};\n"
14846 "void main(){\n"
14847 " gl_Position = vec4(x);\n"
14848 "}\n";
14849 char const *fsSource =
14850 "#version 450\n"
14851 "\n"
14852 "layout(location=0) out vec4 color;\n"
14853 "void main(){\n"
14854 " color = vec4(1);\n"
14855 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014856
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014857 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14858 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014859
14860 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014861 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014862 pipe.AddShader(&vs);
14863 pipe.AddShader(&fs);
14864
14865 pipe.AddVertexInputBindings(input_bindings, 2);
14866 pipe.AddVertexInputAttribs(&input_attrib, 1);
14867
Chris Forbes280ba2c2015-06-12 11:16:41 +120014868 VkDescriptorSetObj descriptorSet(m_device);
14869 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014870 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014871
Tony Barbour5781e8f2015-08-04 16:23:11 -060014872 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014873
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014874 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014875}
Chris Forbes8f68b562015-05-25 11:13:32 +120014876
Karl Schultz6addd812016-02-02 17:17:23 -070014877TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014878 TEST_DESCRIPTION(
14879 "Test that an error is produced for a fragment shader which does not "
14880 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014882
Tony Barbour1fa09702017-03-16 12:09:08 -060014883 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014884
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014885 char const *vsSource =
14886 "#version 450\n"
14887 "\n"
14888 "out gl_PerVertex {\n"
14889 " vec4 gl_Position;\n"
14890 "};\n"
14891 "void main(){\n"
14892 " gl_Position = vec4(1);\n"
14893 "}\n";
14894 char const *fsSource =
14895 "#version 450\n"
14896 "\n"
14897 "void main(){\n"
14898 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014899
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014900 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14901 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014902
14903 VkPipelineObj pipe(m_device);
14904 pipe.AddShader(&vs);
14905 pipe.AddShader(&fs);
14906
Chia-I Wu08accc62015-07-07 11:50:03 +080014907 /* set up CB 0, not written */
14908 pipe.AddColorAttachment();
14909 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014910
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014911 VkDescriptorSetObj descriptorSet(m_device);
14912 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014913 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014914
Tony Barbour5781e8f2015-08-04 16:23:11 -060014915 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014916
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014917 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014918}
14919
Karl Schultz6addd812016-02-02 17:17:23 -070014920TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014921 TEST_DESCRIPTION(
14922 "Test that a warning is produced for a fragment shader which provides a spurious "
14923 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014925 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014926
Tony Barbour1fa09702017-03-16 12:09:08 -060014927 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014928
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014929 char const *vsSource =
14930 "#version 450\n"
14931 "\n"
14932 "out gl_PerVertex {\n"
14933 " vec4 gl_Position;\n"
14934 "};\n"
14935 "void main(){\n"
14936 " gl_Position = vec4(1);\n"
14937 "}\n";
14938 char const *fsSource =
14939 "#version 450\n"
14940 "\n"
14941 "layout(location=0) out vec4 x;\n"
14942 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14943 "void main(){\n"
14944 " x = vec4(1);\n"
14945 " y = vec4(1);\n"
14946 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014947
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014948 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14949 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014950
14951 VkPipelineObj pipe(m_device);
14952 pipe.AddShader(&vs);
14953 pipe.AddShader(&fs);
14954
Chia-I Wu08accc62015-07-07 11:50:03 +080014955 /* set up CB 0, not written */
14956 pipe.AddColorAttachment();
14957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014958 /* FS writes CB 1, but we don't configure it */
14959
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014960 VkDescriptorSetObj descriptorSet(m_device);
14961 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014962 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014963
Tony Barbour5781e8f2015-08-04 16:23:11 -060014964 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014965
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014966 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014967}
14968
Karl Schultz6addd812016-02-02 17:17:23 -070014969TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014970 TEST_DESCRIPTION(
14971 "Test that an error is produced for a mismatch between the fundamental "
14972 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014974
Tony Barbour1fa09702017-03-16 12:09:08 -060014975 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014976
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014977 char const *vsSource =
14978 "#version 450\n"
14979 "\n"
14980 "out gl_PerVertex {\n"
14981 " vec4 gl_Position;\n"
14982 "};\n"
14983 "void main(){\n"
14984 " gl_Position = vec4(1);\n"
14985 "}\n";
14986 char const *fsSource =
14987 "#version 450\n"
14988 "\n"
14989 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14990 "void main(){\n"
14991 " x = ivec4(1);\n"
14992 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014993
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014994 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14995 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014996
14997 VkPipelineObj pipe(m_device);
14998 pipe.AddShader(&vs);
14999 pipe.AddShader(&fs);
15000
Chia-I Wu08accc62015-07-07 11:50:03 +080015001 /* set up CB 0; type is UNORM by default */
15002 pipe.AddColorAttachment();
15003 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015004
Chris Forbesa36d69e2015-05-25 11:13:44 +120015005 VkDescriptorSetObj descriptorSet(m_device);
15006 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015007 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015008
Tony Barbour5781e8f2015-08-04 16:23:11 -060015009 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015010
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015011 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015012}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015013
Karl Schultz6addd812016-02-02 17:17:23 -070015014TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015015 TEST_DESCRIPTION(
15016 "Test that an error is produced for a shader consuming a uniform "
15017 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015019
Tony Barbour1fa09702017-03-16 12:09:08 -060015020 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015021
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015022 char const *vsSource =
15023 "#version 450\n"
15024 "\n"
15025 "out gl_PerVertex {\n"
15026 " vec4 gl_Position;\n"
15027 "};\n"
15028 "void main(){\n"
15029 " gl_Position = vec4(1);\n"
15030 "}\n";
15031 char const *fsSource =
15032 "#version 450\n"
15033 "\n"
15034 "layout(location=0) out vec4 x;\n"
15035 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15036 "void main(){\n"
15037 " x = vec4(bar.y);\n"
15038 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015039
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015042
Chris Forbes556c76c2015-08-14 12:04:59 +120015043 VkPipelineObj pipe(m_device);
15044 pipe.AddShader(&vs);
15045 pipe.AddShader(&fs);
15046
15047 /* set up CB 0; type is UNORM by default */
15048 pipe.AddColorAttachment();
15049 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15050
15051 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015052 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015053
15054 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15055
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015056 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015057}
15058
Chris Forbes5c59e902016-02-26 16:56:09 +130015059TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015060 TEST_DESCRIPTION(
15061 "Test that an error is produced for a shader consuming push constants "
15062 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015064
Tony Barbour1fa09702017-03-16 12:09:08 -060015065 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015066
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015067 char const *vsSource =
15068 "#version 450\n"
15069 "\n"
15070 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15071 "out gl_PerVertex {\n"
15072 " vec4 gl_Position;\n"
15073 "};\n"
15074 "void main(){\n"
15075 " gl_Position = vec4(consts.x);\n"
15076 "}\n";
15077 char const *fsSource =
15078 "#version 450\n"
15079 "\n"
15080 "layout(location=0) out vec4 x;\n"
15081 "void main(){\n"
15082 " x = vec4(1);\n"
15083 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015084
15085 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15086 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15087
15088 VkPipelineObj pipe(m_device);
15089 pipe.AddShader(&vs);
15090 pipe.AddShader(&fs);
15091
15092 /* set up CB 0; type is UNORM by default */
15093 pipe.AddColorAttachment();
15094 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15095
15096 VkDescriptorSetObj descriptorSet(m_device);
15097 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15098
15099 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15100
15101 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015102 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015103}
15104
Chris Forbes3fb17902016-08-22 14:57:55 +120015105TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015106 TEST_DESCRIPTION(
15107 "Test that an error is produced for a shader consuming an input attachment "
15108 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15110 "consumes input attachment index 0 but not provided in subpass");
15111
Tony Barbour1fa09702017-03-16 12:09:08 -060015112 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015113
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015114 char const *vsSource =
15115 "#version 450\n"
15116 "\n"
15117 "out gl_PerVertex {\n"
15118 " vec4 gl_Position;\n"
15119 "};\n"
15120 "void main(){\n"
15121 " gl_Position = vec4(1);\n"
15122 "}\n";
15123 char const *fsSource =
15124 "#version 450\n"
15125 "\n"
15126 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15127 "layout(location=0) out vec4 color;\n"
15128 "void main() {\n"
15129 " color = subpassLoad(x);\n"
15130 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015131
15132 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15133 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15134
15135 VkPipelineObj pipe(m_device);
15136 pipe.AddShader(&vs);
15137 pipe.AddShader(&fs);
15138 pipe.AddColorAttachment();
15139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15140
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015141 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15142 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015143 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015144 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015145 ASSERT_VK_SUCCESS(err);
15146
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015147 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015148 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015149 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015150 ASSERT_VK_SUCCESS(err);
15151
15152 // error here.
15153 pipe.CreateVKPipeline(pl, renderPass());
15154
15155 m_errorMonitor->VerifyFound();
15156
15157 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15158 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15159}
15160
Chris Forbes5a9a0472016-08-22 16:02:09 +120015161TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015162 TEST_DESCRIPTION(
15163 "Test that an error is produced for a shader consuming an input attachment "
15164 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15166 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15167
Tony Barbour1fa09702017-03-16 12:09:08 -060015168 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015169
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015170 char const *vsSource =
15171 "#version 450\n"
15172 "\n"
15173 "out gl_PerVertex {\n"
15174 " vec4 gl_Position;\n"
15175 "};\n"
15176 "void main(){\n"
15177 " gl_Position = vec4(1);\n"
15178 "}\n";
15179 char const *fsSource =
15180 "#version 450\n"
15181 "\n"
15182 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15183 "layout(location=0) out vec4 color;\n"
15184 "void main() {\n"
15185 " color = subpassLoad(x);\n"
15186 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015187
15188 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15189 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15190
15191 VkPipelineObj pipe(m_device);
15192 pipe.AddShader(&vs);
15193 pipe.AddShader(&fs);
15194 pipe.AddColorAttachment();
15195 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15196
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015197 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15198 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015199 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015200 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015201 ASSERT_VK_SUCCESS(err);
15202
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015203 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015204 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015205 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015206 ASSERT_VK_SUCCESS(err);
15207
15208 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015209 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15210 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15211 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15212 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15213 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 +120015214 };
15215 VkAttachmentReference color = {
15216 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15217 };
15218 VkAttachmentReference input = {
15219 1, VK_IMAGE_LAYOUT_GENERAL,
15220 };
15221
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015222 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015223
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015224 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015225 VkRenderPass rp;
15226 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15227 ASSERT_VK_SUCCESS(err);
15228
15229 // error here.
15230 pipe.CreateVKPipeline(pl, rp);
15231
15232 m_errorMonitor->VerifyFound();
15233
15234 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15235 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15236 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15237}
15238
Chris Forbes541f7b02016-08-22 15:30:27 +120015239TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015240 TEST_DESCRIPTION(
15241 "Test that an error is produced for a shader consuming an input attachment "
15242 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015244 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015245
Tony Barbour1fa09702017-03-16 12:09:08 -060015246 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015247
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015248 char const *vsSource =
15249 "#version 450\n"
15250 "\n"
15251 "out gl_PerVertex {\n"
15252 " vec4 gl_Position;\n"
15253 "};\n"
15254 "void main(){\n"
15255 " gl_Position = vec4(1);\n"
15256 "}\n";
15257 char const *fsSource =
15258 "#version 450\n"
15259 "\n"
15260 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15261 "layout(location=0) out vec4 color;\n"
15262 "void main() {\n"
15263 " color = subpassLoad(xs[0]);\n"
15264 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015265
15266 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15267 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15268
15269 VkPipelineObj pipe(m_device);
15270 pipe.AddShader(&vs);
15271 pipe.AddShader(&fs);
15272 pipe.AddColorAttachment();
15273 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15274
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015275 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15276 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015277 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015278 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015279 ASSERT_VK_SUCCESS(err);
15280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015281 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015282 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015283 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015284 ASSERT_VK_SUCCESS(err);
15285
15286 // error here.
15287 pipe.CreateVKPipeline(pl, renderPass());
15288
15289 m_errorMonitor->VerifyFound();
15290
15291 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15292 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15293}
15294
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015295TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015296 TEST_DESCRIPTION(
15297 "Test that an error is produced for a compute pipeline consuming a "
15298 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015300
Tony Barbour1fa09702017-03-16 12:09:08 -060015301 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015302
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015303 char const *csSource =
15304 "#version 450\n"
15305 "\n"
15306 "layout(local_size_x=1) in;\n"
15307 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15308 "void main(){\n"
15309 " x = vec4(1);\n"
15310 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015311
15312 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15313
15314 VkDescriptorSetObj descriptorSet(m_device);
15315 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15316
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015317 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15318 nullptr,
15319 0,
15320 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15321 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15322 descriptorSet.GetPipelineLayout(),
15323 VK_NULL_HANDLE,
15324 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015325
15326 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015327 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015328
15329 m_errorMonitor->VerifyFound();
15330
15331 if (err == VK_SUCCESS) {
15332 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15333 }
15334}
15335
Chris Forbes22a9b092016-07-19 14:34:05 +120015336TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015337 TEST_DESCRIPTION(
15338 "Test that an error is produced for a pipeline consuming a "
15339 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15341 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015342
Tony Barbour1fa09702017-03-16 12:09:08 -060015343 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015345 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15346 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015347 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015348 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015349 ASSERT_VK_SUCCESS(err);
15350
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015351 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015352 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015353 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015354 ASSERT_VK_SUCCESS(err);
15355
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015356 char const *csSource =
15357 "#version 450\n"
15358 "\n"
15359 "layout(local_size_x=1) in;\n"
15360 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15361 "void main() {\n"
15362 " x.x = 1.0f;\n"
15363 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015364 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15365
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015366 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15367 nullptr,
15368 0,
15369 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15370 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15371 pl,
15372 VK_NULL_HANDLE,
15373 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015374
15375 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015376 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015377
15378 m_errorMonitor->VerifyFound();
15379
15380 if (err == VK_SUCCESS) {
15381 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15382 }
15383
15384 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15385 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15386}
15387
Chris Forbes50020592016-07-27 13:52:41 +120015388TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015389 TEST_DESCRIPTION(
15390 "Test that an error is produced when an image view type "
15391 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015392
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015393 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 +120015394
Tony Barbour1fa09702017-03-16 12:09:08 -060015395 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015396 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15397
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015398 char const *vsSource =
15399 "#version 450\n"
15400 "\n"
15401 "out gl_PerVertex { vec4 gl_Position; };\n"
15402 "void main() { gl_Position = vec4(0); }\n";
15403 char const *fsSource =
15404 "#version 450\n"
15405 "\n"
15406 "layout(set=0, binding=0) uniform sampler3D s;\n"
15407 "layout(location=0) out vec4 color;\n"
15408 "void main() {\n"
15409 " color = texture(s, vec3(0));\n"
15410 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015411 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15413
15414 VkPipelineObj pipe(m_device);
15415 pipe.AddShader(&vs);
15416 pipe.AddShader(&fs);
15417 pipe.AddColorAttachment();
15418
15419 VkTextureObj texture(m_device, nullptr);
15420 VkSamplerObj sampler(m_device);
15421
15422 VkDescriptorSetObj descriptorSet(m_device);
15423 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15424 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15425
15426 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15427 ASSERT_VK_SUCCESS(err);
15428
Tony Barbour552f6c02016-12-21 14:34:07 -070015429 m_commandBuffer->BeginCommandBuffer();
15430 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015431
15432 m_commandBuffer->BindPipeline(pipe);
15433 m_commandBuffer->BindDescriptorSet(descriptorSet);
15434
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015435 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015436 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015437 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015438 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15439
15440 // error produced here.
15441 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15442
15443 m_errorMonitor->VerifyFound();
15444
Tony Barbour552f6c02016-12-21 14:34:07 -070015445 m_commandBuffer->EndRenderPass();
15446 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015447}
15448
Chris Forbes5533bfc2016-07-27 14:12:34 +120015449TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015450 TEST_DESCRIPTION(
15451 "Test that an error is produced when a multisampled images "
15452 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015453
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015455
Tony Barbour1fa09702017-03-16 12:09:08 -060015456 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15458
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015459 char const *vsSource =
15460 "#version 450\n"
15461 "\n"
15462 "out gl_PerVertex { vec4 gl_Position; };\n"
15463 "void main() { gl_Position = vec4(0); }\n";
15464 char const *fsSource =
15465 "#version 450\n"
15466 "\n"
15467 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15468 "layout(location=0) out vec4 color;\n"
15469 "void main() {\n"
15470 " color = texelFetch(s, ivec2(0), 0);\n"
15471 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015472 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15473 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15474
15475 VkPipelineObj pipe(m_device);
15476 pipe.AddShader(&vs);
15477 pipe.AddShader(&fs);
15478 pipe.AddColorAttachment();
15479
15480 VkTextureObj texture(m_device, nullptr);
15481 VkSamplerObj sampler(m_device);
15482
15483 VkDescriptorSetObj descriptorSet(m_device);
15484 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15485 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15486
15487 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15488 ASSERT_VK_SUCCESS(err);
15489
Tony Barbour552f6c02016-12-21 14:34:07 -070015490 m_commandBuffer->BeginCommandBuffer();
15491 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015492
15493 m_commandBuffer->BindPipeline(pipe);
15494 m_commandBuffer->BindDescriptorSet(descriptorSet);
15495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015496 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015497 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015498 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015499 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15500
15501 // error produced here.
15502 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15503
15504 m_errorMonitor->VerifyFound();
15505
Tony Barbour552f6c02016-12-21 14:34:07 -070015506 m_commandBuffer->EndRenderPass();
15507 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015508}
15509
Mark Youngc48c4c12016-04-11 14:26:49 -060015510TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015511 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015512
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015513 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15514 {
15515 VkFormatProperties properties;
15516 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15517 if (properties.optimalTilingFeatures == 0) {
15518 printf(" Image format not supported; skipped.\n");
15519 return;
15520 }
15521 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015522
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015523 VkImageCreateInfo info = {};
15524 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15525 info.pNext = NULL;
15526 info.imageType = VK_IMAGE_TYPE_2D;
15527 info.format = format;
15528 info.extent.height = 32;
15529 info.extent.depth = 1;
15530 info.mipLevels = 1;
15531 info.arrayLayers = 1;
15532 info.samples = VK_SAMPLE_COUNT_1_BIT;
15533 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15534 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15535 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015536
15537 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015538 {
15539 VkImageFormatProperties properties;
15540 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15541 info.tiling, info.usage, info.flags, &properties);
15542 ASSERT_VK_SUCCESS(result);
15543 info.extent.width = properties.maxExtent.width + 1;
15544 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015545
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015546 VkImage image;
15547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15548 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015549 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015550}
15551
Mark Youngc48c4c12016-04-11 14:26:49 -060015552TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015553 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015554
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015555 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15556 {
15557 VkFormatProperties properties;
15558 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15559 if (properties.optimalTilingFeatures == 0) {
15560 printf(" Image format not supported; skipped.\n");
15561 return;
15562 }
15563 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015564
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015565 VkImageCreateInfo info = {};
15566 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15567 info.pNext = NULL;
15568 info.imageType = VK_IMAGE_TYPE_2D;
15569 info.format = format;
15570 info.extent.height = 32;
15571 info.extent.depth = 1;
15572 info.mipLevels = 1;
15573 info.arrayLayers = 1;
15574 info.samples = VK_SAMPLE_COUNT_1_BIT;
15575 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15576 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15577 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015578
15579 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015580 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015581
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015582 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015584 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15585 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015586 m_errorMonitor->VerifyFound();
15587}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015588
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015589TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015590 TEST_DESCRIPTION(
15591 "Create a render pass with an attachment description "
15592 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015593
Tony Barbour1fa09702017-03-16 12:09:08 -060015594 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15596
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015598
15599 VkAttachmentReference color_attach = {};
15600 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15601 color_attach.attachment = 0;
15602 VkSubpassDescription subpass = {};
15603 subpass.colorAttachmentCount = 1;
15604 subpass.pColorAttachments = &color_attach;
15605
15606 VkRenderPassCreateInfo rpci = {};
15607 rpci.subpassCount = 1;
15608 rpci.pSubpasses = &subpass;
15609 rpci.attachmentCount = 1;
15610 VkAttachmentDescription attach_desc = {};
15611 attach_desc.format = VK_FORMAT_UNDEFINED;
15612 rpci.pAttachments = &attach_desc;
15613 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15614 VkRenderPass rp;
15615 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15616
15617 m_errorMonitor->VerifyFound();
15618
15619 if (result == VK_SUCCESS) {
15620 vkDestroyRenderPass(m_device->device(), rp, NULL);
15621 }
15622}
15623
Karl Schultz6addd812016-02-02 17:17:23 -070015624TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015625 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015626
Mike Stroyana3082432015-09-25 13:39:21 -060015627 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015628 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15629 const int32_t tex_width = 32;
15630 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015631
15632 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015633 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15634 image_create_info.pNext = NULL;
15635 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15636 image_create_info.format = tex_format;
15637 image_create_info.extent.width = tex_width;
15638 image_create_info.extent.height = tex_height;
15639 image_create_info.extent.depth = 1;
15640 image_create_info.mipLevels = 1;
15641 image_create_info.arrayLayers = 1;
15642 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15643 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15644 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15645 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015646
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015647 VkImage image;
15648 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015649 ASSERT_VK_SUCCESS(err);
15650
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015651 VkMemoryRequirements requirements;
15652 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15653
15654 VkMemoryAllocateInfo alloc_info{};
15655 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15656 alloc_info.pNext = NULL;
15657 alloc_info.memoryTypeIndex = 0;
15658 alloc_info.allocationSize = requirements.size;
15659 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15660 ASSERT_TRUE(pass);
15661
15662 VkDeviceMemory memory;
15663 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15664 ASSERT_VK_SUCCESS(err);
15665
15666 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15667
Tobin Ehliscde08892015-09-22 10:11:37 -060015668 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015669 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015670 image_view_create_info.image = image;
15671 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15672 image_view_create_info.format = tex_format;
15673 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015674 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015675 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015676 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015677
15678 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015679 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015680 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015681 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015682
15683 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015684 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015685}
Mike Stroyana3082432015-09-25 13:39:21 -060015686
Mark Youngd339ba32016-05-30 13:28:35 -060015687TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15688 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015690 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015691
Tony Barbour1fa09702017-03-16 12:09:08 -060015692 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015693
15694 // Create an image and try to create a view with no memory backing the image
15695 VkImage image;
15696
15697 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15698 const int32_t tex_width = 32;
15699 const int32_t tex_height = 32;
15700
15701 VkImageCreateInfo image_create_info = {};
15702 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15703 image_create_info.pNext = NULL;
15704 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15705 image_create_info.format = tex_format;
15706 image_create_info.extent.width = tex_width;
15707 image_create_info.extent.height = tex_height;
15708 image_create_info.extent.depth = 1;
15709 image_create_info.mipLevels = 1;
15710 image_create_info.arrayLayers = 1;
15711 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15712 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15713 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15714 image_create_info.flags = 0;
15715
15716 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15717 ASSERT_VK_SUCCESS(err);
15718
15719 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015720 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015721 image_view_create_info.image = image;
15722 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15723 image_view_create_info.format = tex_format;
15724 image_view_create_info.subresourceRange.layerCount = 1;
15725 image_view_create_info.subresourceRange.baseMipLevel = 0;
15726 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015727 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015728
15729 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015730 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015731
15732 m_errorMonitor->VerifyFound();
15733 vkDestroyImage(m_device->device(), image, NULL);
15734 // If last error is success, it still created the view, so delete it.
15735 if (err == VK_SUCCESS) {
15736 vkDestroyImageView(m_device->device(), view, NULL);
15737 }
Mark Youngd339ba32016-05-30 13:28:35 -060015738}
15739
Karl Schultz6addd812016-02-02 17:17:23 -070015740TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015741 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015743
Tony Barbour1fa09702017-03-16 12:09:08 -060015744 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015745
Karl Schultz6addd812016-02-02 17:17:23 -070015746 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015747 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015748 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015749 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015750
15751 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015752 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015753 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015754 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15755 image_view_create_info.format = tex_format;
15756 image_view_create_info.subresourceRange.baseMipLevel = 0;
15757 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015758 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015759 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015760 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015761
15762 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015763 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015764
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015765 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015766}
15767
Mike Weiblena1e13f42017-02-09 21:25:59 -070015768TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15769 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15770
Tony Barbour1fa09702017-03-16 12:09:08 -060015771 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015772 VkSubresourceLayout subres_layout = {};
15773
15774 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15775 {
15776 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15777 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015778 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015779 ASSERT_TRUE(img.initialized());
15780
15781 VkImageSubresource subres = {};
15782 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15783 subres.mipLevel = 0;
15784 subres.arrayLayer = 0;
15785
15786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15787 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15788 m_errorMonitor->VerifyFound();
15789 }
15790
15791 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15792 {
15793 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015794 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015795 ASSERT_TRUE(img.initialized());
15796
15797 VkImageSubresource subres = {};
15798 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15799 subres.mipLevel = 0;
15800 subres.arrayLayer = 0;
15801
15802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15804 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15805 m_errorMonitor->VerifyFound();
15806 }
15807
15808 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15809 {
15810 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015811 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015812 ASSERT_TRUE(img.initialized());
15813
15814 VkImageSubresource subres = {};
15815 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15816 subres.mipLevel = 1; // ERROR: triggers VU 00739
15817 subres.arrayLayer = 0;
15818
15819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15820 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15821 m_errorMonitor->VerifyFound();
15822 }
15823
15824 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15825 {
15826 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015827 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015828 ASSERT_TRUE(img.initialized());
15829
15830 VkImageSubresource subres = {};
15831 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15832 subres.mipLevel = 0;
15833 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15834
15835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15836 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15837 m_errorMonitor->VerifyFound();
15838 }
15839}
15840
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015841TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015842 VkResult err;
15843 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015844
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015846
Tony Barbour1fa09702017-03-16 12:09:08 -060015847 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015848
15849 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015850 VkImage srcImage;
15851 VkImage dstImage;
15852 VkDeviceMemory srcMem;
15853 VkDeviceMemory destMem;
15854 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015855
15856 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015857 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15858 image_create_info.pNext = NULL;
15859 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15860 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15861 image_create_info.extent.width = 32;
15862 image_create_info.extent.height = 32;
15863 image_create_info.extent.depth = 1;
15864 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015865 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015866 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15867 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15868 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15869 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015870
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015871 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015872 ASSERT_VK_SUCCESS(err);
15873
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015874 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015875 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015876 ASSERT_VK_SUCCESS(err);
15877
15878 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015879 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015880 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15881 memAlloc.pNext = NULL;
15882 memAlloc.allocationSize = 0;
15883 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015884
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015885 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015886 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015887 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015888 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015889 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015890 ASSERT_VK_SUCCESS(err);
15891
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015892 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015893 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015894 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015895 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015896 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015897 ASSERT_VK_SUCCESS(err);
15898
15899 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15900 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015901 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015902 ASSERT_VK_SUCCESS(err);
15903
Tony Barbour552f6c02016-12-21 14:34:07 -070015904 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015905 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015906 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015907 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015908 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015909 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015910 copyRegion.srcOffset.x = 0;
15911 copyRegion.srcOffset.y = 0;
15912 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015913 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015914 copyRegion.dstSubresource.mipLevel = 0;
15915 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015916 // Introduce failure by forcing the dst layerCount to differ from src
15917 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015918 copyRegion.dstOffset.x = 0;
15919 copyRegion.dstOffset.y = 0;
15920 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015921 copyRegion.extent.width = 1;
15922 copyRegion.extent.height = 1;
15923 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015924 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015925 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015926
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015927 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015928
Chia-I Wuf7458c52015-10-26 21:10:41 +080015929 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015930 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015931 vkFreeMemory(m_device->device(), srcMem, NULL);
15932 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015933}
15934
Tony Barbourd6673642016-05-05 14:46:39 -060015935TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015936 TEST_DESCRIPTION("Creating images with unsuported formats ");
15937
Tony Barbour1fa09702017-03-16 12:09:08 -060015938 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015940
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015941 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015942 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015943 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015944 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15945 image_create_info.format = VK_FORMAT_UNDEFINED;
15946 image_create_info.extent.width = 32;
15947 image_create_info.extent.height = 32;
15948 image_create_info.extent.depth = 1;
15949 image_create_info.mipLevels = 1;
15950 image_create_info.arrayLayers = 1;
15951 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15952 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15953 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015954
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15956 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015957
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015958 VkImage image;
15959 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015960 m_errorMonitor->VerifyFound();
15961
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015962 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015963 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015964 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15965 VkFormat format = static_cast<VkFormat>(f);
15966 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015967 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015968 unsupported = format;
15969 break;
15970 }
15971 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015972
Tony Barbourd6673642016-05-05 14:46:39 -060015973 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015974 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015976
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015977 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015978 m_errorMonitor->VerifyFound();
15979 }
15980}
15981
15982TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015983 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15984
Tony Barbour1fa09702017-03-16 12:09:08 -060015985 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060015986 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070015987 if (!depth_format) {
15988 return;
15989 }
Tony Barbourd6673642016-05-05 14:46:39 -060015990
15991 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015992 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060015993 VK_IMAGE_TILING_OPTIMAL, 0);
15994 ASSERT_TRUE(image.initialized());
15995
15996 VkImageView imgView;
15997 VkImageViewCreateInfo imgViewInfo = {};
15998 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15999 imgViewInfo.image = image.handle();
16000 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16001 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16002 imgViewInfo.subresourceRange.layerCount = 1;
16003 imgViewInfo.subresourceRange.baseMipLevel = 0;
16004 imgViewInfo.subresourceRange.levelCount = 1;
16005 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16006
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016007 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016008 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016010 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16011 m_errorMonitor->VerifyFound();
16012 imgViewInfo.subresourceRange.baseMipLevel = 0;
16013
Tony Barbourd6673642016-05-05 14:46:39 -060016014 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16015 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016017 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16018 m_errorMonitor->VerifyFound();
16019 imgViewInfo.subresourceRange.levelCount = 1;
16020
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016021 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16022 imgViewInfo.subresourceRange.levelCount = 2;
16023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16024 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16025 m_errorMonitor->VerifyFound();
16026 imgViewInfo.subresourceRange.levelCount = 1;
16027
16028 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16029 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16031 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16032 m_errorMonitor->VerifyFound();
16033 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16034
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016035 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16036 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016037 m_errorMonitor->SetDesiredFailureMsg(
16038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16039 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016040 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16041 m_errorMonitor->VerifyFound();
16042 imgViewInfo.subresourceRange.layerCount = 1;
16043
Tony Barbourd6673642016-05-05 14:46:39 -060016044 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016045 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016046 m_errorMonitor->SetDesiredFailureMsg(
16047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16048 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016049 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16050 m_errorMonitor->VerifyFound();
16051 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16052
Tony Barbourd6673642016-05-05 14:46:39 -060016053 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16054 // VIEW_CREATE_ERROR
16055 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016057 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16058 m_errorMonitor->VerifyFound();
16059 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16060
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016061 // TODO: Update framework to easily passing mutable flag into ImageObj init
16062 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016063 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16064 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16065 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016066 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16067 // VIEW_CREATE_ERROR
16068 VkImageCreateInfo mutImgInfo = image.create_info();
16069 VkImage mutImage;
16070 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016071 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016072 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16073 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016074 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016075 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016076
16077 VkMemoryRequirements requirements;
16078 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16079
16080 VkMemoryAllocateInfo alloc_info{};
16081 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16082 alloc_info.pNext = NULL;
16083 alloc_info.memoryTypeIndex = 0;
16084 alloc_info.allocationSize = requirements.size;
16085 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16086 ASSERT_TRUE(pass);
16087
16088 VkDeviceMemory memory;
16089 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16090 ASSERT_VK_SUCCESS(ret);
16091
16092 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16093 ASSERT_VK_SUCCESS(ret);
16094
Tony Barbourd6673642016-05-05 14:46:39 -060016095 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016097 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16098 m_errorMonitor->VerifyFound();
16099 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016100
16101 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016102 vkDestroyImage(m_device->handle(), mutImage, NULL);
16103}
16104
Dave Houlton75967fc2017-03-06 17:21:16 -070016105TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16106 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16107
Tony Barbour1fa09702017-03-16 12:09:08 -060016108 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016109
Jamie Madill35127872017-03-15 16:17:46 -040016110 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016111 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16112 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16113 if (device_features.textureCompressionBC) {
16114 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16115 } else if (device_features.textureCompressionETC2) {
16116 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16117 } else if (device_features.textureCompressionASTC_LDR) {
16118 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16119 } else {
16120 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16121 return;
16122 }
16123
16124 VkImageCreateInfo ci;
16125 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16126 ci.pNext = NULL;
16127 ci.flags = 0;
16128 ci.imageType = VK_IMAGE_TYPE_2D;
16129 ci.format = compressed_format;
16130 ci.extent = {32, 32, 1};
16131 ci.mipLevels = 6;
16132 ci.arrayLayers = 1;
16133 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16134 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16135 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16136 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16137 ci.queueFamilyIndexCount = 0;
16138 ci.pQueueFamilyIndices = NULL;
16139 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16140
16141 VkImageObj image(m_device);
16142 image.init(&ci);
16143 ASSERT_TRUE(image.initialized());
16144
16145 VkImageObj odd_image(m_device);
16146 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16147 odd_image.init(&ci);
16148 ASSERT_TRUE(odd_image.initialized());
16149
16150 // Allocate buffers
16151 VkMemoryPropertyFlags reqs = 0;
16152 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16153 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16154 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16155 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16156 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16157
16158 VkBufferImageCopy region = {};
16159 region.bufferRowLength = 0;
16160 region.bufferImageHeight = 0;
16161 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16162 region.imageSubresource.layerCount = 1;
16163 region.imageOffset = {0, 0, 0};
16164 region.bufferOffset = 0;
16165
16166 // start recording
16167 m_commandBuffer->BeginCommandBuffer();
16168
16169 // Mip level copies that work - 5 levels
16170 m_errorMonitor->ExpectSuccess();
16171
16172 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16173 region.imageExtent = {32, 32, 1};
16174 region.imageSubresource.mipLevel = 0;
16175 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16176 &region);
16177 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16178 &region);
16179
16180 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16181 region.imageExtent = {8, 8, 1};
16182 region.imageSubresource.mipLevel = 2;
16183 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16184 &region);
16185 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16186 &region);
16187
16188 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16189 region.imageExtent = {4, 4, 1};
16190 region.imageSubresource.mipLevel = 3;
16191 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16192 &region);
16193 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16194 &region);
16195
16196 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16197 region.imageExtent = {2, 2, 1};
16198 region.imageSubresource.mipLevel = 4;
16199 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16200 &region);
16201 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16202 &region);
16203
16204 region.imageExtent = {1, 1, 1};
16205 region.imageSubresource.mipLevel = 5;
16206 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16207 &region);
16208 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16209 &region);
16210 m_errorMonitor->VerifyNotFound();
16211
16212 // Buffer must accomodate a full compressed block, regardless of texel count
16213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16214 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16215 &region);
16216 m_errorMonitor->VerifyFound();
16217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16218 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16219 &region);
16220 m_errorMonitor->VerifyFound();
16221
16222 // Copy width < compressed block size, but not the full mip width
16223 region.imageExtent = {1, 2, 1};
16224 region.imageSubresource.mipLevel = 4;
16225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16226 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16227 &region);
16228 m_errorMonitor->VerifyFound();
16229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16230 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16231 &region);
16232 m_errorMonitor->VerifyFound();
16233
16234 // Copy height < compressed block size but not the full mip height
16235 region.imageExtent = {2, 1, 1};
16236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16237 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16238 &region);
16239 m_errorMonitor->VerifyFound();
16240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16241 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16242 &region);
16243 m_errorMonitor->VerifyFound();
16244
16245 // Offsets must be multiple of compressed block size
16246 region.imageOffset = {1, 1, 0};
16247 region.imageExtent = {1, 1, 1};
16248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16249 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16250 &region);
16251 m_errorMonitor->VerifyFound();
16252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16253 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16254 &region);
16255 m_errorMonitor->VerifyFound();
16256
16257 // Offset + extent width = mip width - should succeed
16258 region.imageOffset = {4, 4, 0};
16259 region.imageExtent = {3, 4, 1};
16260 region.imageSubresource.mipLevel = 2;
16261 m_errorMonitor->ExpectSuccess();
16262 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16263 &region);
16264 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16265 &region);
16266 m_errorMonitor->VerifyNotFound();
16267
16268 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16269 region.imageExtent = {4, 4, 1};
16270 m_errorMonitor->ExpectSuccess();
16271 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16272 &region);
16273 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16274 &region);
16275 m_errorMonitor->VerifyNotFound();
16276
16277 // Offset + extent width < mip width and not a multiple of block width - should fail
16278 region.imageExtent = {3, 3, 1};
16279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16280 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16281 &region);
16282 m_errorMonitor->VerifyFound();
16283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16284 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16285 &region);
16286 m_errorMonitor->VerifyFound();
16287}
16288
Dave Houlton59a20702017-02-02 17:26:23 -070016289TEST_F(VkLayerTest, ImageBufferCopyTests) {
16290 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16291
Tony Barbour1fa09702017-03-16 12:09:08 -060016292 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016293 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16294 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16295 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16296 return;
16297 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016298
16299 // Bail if any dimension of transfer granularity is 0.
16300 auto index = m_device->graphics_queue_node_index_;
16301 auto queue_family_properties = m_device->phy().queue_properties();
16302 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16303 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16304 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16305 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16306 return;
16307 }
16308
Dave Houlton59a20702017-02-02 17:26:23 -070016309 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16310 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16311 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016312 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16313 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16314 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16315 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16316
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016317 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016318 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16319 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016320 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016321 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16322 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016323 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Dave Houlton59a20702017-02-02 17:26:23 -070016324 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016325 ASSERT_TRUE(image_64k.initialized());
16326 ASSERT_TRUE(image_16k.initialized());
16327 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016328
Dave Houltonf3229d52017-02-21 15:59:08 -070016329 // Verify all needed Depth/Stencil formats are supported
16330 bool missing_ds_support = false;
16331 VkFormatProperties props = {0, 0, 0};
16332 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16333 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16334 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16335 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16336 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16337 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16338 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16339 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16340
16341 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016342 ds_image_4D_1S.Init(
16343 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016344 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16345 VK_IMAGE_TILING_OPTIMAL, 0);
16346 ASSERT_TRUE(ds_image_4D_1S.initialized());
16347
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016348 ds_image_3D_1S.Init(
16349 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016350 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16351 VK_IMAGE_TILING_OPTIMAL, 0);
16352 ASSERT_TRUE(ds_image_3D_1S.initialized());
16353
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016354 ds_image_2D.Init(256, 256, 1, VK_FORMAT_D16_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16355 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16356 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016357 ASSERT_TRUE(ds_image_2D.initialized());
16358
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016359 ds_image_1S.Init(256, 256, 1, VK_FORMAT_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16360 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16361 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016362 ASSERT_TRUE(ds_image_1S.initialized());
16363 }
16364
16365 // Allocate buffers
16366 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016367 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016368 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16369 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16370 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16371 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016372
16373 VkBufferImageCopy region = {};
16374 region.bufferRowLength = 0;
16375 region.bufferImageHeight = 0;
16376 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16377 region.imageSubresource.layerCount = 1;
16378 region.imageOffset = {0, 0, 0};
16379 region.imageExtent = {64, 64, 1};
16380 region.bufferOffset = 0;
16381
16382 // attempt copies before putting command buffer in recording state
16383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16384 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16385 &region);
16386 m_errorMonitor->VerifyFound();
16387
16388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16389 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16390 &region);
16391 m_errorMonitor->VerifyFound();
16392
16393 // start recording
16394 m_commandBuffer->BeginCommandBuffer();
16395
16396 // successful copies
16397 m_errorMonitor->ExpectSuccess();
16398 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16399 &region);
16400 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16401 &region);
16402 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16403 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16404 &region);
16405 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16406 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16407 &region);
16408 region.imageOffset.x = 0;
16409 region.imageExtent.height = 64;
16410 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16411 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16412 &region);
16413 m_errorMonitor->VerifyNotFound();
16414
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016415 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016416 region.imageExtent = {65, 64, 1};
16417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16418 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16419 &region);
16420 m_errorMonitor->VerifyFound();
16421
16422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16423 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16424 &region);
16425 m_errorMonitor->VerifyFound();
16426
16427 // image/buffer too small (offset) on copy to image
16428 region.imageExtent = {64, 64, 1};
16429 region.imageOffset = {0, 4, 0};
16430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16431 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16432 &region);
16433 m_errorMonitor->VerifyFound();
16434
16435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16436 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16437 &region);
16438 m_errorMonitor->VerifyFound();
16439
16440 // image/buffer too small on copy to buffer
16441 region.imageExtent = {64, 64, 1};
16442 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016443 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16445 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16446 &region);
16447 m_errorMonitor->VerifyFound();
16448
16449 region.imageExtent = {64, 65, 1};
16450 region.bufferOffset = 0;
16451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16452 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16453 &region);
16454 m_errorMonitor->VerifyFound();
16455
16456 // buffer size ok but rowlength causes loose packing
16457 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16458 region.imageExtent = {64, 64, 1};
16459 region.bufferRowLength = 68;
16460 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16461 &region);
16462 m_errorMonitor->VerifyFound();
16463
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016464 // An extent with zero area should produce a warning, but no error
16465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16466 region.imageExtent.width = 0;
16467 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16468 &region);
16469 m_errorMonitor->VerifyFound();
16470
Dave Houlton59a20702017-02-02 17:26:23 -070016471 // aspect bits
16472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16473 region.imageExtent = {64, 64, 1};
16474 region.bufferRowLength = 0;
16475 region.bufferImageHeight = 0;
16476 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16477 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16478 buffer_16k.handle(), 1, &region);
16479 m_errorMonitor->VerifyFound();
16480
16481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16482 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16483 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16484 &region);
16485 m_errorMonitor->VerifyFound();
16486
16487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16488 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16489 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16490 buffer_16k.handle(), 1, &region);
16491 m_errorMonitor->VerifyFound();
16492
Dave Houltonf3229d52017-02-21 15:59:08 -070016493 // Test Depth/Stencil copies
16494 if (missing_ds_support) {
16495 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16496 } else {
16497 VkBufferImageCopy ds_region = {};
16498 ds_region.bufferOffset = 0;
16499 ds_region.bufferRowLength = 0;
16500 ds_region.bufferImageHeight = 0;
16501 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16502 ds_region.imageSubresource.mipLevel = 0;
16503 ds_region.imageSubresource.baseArrayLayer = 0;
16504 ds_region.imageSubresource.layerCount = 1;
16505 ds_region.imageOffset = {0, 0, 0};
16506 ds_region.imageExtent = {256, 256, 1};
16507
16508 // Depth copies that should succeed
16509 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16510 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16511 buffer_256k.handle(), 1, &ds_region);
16512 m_errorMonitor->VerifyNotFound();
16513
16514 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16515 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16516 buffer_256k.handle(), 1, &ds_region);
16517 m_errorMonitor->VerifyNotFound();
16518
16519 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16520 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16521 buffer_128k.handle(), 1, &ds_region);
16522 m_errorMonitor->VerifyNotFound();
16523
16524 // Depth copies that should fail
16525 ds_region.bufferOffset = 4;
16526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16527 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16528 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16529 buffer_256k.handle(), 1, &ds_region);
16530 m_errorMonitor->VerifyFound();
16531
16532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16533 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16534 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16535 buffer_256k.handle(), 1, &ds_region);
16536 m_errorMonitor->VerifyFound();
16537
16538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16539 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16540 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16541 buffer_128k.handle(), 1, &ds_region);
16542 m_errorMonitor->VerifyFound();
16543
16544 // Stencil copies that should succeed
16545 ds_region.bufferOffset = 0;
16546 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16547 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16548 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16549 buffer_64k.handle(), 1, &ds_region);
16550 m_errorMonitor->VerifyNotFound();
16551
16552 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16553 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16554 buffer_64k.handle(), 1, &ds_region);
16555 m_errorMonitor->VerifyNotFound();
16556
16557 m_errorMonitor->ExpectSuccess(); // 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->VerifyNotFound();
16561
16562 // Stencil copies that should fail
16563 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16564 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16565 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16566 buffer_16k.handle(), 1, &ds_region);
16567 m_errorMonitor->VerifyFound();
16568
16569 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16570 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16571 ds_region.bufferRowLength = 260;
16572 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16573 buffer_64k.handle(), 1, &ds_region);
16574 m_errorMonitor->VerifyFound();
16575
16576 ds_region.bufferRowLength = 0;
16577 ds_region.bufferOffset = 4;
16578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16579 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16580 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16581 buffer_64k.handle(), 1, &ds_region);
16582 m_errorMonitor->VerifyFound();
16583 }
16584
Dave Houlton584d51e2017-02-16 12:52:54 -070016585 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016586 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016587 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016588 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16589 device_features.textureCompressionASTC_LDR)) {
16590 printf(" No compressed formats supported - block compression tests skipped.\n");
16591 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016592 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16593 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016594 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016595 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16596 0);
16597 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
Dave Houlton67e9b532017-03-02 17:00:10 -070016598 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016599 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016600 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton584d51e2017-02-16 12:52:54 -070016601 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016602 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton67e9b532017-03-02 17:00:10 -070016603 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016604 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016605 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016606 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016607 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton67e9b532017-03-02 17:00:10 -070016608 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016609 }
16610 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016611
Dave Houlton584d51e2017-02-16 12:52:54 -070016612 // Just fits
16613 m_errorMonitor->ExpectSuccess();
16614 region.imageExtent = {128, 128, 1};
16615 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16616 buffer_16k.handle(), 1, &region);
16617 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016618
Dave Houlton584d51e2017-02-16 12:52:54 -070016619 // with offset, too big for buffer
16620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16621 region.bufferOffset = 16;
16622 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16623 buffer_16k.handle(), 1, &region);
16624 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016625 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016626
Dave Houlton67e9b532017-03-02 17:00:10 -070016627 // extents that are not a multiple of compressed block size
16628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16629 region.imageExtent.width = 66;
16630 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16631 buffer_16k.handle(), 1, &region);
16632 m_errorMonitor->VerifyFound();
16633 region.imageExtent.width = 128;
16634
16635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016636 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016637 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16638 buffer_16k.handle(), 1, &region);
16639 m_errorMonitor->VerifyFound();
16640 region.imageExtent.height = 128;
16641
16642 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16643
16644 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16645 m_errorMonitor->ExpectSuccess();
16646 region.imageExtent.width = 66;
16647 region.imageOffset.x = 64;
16648 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16649 buffer_16k.handle(), 1, &region);
16650 region.imageExtent.width = 16;
16651 region.imageOffset.x = 0;
16652 region.imageExtent.height = 2;
16653 region.imageOffset.y = 128;
16654 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016655 buffer_16k.handle(), 1, &region);
16656 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016657 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016658
Dave Houlton584d51e2017-02-16 12:52:54 -070016659 // buffer offset must be a multiple of texel block size (16)
16660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16662 region.imageExtent = {64, 64, 1};
16663 region.bufferOffset = 24;
16664 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16665 buffer_16k.handle(), 1, &region);
16666 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016667
Dave Houlton584d51e2017-02-16 12:52:54 -070016668 // rowlength not a multiple of block width (4)
16669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16670 region.bufferOffset = 0;
16671 region.bufferRowLength = 130;
16672 region.bufferImageHeight = 0;
16673 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16674 buffer_64k.handle(), 1, &region);
16675 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016676
Dave Houlton584d51e2017-02-16 12:52:54 -070016677 // imageheight not a multiple of block height (4)
16678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16679 region.bufferRowLength = 0;
16680 region.bufferImageHeight = 130;
16681 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16682 buffer_64k.handle(), 1, &region);
16683 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016684 }
Dave Houlton59a20702017-02-02 17:26:23 -070016685}
16686
Tony Barbourd6673642016-05-05 14:46:39 -060016687TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016688 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016689
Tony Barbour1fa09702017-03-16 12:09:08 -060016690 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016691
Rene Lindsay135204f2016-12-22 17:11:09 -070016692 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016693 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016694 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016695 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016696 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016697 vk_testing::Buffer buffer;
16698 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016699 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016700 VkBufferImageCopy region = {};
16701 region.bufferRowLength = 128;
16702 region.bufferImageHeight = 128;
16703 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16704 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016705 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016706 region.imageExtent.height = 4;
16707 region.imageExtent.width = 4;
16708 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016709
16710 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016711 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016712 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016713 ASSERT_TRUE(image2.initialized());
16714 vk_testing::Buffer buffer2;
16715 VkMemoryPropertyFlags reqs2 = 0;
16716 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16717 VkBufferImageCopy region2 = {};
16718 region2.bufferRowLength = 128;
16719 region2.bufferImageHeight = 128;
16720 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16721 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16722 region2.imageSubresource.layerCount = 1;
16723 region2.imageExtent.height = 4;
16724 region2.imageExtent.width = 4;
16725 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016726 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016727
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016728 // Image must have offset.z of 0 and extent.depth of 1
16729 // Introduce failure by setting imageExtent.depth to 0
16730 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016732 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016733 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016734 m_errorMonitor->VerifyFound();
16735
16736 region.imageExtent.depth = 1;
16737
16738 // Image must have offset.z of 0 and extent.depth of 1
16739 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016740 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016741 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016744 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016745 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016746 m_errorMonitor->VerifyFound();
16747
16748 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016749 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16750 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016751 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016753 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16754 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016755 m_errorMonitor->VerifyFound();
16756
16757 // BufferOffset must be a multiple of 4
16758 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016759 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016761 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16762 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016763 m_errorMonitor->VerifyFound();
16764
16765 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16766 region.bufferOffset = 0;
16767 region.imageExtent.height = 128;
16768 region.imageExtent.width = 128;
16769 // Introduce failure by setting bufferRowLength > 0 but less than width
16770 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016772 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16773 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016774 m_errorMonitor->VerifyFound();
16775
16776 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16777 region.bufferRowLength = 128;
16778 // Introduce failure by setting bufferRowHeight > 0 but less than height
16779 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016781 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16782 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016783 m_errorMonitor->VerifyFound();
16784
16785 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016786 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016787 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016788 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016789 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016790 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016791 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016792 VkImageBlit blitRegion = {};
16793 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16794 blitRegion.srcSubresource.baseArrayLayer = 0;
16795 blitRegion.srcSubresource.layerCount = 1;
16796 blitRegion.srcSubresource.mipLevel = 0;
16797 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16798 blitRegion.dstSubresource.baseArrayLayer = 0;
16799 blitRegion.dstSubresource.layerCount = 1;
16800 blitRegion.dstSubresource.mipLevel = 0;
16801
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016802 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16804 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16806 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016807 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
16808 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016809 m_errorMonitor->VerifyFound();
16810
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016812 VkImageMemoryBarrier img_barrier;
16813 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16814 img_barrier.pNext = NULL;
16815 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16816 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16817 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16818 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16819 img_barrier.image = image.handle();
16820 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16821 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16822 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16823 img_barrier.subresourceRange.baseArrayLayer = 0;
16824 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016825 img_barrier.subresourceRange.layerCount = 0;
16826 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016827 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16828 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016829 m_errorMonitor->VerifyFound();
16830 img_barrier.subresourceRange.layerCount = 1;
16831}
16832
16833TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016834 TEST_DESCRIPTION("Exceed the limits of image format ");
16835
Tony Barbour1fa09702017-03-16 12:09:08 -060016836 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016837
16838 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16839 {
16840 VkFormatProperties properties;
16841 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16842 if (properties.linearTilingFeatures == 0) {
16843 printf(" Image format not supported; skipped.\n");
16844 return;
16845 }
16846 }
16847
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016849 VkImageCreateInfo image_create_info = {};
16850 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16851 image_create_info.pNext = NULL;
16852 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016853 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016854 image_create_info.extent.width = 32;
16855 image_create_info.extent.height = 32;
16856 image_create_info.extent.depth = 1;
16857 image_create_info.mipLevels = 1;
16858 image_create_info.arrayLayers = 1;
16859 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16860 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16861 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16862 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16863 image_create_info.flags = 0;
16864
16865 VkImage nullImg;
16866 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016867 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16868 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016869 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016870 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16871 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16872 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016873 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016874
Tony Barbour0907e362017-03-09 15:05:30 -070016875 uint32_t maxDim =
16876 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16877 // If max mip levels exceeds image extents, skip the max mip levels test
16878 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16880 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16881 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16882 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16883 m_errorMonitor->VerifyFound();
16884 image_create_info.mipLevels = 1;
16885 }
Tony Barbourd6673642016-05-05 14:46:39 -060016886
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016888 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16889 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16890 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16891 m_errorMonitor->VerifyFound();
16892 image_create_info.arrayLayers = 1;
16893
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016895 int samples = imgFmtProps.sampleCounts >> 1;
16896 image_create_info.samples = (VkSampleCountFlagBits)samples;
16897 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16898 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16899 m_errorMonitor->VerifyFound();
16900 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16901
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16903 "pCreateInfo->initialLayout, must be "
16904 "VK_IMAGE_LAYOUT_UNDEFINED or "
16905 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016906 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16907 // Expect INVALID_LAYOUT
16908 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16909 m_errorMonitor->VerifyFound();
16910 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16911}
16912
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016913TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016914 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016916
Tony Barbour1fa09702017-03-16 12:09:08 -060016917 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016918
16919 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016920 src_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016921 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016922 dst_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016923
Tony Barbour552f6c02016-12-21 14:34:07 -070016924 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016925 VkImageCopy copy_region;
16926 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16927 copy_region.srcSubresource.mipLevel = 0;
16928 copy_region.srcSubresource.baseArrayLayer = 0;
16929 copy_region.srcSubresource.layerCount = 0;
16930 copy_region.srcOffset.x = 0;
16931 copy_region.srcOffset.y = 0;
16932 copy_region.srcOffset.z = 0;
16933 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16934 copy_region.dstSubresource.mipLevel = 0;
16935 copy_region.dstSubresource.baseArrayLayer = 0;
16936 copy_region.dstSubresource.layerCount = 0;
16937 copy_region.dstOffset.x = 0;
16938 copy_region.dstOffset.y = 0;
16939 copy_region.dstOffset.z = 0;
16940 copy_region.extent.width = 64;
16941 copy_region.extent.height = 64;
16942 copy_region.extent.depth = 1;
16943 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16944 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016945 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016946
16947 m_errorMonitor->VerifyFound();
16948}
16949
16950TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016951 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016953
Tony Barbour1fa09702017-03-16 12:09:08 -060016954 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016955
16956 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016957 src_image.Init(64, 64, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016958 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016959 dst_image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016960
Tony Barbour552f6c02016-12-21 14:34:07 -070016961 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016962 VkImageCopy copy_region;
16963 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16964 copy_region.srcSubresource.mipLevel = 0;
16965 copy_region.srcSubresource.baseArrayLayer = 0;
16966 copy_region.srcSubresource.layerCount = 0;
16967 copy_region.srcOffset.x = 0;
16968 copy_region.srcOffset.y = 0;
16969 copy_region.srcOffset.z = 0;
16970 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16971 copy_region.dstSubresource.mipLevel = 0;
16972 copy_region.dstSubresource.baseArrayLayer = 0;
16973 copy_region.dstSubresource.layerCount = 0;
16974 copy_region.dstOffset.x = 0;
16975 copy_region.dstOffset.y = 0;
16976 copy_region.dstOffset.z = 0;
16977 copy_region.extent.width = 64;
16978 copy_region.extent.height = 64;
16979 copy_region.extent.depth = 1;
16980 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16981 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016982 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016983
16984 m_errorMonitor->VerifyFound();
16985}
16986
Karl Schultz6addd812016-02-02 17:17:23 -070016987TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016988 VkResult err;
16989 bool pass;
16990
16991 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016993
Tony Barbour1fa09702017-03-16 12:09:08 -060016994 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016995
16996 // Create two images of different types and try to copy between them
16997 VkImage srcImage;
16998 VkImage dstImage;
16999 VkDeviceMemory srcMem;
17000 VkDeviceMemory destMem;
17001 VkMemoryRequirements memReqs;
17002
17003 VkImageCreateInfo image_create_info = {};
17004 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17005 image_create_info.pNext = NULL;
17006 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17007 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17008 image_create_info.extent.width = 32;
17009 image_create_info.extent.height = 32;
17010 image_create_info.extent.depth = 1;
17011 image_create_info.mipLevels = 1;
17012 image_create_info.arrayLayers = 1;
17013 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17014 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17015 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17016 image_create_info.flags = 0;
17017
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017018 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017019 ASSERT_VK_SUCCESS(err);
17020
17021 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17022 // Introduce failure by creating second image with a different-sized format.
17023 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
17024
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017025 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017026 ASSERT_VK_SUCCESS(err);
17027
17028 // Allocate memory
17029 VkMemoryAllocateInfo memAlloc = {};
17030 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17031 memAlloc.pNext = NULL;
17032 memAlloc.allocationSize = 0;
17033 memAlloc.memoryTypeIndex = 0;
17034
17035 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17036 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017037 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017038 ASSERT_TRUE(pass);
17039 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17040 ASSERT_VK_SUCCESS(err);
17041
17042 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17043 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017044 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017045 ASSERT_TRUE(pass);
17046 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17047 ASSERT_VK_SUCCESS(err);
17048
17049 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17050 ASSERT_VK_SUCCESS(err);
17051 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17052 ASSERT_VK_SUCCESS(err);
17053
Tony Barbour552f6c02016-12-21 14:34:07 -070017054 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017055 VkImageCopy copyRegion;
17056 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17057 copyRegion.srcSubresource.mipLevel = 0;
17058 copyRegion.srcSubresource.baseArrayLayer = 0;
17059 copyRegion.srcSubresource.layerCount = 0;
17060 copyRegion.srcOffset.x = 0;
17061 copyRegion.srcOffset.y = 0;
17062 copyRegion.srcOffset.z = 0;
17063 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17064 copyRegion.dstSubresource.mipLevel = 0;
17065 copyRegion.dstSubresource.baseArrayLayer = 0;
17066 copyRegion.dstSubresource.layerCount = 0;
17067 copyRegion.dstOffset.x = 0;
17068 copyRegion.dstOffset.y = 0;
17069 copyRegion.dstOffset.z = 0;
17070 copyRegion.extent.width = 1;
17071 copyRegion.extent.height = 1;
17072 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017073 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017074 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017075
17076 m_errorMonitor->VerifyFound();
17077
17078 vkDestroyImage(m_device->device(), srcImage, NULL);
17079 vkDestroyImage(m_device->device(), dstImage, NULL);
17080 vkFreeMemory(m_device->device(), srcMem, NULL);
17081 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017082}
17083
Karl Schultz6addd812016-02-02 17:17:23 -070017084TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17085 VkResult err;
17086 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017087
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017088 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17090 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017091
Tony Barbour1fa09702017-03-16 12:09:08 -060017092 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017093 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017094 if (!depth_format) {
17095 return;
17096 }
Mike Stroyana3082432015-09-25 13:39:21 -060017097
17098 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017099 VkImage srcImage;
17100 VkImage dstImage;
17101 VkDeviceMemory srcMem;
17102 VkDeviceMemory destMem;
17103 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017104
17105 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017106 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17107 image_create_info.pNext = NULL;
17108 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017109 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017110 image_create_info.extent.width = 32;
17111 image_create_info.extent.height = 32;
17112 image_create_info.extent.depth = 1;
17113 image_create_info.mipLevels = 1;
17114 image_create_info.arrayLayers = 1;
17115 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17116 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17117 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17118 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017120 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017121 ASSERT_VK_SUCCESS(err);
17122
Karl Schultzbdb75952016-04-19 11:36:49 -060017123 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17124
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017125 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017126 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017127 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017128 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017129
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017130 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017131 ASSERT_VK_SUCCESS(err);
17132
17133 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017134 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017135 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17136 memAlloc.pNext = NULL;
17137 memAlloc.allocationSize = 0;
17138 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017139
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017140 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017141 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017142 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017143 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017144 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017145 ASSERT_VK_SUCCESS(err);
17146
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017147 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017148 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017149 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017150 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017151 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017152 ASSERT_VK_SUCCESS(err);
17153
17154 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17155 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017156 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017157 ASSERT_VK_SUCCESS(err);
17158
Tony Barbour552f6c02016-12-21 14:34:07 -070017159 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017160 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017161 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017162 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017163 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017164 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017165 copyRegion.srcOffset.x = 0;
17166 copyRegion.srcOffset.y = 0;
17167 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017168 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017169 copyRegion.dstSubresource.mipLevel = 0;
17170 copyRegion.dstSubresource.baseArrayLayer = 0;
17171 copyRegion.dstSubresource.layerCount = 0;
17172 copyRegion.dstOffset.x = 0;
17173 copyRegion.dstOffset.y = 0;
17174 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017175 copyRegion.extent.width = 1;
17176 copyRegion.extent.height = 1;
17177 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017178 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017179 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017180
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017181 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017182
Chia-I Wuf7458c52015-10-26 21:10:41 +080017183 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017184 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017185 vkFreeMemory(m_device->device(), srcMem, NULL);
17186 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017187}
17188
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017189TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17190 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017191
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017192 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017193
17194 VkImageFormatProperties image_format_properties;
17195 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17196 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17197 &image_format_properties);
17198
17199 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17200 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17201 printf(" Image multi-sample support not found; skipped.\n");
17202 return;
17203 }
17204
17205 VkImageCreateInfo ci;
17206 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17207 ci.pNext = NULL;
17208 ci.flags = 0;
17209 ci.imageType = VK_IMAGE_TYPE_2D;
17210 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17211 ci.extent = {128, 128, 1};
17212 ci.mipLevels = 1;
17213 ci.arrayLayers = 1;
17214 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17215 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17216 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17217 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17218 ci.queueFamilyIndexCount = 0;
17219 ci.pQueueFamilyIndices = NULL;
17220 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17221
17222 VkImageObj image1(m_device);
17223 image1.init(&ci);
17224 ASSERT_TRUE(image1.initialized());
17225
17226 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17227 VkImageObj image2(m_device);
17228 image2.init(&ci);
17229 ASSERT_TRUE(image2.initialized());
17230
17231 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17232 VkImageObj image4(m_device);
17233 image4.init(&ci);
17234 ASSERT_TRUE(image4.initialized());
17235
17236 m_commandBuffer->BeginCommandBuffer();
17237
17238 VkImageCopy copyRegion;
17239 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17240 copyRegion.srcSubresource.mipLevel = 0;
17241 copyRegion.srcSubresource.baseArrayLayer = 0;
17242 copyRegion.srcSubresource.layerCount = 1;
17243 copyRegion.srcOffset = {0, 0, 0};
17244 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17245 copyRegion.dstSubresource.mipLevel = 0;
17246 copyRegion.dstSubresource.baseArrayLayer = 0;
17247 copyRegion.dstSubresource.layerCount = 1;
17248 copyRegion.dstOffset = {0, 0, 0};
17249 copyRegion.extent = {128, 128, 1};
17250
17251 // Copy a single sample image to/from a multi-sample image
17252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17253 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17254 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17255 m_errorMonitor->VerifyFound();
17256
17257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17258 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17259 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17260 m_errorMonitor->VerifyFound();
17261
17262 // Copy between multi-sample images with different sample counts
17263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17264 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17265 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17266 m_errorMonitor->VerifyFound();
17267
17268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17269 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17270 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17271 m_errorMonitor->VerifyFound();
17272
17273 m_commandBuffer->EndCommandBuffer();
17274}
17275
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017276TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17277 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017278 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017279 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017280 if (!ds_format) {
17281 return;
17282 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017283
17284 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017285 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17286 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17287 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17288 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017289 ASSERT_TRUE(color_image.initialized());
17290 ASSERT_TRUE(depth_image.initialized());
17291 ASSERT_TRUE(ds_image.initialized());
17292
17293 VkImageCopy copyRegion;
17294 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17295 copyRegion.srcSubresource.mipLevel = 0;
17296 copyRegion.srcSubresource.baseArrayLayer = 0;
17297 copyRegion.srcSubresource.layerCount = 1;
17298 copyRegion.srcOffset = {0, 0, 0};
17299 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17300 copyRegion.dstSubresource.mipLevel = 0;
17301 copyRegion.dstSubresource.baseArrayLayer = 0;
17302 copyRegion.dstSubresource.layerCount = 1;
17303 copyRegion.dstOffset = {64, 0, 0};
17304 copyRegion.extent = {64, 128, 1};
17305
17306 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17308 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17309 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17310 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017311 m_errorMonitor->VerifyFound();
17312
17313 m_commandBuffer->BeginCommandBuffer();
17314
17315 // Src and dest aspect masks don't match
17316 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017318 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17319 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017320 m_errorMonitor->VerifyFound();
17321 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17322
17323 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017324 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017325 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17327 // These aspect/format mismatches are redundant but unavoidable here
17328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017330 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17331 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017332 m_errorMonitor->VerifyFound();
17333 // Metadata aspect is illegal - VU 01222
17334 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17335 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17337 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017338 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17339 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017340 m_errorMonitor->VerifyFound();
17341
17342 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17343 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17344
17345 // Aspect mask doesn't match source image format - VU 01200
17346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17347 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17349 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17350 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17351 m_errorMonitor->VerifyFound();
17352
17353 // Aspect mask doesn't match dest image format - VU 01201
17354 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17355 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17357 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17359 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17360 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17361 m_errorMonitor->VerifyFound();
17362
17363 m_commandBuffer->EndCommandBuffer();
17364}
17365
Karl Schultz6addd812016-02-02 17:17:23 -070017366TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17367 VkResult err;
17368 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017369
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17371 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017372
Tony Barbour1fa09702017-03-16 12:09:08 -060017373 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017374
17375 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017376 VkImage srcImage;
17377 VkImage dstImage;
17378 VkDeviceMemory srcMem;
17379 VkDeviceMemory destMem;
17380 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017381
17382 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017383 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17384 image_create_info.pNext = NULL;
17385 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17386 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17387 image_create_info.extent.width = 32;
17388 image_create_info.extent.height = 1;
17389 image_create_info.extent.depth = 1;
17390 image_create_info.mipLevels = 1;
17391 image_create_info.arrayLayers = 1;
17392 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17393 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17394 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17395 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017396
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017397 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017398 ASSERT_VK_SUCCESS(err);
17399
Karl Schultz6addd812016-02-02 17:17:23 -070017400 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017401
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017402 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017403 ASSERT_VK_SUCCESS(err);
17404
17405 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017406 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017407 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17408 memAlloc.pNext = NULL;
17409 memAlloc.allocationSize = 0;
17410 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017411
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017412 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017413 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017414 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017415 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017416 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017417 ASSERT_VK_SUCCESS(err);
17418
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017419 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017420 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017421 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017422 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017423 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017424 ASSERT_VK_SUCCESS(err);
17425
17426 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17427 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017428 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017429 ASSERT_VK_SUCCESS(err);
17430
Tony Barbour552f6c02016-12-21 14:34:07 -070017431 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017432 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017433 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17434 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017435 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017436 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017437 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017438 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017439 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017440 resolveRegion.srcOffset.x = 0;
17441 resolveRegion.srcOffset.y = 0;
17442 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017443 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017444 resolveRegion.dstSubresource.mipLevel = 0;
17445 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017446 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017447 resolveRegion.dstOffset.x = 0;
17448 resolveRegion.dstOffset.y = 0;
17449 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017450 resolveRegion.extent.width = 1;
17451 resolveRegion.extent.height = 1;
17452 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017453 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017454 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017455
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017456 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017457
Chia-I Wuf7458c52015-10-26 21:10:41 +080017458 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017459 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017460 vkFreeMemory(m_device->device(), srcMem, NULL);
17461 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017462}
17463
Karl Schultz6addd812016-02-02 17:17:23 -070017464TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17465 VkResult err;
17466 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017467
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17469 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017470
Tony Barbour1fa09702017-03-16 12:09:08 -060017471 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017472
Chris Forbesa7530692016-05-08 12:35:39 +120017473 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017474 VkImage srcImage;
17475 VkImage dstImage;
17476 VkDeviceMemory srcMem;
17477 VkDeviceMemory destMem;
17478 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017479
17480 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017481 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17482 image_create_info.pNext = NULL;
17483 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17484 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17485 image_create_info.extent.width = 32;
17486 image_create_info.extent.height = 1;
17487 image_create_info.extent.depth = 1;
17488 image_create_info.mipLevels = 1;
17489 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017490 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017491 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17492 // Note: Some implementations expect color attachment usage for any
17493 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017494 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017495 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017497 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017498 ASSERT_VK_SUCCESS(err);
17499
Karl Schultz6addd812016-02-02 17:17:23 -070017500 // Note: Some implementations expect color attachment usage for any
17501 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017502 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017503
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017504 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017505 ASSERT_VK_SUCCESS(err);
17506
17507 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017508 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017509 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17510 memAlloc.pNext = NULL;
17511 memAlloc.allocationSize = 0;
17512 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017513
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017514 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017515 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017516 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017517 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017518 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017519 ASSERT_VK_SUCCESS(err);
17520
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017521 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017522 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017523 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017524 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017525 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017526 ASSERT_VK_SUCCESS(err);
17527
17528 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17529 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017530 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017531 ASSERT_VK_SUCCESS(err);
17532
Tony Barbour552f6c02016-12-21 14:34:07 -070017533 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017534 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017535 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17536 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017537 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017538 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017539 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017540 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017541 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017542 resolveRegion.srcOffset.x = 0;
17543 resolveRegion.srcOffset.y = 0;
17544 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017545 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017546 resolveRegion.dstSubresource.mipLevel = 0;
17547 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017548 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017549 resolveRegion.dstOffset.x = 0;
17550 resolveRegion.dstOffset.y = 0;
17551 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017552 resolveRegion.extent.width = 1;
17553 resolveRegion.extent.height = 1;
17554 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017555 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017556 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017557
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017558 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017559
Chia-I Wuf7458c52015-10-26 21:10:41 +080017560 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017561 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017562 vkFreeMemory(m_device->device(), srcMem, NULL);
17563 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017564}
17565
Karl Schultz6addd812016-02-02 17:17:23 -070017566TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17567 VkResult err;
17568 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017569
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017571 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017572
Tony Barbour1fa09702017-03-16 12:09:08 -060017573 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017574
17575 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017576 VkImage srcImage;
17577 VkImage dstImage;
17578 VkDeviceMemory srcMem;
17579 VkDeviceMemory destMem;
17580 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017581
17582 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017583 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17584 image_create_info.pNext = NULL;
17585 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17586 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17587 image_create_info.extent.width = 32;
17588 image_create_info.extent.height = 1;
17589 image_create_info.extent.depth = 1;
17590 image_create_info.mipLevels = 1;
17591 image_create_info.arrayLayers = 1;
17592 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17593 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17594 // Note: Some implementations expect color attachment usage for any
17595 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017596 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017597 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017598
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017599 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017600 ASSERT_VK_SUCCESS(err);
17601
Karl Schultz6addd812016-02-02 17:17:23 -070017602 // Set format to something other than source image
17603 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17604 // Note: Some implementations expect color attachment usage for any
17605 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017606 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017607 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017608
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017609 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017610 ASSERT_VK_SUCCESS(err);
17611
17612 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017613 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017614 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17615 memAlloc.pNext = NULL;
17616 memAlloc.allocationSize = 0;
17617 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017618
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017619 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017620 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017621 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017622 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017623 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017624 ASSERT_VK_SUCCESS(err);
17625
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017626 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017627 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017628 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017629 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017630 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017631 ASSERT_VK_SUCCESS(err);
17632
17633 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17634 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017635 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017636 ASSERT_VK_SUCCESS(err);
17637
Tony Barbour552f6c02016-12-21 14:34:07 -070017638 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017639 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017640 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17641 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017642 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017643 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017644 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017645 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017646 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017647 resolveRegion.srcOffset.x = 0;
17648 resolveRegion.srcOffset.y = 0;
17649 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017650 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017651 resolveRegion.dstSubresource.mipLevel = 0;
17652 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017653 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017654 resolveRegion.dstOffset.x = 0;
17655 resolveRegion.dstOffset.y = 0;
17656 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017657 resolveRegion.extent.width = 1;
17658 resolveRegion.extent.height = 1;
17659 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017660 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017661 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017662
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017663 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017664
Chia-I Wuf7458c52015-10-26 21:10:41 +080017665 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017666 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017667 vkFreeMemory(m_device->device(), srcMem, NULL);
17668 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017669}
17670
Karl Schultz6addd812016-02-02 17:17:23 -070017671TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17672 VkResult err;
17673 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017674
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017676 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017677
Tony Barbour1fa09702017-03-16 12:09:08 -060017678 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017679
17680 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017681 VkImage srcImage;
17682 VkImage dstImage;
17683 VkDeviceMemory srcMem;
17684 VkDeviceMemory destMem;
17685 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017686
17687 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017688 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17689 image_create_info.pNext = NULL;
17690 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17691 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17692 image_create_info.extent.width = 32;
17693 image_create_info.extent.height = 1;
17694 image_create_info.extent.depth = 1;
17695 image_create_info.mipLevels = 1;
17696 image_create_info.arrayLayers = 1;
17697 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17698 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17699 // Note: Some implementations expect color attachment usage for any
17700 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017701 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017702 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017703
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017704 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017705 ASSERT_VK_SUCCESS(err);
17706
Karl Schultz6addd812016-02-02 17:17:23 -070017707 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17708 // Note: Some implementations expect color attachment usage for any
17709 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017710 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017711 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017712
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017713 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017714 ASSERT_VK_SUCCESS(err);
17715
17716 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017717 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017718 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17719 memAlloc.pNext = NULL;
17720 memAlloc.allocationSize = 0;
17721 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017722
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017723 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017724 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017725 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017726 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017727 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017728 ASSERT_VK_SUCCESS(err);
17729
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017730 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017731 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017732 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017733 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017734 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017735 ASSERT_VK_SUCCESS(err);
17736
17737 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17738 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017739 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017740 ASSERT_VK_SUCCESS(err);
17741
Tony Barbour552f6c02016-12-21 14:34:07 -070017742 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017743 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017744 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17745 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017746 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017747 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017748 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017749 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017750 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017751 resolveRegion.srcOffset.x = 0;
17752 resolveRegion.srcOffset.y = 0;
17753 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017754 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017755 resolveRegion.dstSubresource.mipLevel = 0;
17756 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017757 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017758 resolveRegion.dstOffset.x = 0;
17759 resolveRegion.dstOffset.y = 0;
17760 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017761 resolveRegion.extent.width = 1;
17762 resolveRegion.extent.height = 1;
17763 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017764 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017765 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017766
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017767 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017768
Chia-I Wuf7458c52015-10-26 21:10:41 +080017769 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017770 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017771 vkFreeMemory(m_device->device(), srcMem, NULL);
17772 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017773}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017774
Karl Schultz6addd812016-02-02 17:17:23 -070017775TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017776 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017777 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17778 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017779 // The image format check comes 2nd in validation so we trigger it first,
17780 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017781 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017782
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17784 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017785
Tony Barbour1fa09702017-03-16 12:09:08 -060017786 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017787 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017788 if (!depth_format) {
17789 return;
17790 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017791
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017792 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017793 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17794 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017795
17796 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017797 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17798 ds_pool_ci.pNext = NULL;
17799 ds_pool_ci.maxSets = 1;
17800 ds_pool_ci.poolSizeCount = 1;
17801 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017802
17803 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017804 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017805 ASSERT_VK_SUCCESS(err);
17806
17807 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017808 dsl_binding.binding = 0;
17809 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17810 dsl_binding.descriptorCount = 1;
17811 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17812 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017813
17814 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017815 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17816 ds_layout_ci.pNext = NULL;
17817 ds_layout_ci.bindingCount = 1;
17818 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017819 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017820 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017821 ASSERT_VK_SUCCESS(err);
17822
17823 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017824 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017825 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017826 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017827 alloc_info.descriptorPool = ds_pool;
17828 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017829 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017830 ASSERT_VK_SUCCESS(err);
17831
Karl Schultz6addd812016-02-02 17:17:23 -070017832 VkImage image_bad;
17833 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017834 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017835 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017836 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017837 const int32_t tex_width = 32;
17838 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017839
17840 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017841 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17842 image_create_info.pNext = NULL;
17843 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17844 image_create_info.format = tex_format_bad;
17845 image_create_info.extent.width = tex_width;
17846 image_create_info.extent.height = tex_height;
17847 image_create_info.extent.depth = 1;
17848 image_create_info.mipLevels = 1;
17849 image_create_info.arrayLayers = 1;
17850 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17851 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017852 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017853 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017854
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017855 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017856 ASSERT_VK_SUCCESS(err);
17857 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017858 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17859 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017860 ASSERT_VK_SUCCESS(err);
17861
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017862 // ---Bind image memory---
17863 VkMemoryRequirements img_mem_reqs;
17864 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17865 VkMemoryAllocateInfo image_alloc_info = {};
17866 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17867 image_alloc_info.pNext = NULL;
17868 image_alloc_info.memoryTypeIndex = 0;
17869 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017870 bool pass =
17871 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 -070017872 ASSERT_TRUE(pass);
17873 VkDeviceMemory mem;
17874 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17875 ASSERT_VK_SUCCESS(err);
17876 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17877 ASSERT_VK_SUCCESS(err);
17878 // -----------------------
17879
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017880 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017881 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017882 image_view_create_info.image = image_bad;
17883 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17884 image_view_create_info.format = tex_format_bad;
17885 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17886 image_view_create_info.subresourceRange.baseMipLevel = 0;
17887 image_view_create_info.subresourceRange.layerCount = 1;
17888 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017889 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017890
17891 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017892 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017893
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017894 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017895
Chia-I Wuf7458c52015-10-26 21:10:41 +080017896 vkDestroyImage(m_device->device(), image_bad, NULL);
17897 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017898 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17899 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017900
17901 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017902}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017903
17904TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017905 TEST_DESCRIPTION(
17906 "Call ClearColorImage w/ a depth|stencil image and "
17907 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017908
Tony Barbour1fa09702017-03-16 12:09:08 -060017909 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017910 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017911 if (!depth_format) {
17912 return;
17913 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017914 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17915
Tony Barbour552f6c02016-12-21 14:34:07 -070017916 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017917
17918 // Color image
17919 VkClearColorValue clear_color;
17920 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17921 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17922 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17923 const int32_t img_width = 32;
17924 const int32_t img_height = 32;
17925 VkImageCreateInfo image_create_info = {};
17926 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17927 image_create_info.pNext = NULL;
17928 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17929 image_create_info.format = color_format;
17930 image_create_info.extent.width = img_width;
17931 image_create_info.extent.height = img_height;
17932 image_create_info.extent.depth = 1;
17933 image_create_info.mipLevels = 1;
17934 image_create_info.arrayLayers = 1;
17935 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17936 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17937 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17938
17939 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017940 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017941
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017942 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017943
17944 // Depth/Stencil image
17945 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017946 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017947 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17948 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017949 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017950 ds_image_create_info.extent.width = 64;
17951 ds_image_create_info.extent.height = 64;
17952 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017953 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 -060017954
17955 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017956 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017957
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017958 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 -060017959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017961
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017962 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017963 &color_range);
17964
17965 m_errorMonitor->VerifyFound();
17966
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17968 "vkCmdClearColorImage called with "
17969 "image created without "
17970 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017971
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017972 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017973 &color_range);
17974
17975 m_errorMonitor->VerifyFound();
17976
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017977 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17979 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017980
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017981 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17982 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017983
17984 m_errorMonitor->VerifyFound();
17985}
Tobin Ehliscde08892015-09-22 10:11:37 -060017986
Mike Schuchardt35fece12017-03-07 14:40:28 -070017987TEST_F(VkLayerTest, CommandQueueFlags) {
17988 TEST_DESCRIPTION(
17989 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17990 "graphics-only command");
17991
17992 ASSERT_NO_FATAL_FAILURE(Init());
17993
17994 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017995 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070017996 printf(" Non-graphics queue family not found; skipped.\n");
17997 return;
17998 } else {
17999 // Create command pool on a non-graphics queue
18000 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18001
18002 // Setup command buffer on pool
18003 VkCommandBufferObj command_buffer(m_device, &command_pool);
18004 command_buffer.BeginCommandBuffer();
18005
18006 // Issue a graphics only command
18007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18008 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18009 command_buffer.SetViewport(0, 1, &viewport);
18010 m_errorMonitor->VerifyFound();
18011 }
18012}
18013
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018014// WSI Enabled Tests
18015//
Chris Forbes09368e42016-10-13 11:59:22 +130018016#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018017TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18018
18019#if defined(VK_USE_PLATFORM_XCB_KHR)
18020 VkSurfaceKHR surface = VK_NULL_HANDLE;
18021
18022 VkResult err;
18023 bool pass;
18024 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18025 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18026 // uint32_t swapchain_image_count = 0;
18027 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18028 // uint32_t image_index = 0;
18029 // VkPresentInfoKHR present_info = {};
18030
Tony Barbour1fa09702017-03-16 12:09:08 -060018031 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018032
18033 // Use the create function from one of the VK_KHR_*_surface extension in
18034 // order to create a surface, testing all known errors in the process,
18035 // before successfully creating a surface:
18036 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18038 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18039 pass = (err != VK_SUCCESS);
18040 ASSERT_TRUE(pass);
18041 m_errorMonitor->VerifyFound();
18042
18043 // Next, try to create a surface with the wrong
18044 // VkXcbSurfaceCreateInfoKHR::sType:
18045 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18046 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18048 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18049 pass = (err != VK_SUCCESS);
18050 ASSERT_TRUE(pass);
18051 m_errorMonitor->VerifyFound();
18052
18053 // Create a native window, and then correctly create a surface:
18054 xcb_connection_t *connection;
18055 xcb_screen_t *screen;
18056 xcb_window_t xcb_window;
18057 xcb_intern_atom_reply_t *atom_wm_delete_window;
18058
18059 const xcb_setup_t *setup;
18060 xcb_screen_iterator_t iter;
18061 int scr;
18062 uint32_t value_mask, value_list[32];
18063 int width = 1;
18064 int height = 1;
18065
18066 connection = xcb_connect(NULL, &scr);
18067 ASSERT_TRUE(connection != NULL);
18068 setup = xcb_get_setup(connection);
18069 iter = xcb_setup_roots_iterator(setup);
18070 while (scr-- > 0)
18071 xcb_screen_next(&iter);
18072 screen = iter.data;
18073
18074 xcb_window = xcb_generate_id(connection);
18075
18076 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18077 value_list[0] = screen->black_pixel;
18078 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18079
18080 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18081 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18082
18083 /* Magic code that will send notification when window is destroyed */
18084 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18085 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18086
18087 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18088 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18089 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18090 free(reply);
18091
18092 xcb_map_window(connection, xcb_window);
18093
18094 // Force the x/y coordinates to 100,100 results are identical in consecutive
18095 // runs
18096 const uint32_t coords[] = { 100, 100 };
18097 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18098
18099 // Finally, try to correctly create a surface:
18100 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18101 xcb_create_info.pNext = NULL;
18102 xcb_create_info.flags = 0;
18103 xcb_create_info.connection = connection;
18104 xcb_create_info.window = xcb_window;
18105 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18106 pass = (err == VK_SUCCESS);
18107 ASSERT_TRUE(pass);
18108
18109 // Check if surface supports presentation:
18110
18111 // 1st, do so without having queried the queue families:
18112 VkBool32 supported = false;
18113 // TODO: Get the following error to come out:
18114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18115 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18116 "function");
18117 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18118 pass = (err != VK_SUCCESS);
18119 // ASSERT_TRUE(pass);
18120 // m_errorMonitor->VerifyFound();
18121
18122 // Next, query a queue family index that's too large:
18123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18124 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18125 pass = (err != VK_SUCCESS);
18126 ASSERT_TRUE(pass);
18127 m_errorMonitor->VerifyFound();
18128
18129 // Finally, do so correctly:
18130 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18131 // SUPPORTED
18132 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18133 pass = (err == VK_SUCCESS);
18134 ASSERT_TRUE(pass);
18135
18136 // Before proceeding, try to create a swapchain without having called
18137 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18138 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18139 swapchain_create_info.pNext = NULL;
18140 swapchain_create_info.flags = 0;
18141 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18142 swapchain_create_info.surface = surface;
18143 swapchain_create_info.imageArrayLayers = 1;
18144 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18145 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18147 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18148 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18149 pass = (err != VK_SUCCESS);
18150 ASSERT_TRUE(pass);
18151 m_errorMonitor->VerifyFound();
18152
18153 // Get the surface capabilities:
18154 VkSurfaceCapabilitiesKHR surface_capabilities;
18155
18156 // Do so correctly (only error logged by this entrypoint is if the
18157 // extension isn't enabled):
18158 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18159 pass = (err == VK_SUCCESS);
18160 ASSERT_TRUE(pass);
18161
18162 // Get the surface formats:
18163 uint32_t surface_format_count;
18164
18165 // First, try without a pointer to surface_format_count:
18166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18167 "specified as NULL");
18168 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18169 pass = (err == VK_SUCCESS);
18170 ASSERT_TRUE(pass);
18171 m_errorMonitor->VerifyFound();
18172
18173 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18174 // correctly done a 1st try (to get the count):
18175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18176 surface_format_count = 0;
18177 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18178 pass = (err == VK_SUCCESS);
18179 ASSERT_TRUE(pass);
18180 m_errorMonitor->VerifyFound();
18181
18182 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18183 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18184 pass = (err == VK_SUCCESS);
18185 ASSERT_TRUE(pass);
18186
18187 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18188 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18189
18190 // Next, do a 2nd try with surface_format_count being set too high:
18191 surface_format_count += 5;
18192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18193 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18194 pass = (err == VK_SUCCESS);
18195 ASSERT_TRUE(pass);
18196 m_errorMonitor->VerifyFound();
18197
18198 // Finally, do a correct 1st and 2nd try:
18199 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18200 pass = (err == VK_SUCCESS);
18201 ASSERT_TRUE(pass);
18202 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18203 pass = (err == VK_SUCCESS);
18204 ASSERT_TRUE(pass);
18205
18206 // Get the surface present modes:
18207 uint32_t surface_present_mode_count;
18208
18209 // First, try without a pointer to surface_format_count:
18210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18211 "specified as NULL");
18212
18213 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18214 pass = (err == VK_SUCCESS);
18215 ASSERT_TRUE(pass);
18216 m_errorMonitor->VerifyFound();
18217
18218 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18219 // correctly done a 1st try (to get the count):
18220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18221 surface_present_mode_count = 0;
18222 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18223 (VkPresentModeKHR *)&surface_present_mode_count);
18224 pass = (err == VK_SUCCESS);
18225 ASSERT_TRUE(pass);
18226 m_errorMonitor->VerifyFound();
18227
18228 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18229 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18230 pass = (err == VK_SUCCESS);
18231 ASSERT_TRUE(pass);
18232
18233 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18234 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18235
18236 // Next, do a 2nd try with surface_format_count being set too high:
18237 surface_present_mode_count += 5;
18238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18239 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18240 pass = (err == VK_SUCCESS);
18241 ASSERT_TRUE(pass);
18242 m_errorMonitor->VerifyFound();
18243
18244 // Finally, do a correct 1st and 2nd try:
18245 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18246 pass = (err == VK_SUCCESS);
18247 ASSERT_TRUE(pass);
18248 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18249 pass = (err == VK_SUCCESS);
18250 ASSERT_TRUE(pass);
18251
18252 // Create a swapchain:
18253
18254 // First, try without a pointer to swapchain_create_info:
18255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18256 "specified as NULL");
18257
18258 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18259 pass = (err != VK_SUCCESS);
18260 ASSERT_TRUE(pass);
18261 m_errorMonitor->VerifyFound();
18262
18263 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18264 // sType:
18265 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18267
18268 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18269 pass = (err != VK_SUCCESS);
18270 ASSERT_TRUE(pass);
18271 m_errorMonitor->VerifyFound();
18272
18273 // Next, call with a NULL swapchain pointer:
18274 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18275 swapchain_create_info.pNext = NULL;
18276 swapchain_create_info.flags = 0;
18277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18278 "specified as NULL");
18279
18280 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18281 pass = (err != VK_SUCCESS);
18282 ASSERT_TRUE(pass);
18283 m_errorMonitor->VerifyFound();
18284
18285 // TODO: Enhance swapchain layer so that
18286 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18287
18288 // Next, call with a queue family index that's too large:
18289 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18290 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18291 swapchain_create_info.queueFamilyIndexCount = 2;
18292 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18294 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18295 pass = (err != VK_SUCCESS);
18296 ASSERT_TRUE(pass);
18297 m_errorMonitor->VerifyFound();
18298
18299 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18300 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18301 swapchain_create_info.queueFamilyIndexCount = 1;
18302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18303 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18304 "pCreateInfo->pQueueFamilyIndices).");
18305 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18306 pass = (err != VK_SUCCESS);
18307 ASSERT_TRUE(pass);
18308 m_errorMonitor->VerifyFound();
18309
18310 // Next, call with an invalid imageSharingMode:
18311 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18312 swapchain_create_info.queueFamilyIndexCount = 1;
18313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18314 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18315 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18316 pass = (err != VK_SUCCESS);
18317 ASSERT_TRUE(pass);
18318 m_errorMonitor->VerifyFound();
18319 // Fix for the future:
18320 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18321 // SUPPORTED
18322 swapchain_create_info.queueFamilyIndexCount = 0;
18323 queueFamilyIndex[0] = 0;
18324 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18325
18326 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18327 // Get the images from a swapchain:
18328 // Acquire an image from a swapchain:
18329 // Present an image to a swapchain:
18330 // Destroy the swapchain:
18331
18332 // TODOs:
18333 //
18334 // - Try destroying the device without first destroying the swapchain
18335 //
18336 // - Try destroying the device without first destroying the surface
18337 //
18338 // - Try destroying the surface without first destroying the swapchain
18339
18340 // Destroy the surface:
18341 vkDestroySurfaceKHR(instance(), surface, NULL);
18342
18343 // Tear down the window:
18344 xcb_destroy_window(connection, xcb_window);
18345 xcb_disconnect(connection);
18346
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018347#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018348 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018349#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018350}
Chris Forbes09368e42016-10-13 11:59:22 +130018351#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018352
18353//
18354// POSITIVE VALIDATION TESTS
18355//
18356// These tests do not expect to encounter ANY validation errors pass only if this is true
18357
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018358TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18359 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018360 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18362
18363 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18364 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018365 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018366 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18367 command_buffer_allocate_info.commandBufferCount = 1;
18368
18369 VkCommandBuffer secondary_command_buffer;
18370 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18371 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18372 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18373 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18374 command_buffer_inheritance_info.renderPass = m_renderPass;
18375 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18376
18377 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18378 command_buffer_begin_info.flags =
18379 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18380 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18381
18382 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18383 VkClearAttachment color_attachment;
18384 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18385 color_attachment.clearValue.color.float32[0] = 0;
18386 color_attachment.clearValue.color.float32[1] = 0;
18387 color_attachment.clearValue.color.float32[2] = 0;
18388 color_attachment.clearValue.color.float32[3] = 0;
18389 color_attachment.colorAttachment = 0;
18390 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18391 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18392}
18393
Tobin Ehlise0006882016-11-03 10:14:28 -060018394TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018395 TEST_DESCRIPTION(
18396 "Perform an image layout transition in a secondary command buffer followed "
18397 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018398 VkResult err;
18399 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018400 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018401 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018402 if (!depth_format) {
18403 return;
18404 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18406 // Allocate a secondary and primary cmd buffer
18407 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18408 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018409 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018410 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18411 command_buffer_allocate_info.commandBufferCount = 1;
18412
18413 VkCommandBuffer secondary_command_buffer;
18414 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18415 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18416 VkCommandBuffer primary_command_buffer;
18417 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18418 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18419 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18420 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18421 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18422 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18423 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18424
18425 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18426 ASSERT_VK_SUCCESS(err);
18427 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018428 image.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlise0006882016-11-03 10:14:28 -060018429 ASSERT_TRUE(image.initialized());
18430 VkImageMemoryBarrier img_barrier = {};
18431 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18432 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18433 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18434 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18435 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18436 img_barrier.image = image.handle();
18437 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18438 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18439 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18440 img_barrier.subresourceRange.baseArrayLayer = 0;
18441 img_barrier.subresourceRange.baseMipLevel = 0;
18442 img_barrier.subresourceRange.layerCount = 1;
18443 img_barrier.subresourceRange.levelCount = 1;
18444 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18445 0, nullptr, 1, &img_barrier);
18446 err = vkEndCommandBuffer(secondary_command_buffer);
18447 ASSERT_VK_SUCCESS(err);
18448
18449 // Now update primary cmd buffer to execute secondary and transitions image
18450 command_buffer_begin_info.pInheritanceInfo = nullptr;
18451 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18452 ASSERT_VK_SUCCESS(err);
18453 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18454 VkImageMemoryBarrier img_barrier2 = {};
18455 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18456 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18457 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18458 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18459 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18460 img_barrier2.image = image.handle();
18461 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18462 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18463 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18464 img_barrier2.subresourceRange.baseArrayLayer = 0;
18465 img_barrier2.subresourceRange.baseMipLevel = 0;
18466 img_barrier2.subresourceRange.layerCount = 1;
18467 img_barrier2.subresourceRange.levelCount = 1;
18468 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18469 nullptr, 1, &img_barrier2);
18470 err = vkEndCommandBuffer(primary_command_buffer);
18471 ASSERT_VK_SUCCESS(err);
18472 VkSubmitInfo submit_info = {};
18473 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18474 submit_info.commandBufferCount = 1;
18475 submit_info.pCommandBuffers = &primary_command_buffer;
18476 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18477 ASSERT_VK_SUCCESS(err);
18478 m_errorMonitor->VerifyNotFound();
18479 err = vkDeviceWaitIdle(m_device->device());
18480 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018481 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18482 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018483}
18484
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018485// This is a positive test. No failures are expected.
18486TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018487 TEST_DESCRIPTION(
18488 "Ensure that the vkUpdateDescriptorSets validation code "
18489 "is ignoring VkWriteDescriptorSet members that are not "
18490 "related to the descriptor type specified by "
18491 "VkWriteDescriptorSet::descriptorType. Correct "
18492 "validation behavior will result in the test running to "
18493 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018494
18495 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18496
Tony Barbour1fa09702017-03-16 12:09:08 -060018497 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018498
18499 // Image Case
18500 {
18501 m_errorMonitor->ExpectSuccess();
18502
18503 VkImage image;
18504 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18505 const int32_t tex_width = 32;
18506 const int32_t tex_height = 32;
18507 VkImageCreateInfo image_create_info = {};
18508 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18509 image_create_info.pNext = NULL;
18510 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18511 image_create_info.format = tex_format;
18512 image_create_info.extent.width = tex_width;
18513 image_create_info.extent.height = tex_height;
18514 image_create_info.extent.depth = 1;
18515 image_create_info.mipLevels = 1;
18516 image_create_info.arrayLayers = 1;
18517 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18518 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18519 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18520 image_create_info.flags = 0;
18521 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18522 ASSERT_VK_SUCCESS(err);
18523
18524 VkMemoryRequirements memory_reqs;
18525 VkDeviceMemory image_memory;
18526 bool pass;
18527 VkMemoryAllocateInfo memory_info = {};
18528 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18529 memory_info.pNext = NULL;
18530 memory_info.allocationSize = 0;
18531 memory_info.memoryTypeIndex = 0;
18532 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18533 memory_info.allocationSize = memory_reqs.size;
18534 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18535 ASSERT_TRUE(pass);
18536 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18537 ASSERT_VK_SUCCESS(err);
18538 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18539 ASSERT_VK_SUCCESS(err);
18540
18541 VkImageViewCreateInfo image_view_create_info = {};
18542 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18543 image_view_create_info.image = image;
18544 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18545 image_view_create_info.format = tex_format;
18546 image_view_create_info.subresourceRange.layerCount = 1;
18547 image_view_create_info.subresourceRange.baseMipLevel = 0;
18548 image_view_create_info.subresourceRange.levelCount = 1;
18549 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18550
18551 VkImageView view;
18552 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18553 ASSERT_VK_SUCCESS(err);
18554
18555 VkDescriptorPoolSize ds_type_count = {};
18556 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18557 ds_type_count.descriptorCount = 1;
18558
18559 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18560 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18561 ds_pool_ci.pNext = NULL;
18562 ds_pool_ci.maxSets = 1;
18563 ds_pool_ci.poolSizeCount = 1;
18564 ds_pool_ci.pPoolSizes = &ds_type_count;
18565
18566 VkDescriptorPool ds_pool;
18567 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18568 ASSERT_VK_SUCCESS(err);
18569
18570 VkDescriptorSetLayoutBinding dsl_binding = {};
18571 dsl_binding.binding = 0;
18572 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18573 dsl_binding.descriptorCount = 1;
18574 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18575 dsl_binding.pImmutableSamplers = NULL;
18576
18577 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18578 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18579 ds_layout_ci.pNext = NULL;
18580 ds_layout_ci.bindingCount = 1;
18581 ds_layout_ci.pBindings = &dsl_binding;
18582 VkDescriptorSetLayout ds_layout;
18583 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18584 ASSERT_VK_SUCCESS(err);
18585
18586 VkDescriptorSet descriptor_set;
18587 VkDescriptorSetAllocateInfo alloc_info = {};
18588 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18589 alloc_info.descriptorSetCount = 1;
18590 alloc_info.descriptorPool = ds_pool;
18591 alloc_info.pSetLayouts = &ds_layout;
18592 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18593 ASSERT_VK_SUCCESS(err);
18594
18595 VkDescriptorImageInfo image_info = {};
18596 image_info.imageView = view;
18597 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18598
18599 VkWriteDescriptorSet descriptor_write;
18600 memset(&descriptor_write, 0, sizeof(descriptor_write));
18601 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18602 descriptor_write.dstSet = descriptor_set;
18603 descriptor_write.dstBinding = 0;
18604 descriptor_write.descriptorCount = 1;
18605 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18606 descriptor_write.pImageInfo = &image_info;
18607
18608 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18609 // be
18610 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18611 // This will most likely produce a crash if the parameter_validation
18612 // layer
18613 // does not correctly ignore pBufferInfo.
18614 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18615 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18616
18617 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18618
18619 m_errorMonitor->VerifyNotFound();
18620
18621 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18622 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18623 vkDestroyImageView(m_device->device(), view, NULL);
18624 vkDestroyImage(m_device->device(), image, NULL);
18625 vkFreeMemory(m_device->device(), image_memory, NULL);
18626 }
18627
18628 // Buffer Case
18629 {
18630 m_errorMonitor->ExpectSuccess();
18631
18632 VkBuffer buffer;
18633 uint32_t queue_family_index = 0;
18634 VkBufferCreateInfo buffer_create_info = {};
18635 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18636 buffer_create_info.size = 1024;
18637 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18638 buffer_create_info.queueFamilyIndexCount = 1;
18639 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18640
18641 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18642 ASSERT_VK_SUCCESS(err);
18643
18644 VkMemoryRequirements memory_reqs;
18645 VkDeviceMemory buffer_memory;
18646 bool pass;
18647 VkMemoryAllocateInfo memory_info = {};
18648 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18649 memory_info.pNext = NULL;
18650 memory_info.allocationSize = 0;
18651 memory_info.memoryTypeIndex = 0;
18652
18653 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18654 memory_info.allocationSize = memory_reqs.size;
18655 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18656 ASSERT_TRUE(pass);
18657
18658 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18659 ASSERT_VK_SUCCESS(err);
18660 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18661 ASSERT_VK_SUCCESS(err);
18662
18663 VkDescriptorPoolSize ds_type_count = {};
18664 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18665 ds_type_count.descriptorCount = 1;
18666
18667 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18668 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18669 ds_pool_ci.pNext = NULL;
18670 ds_pool_ci.maxSets = 1;
18671 ds_pool_ci.poolSizeCount = 1;
18672 ds_pool_ci.pPoolSizes = &ds_type_count;
18673
18674 VkDescriptorPool ds_pool;
18675 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18676 ASSERT_VK_SUCCESS(err);
18677
18678 VkDescriptorSetLayoutBinding dsl_binding = {};
18679 dsl_binding.binding = 0;
18680 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18681 dsl_binding.descriptorCount = 1;
18682 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18683 dsl_binding.pImmutableSamplers = NULL;
18684
18685 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18686 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18687 ds_layout_ci.pNext = NULL;
18688 ds_layout_ci.bindingCount = 1;
18689 ds_layout_ci.pBindings = &dsl_binding;
18690 VkDescriptorSetLayout ds_layout;
18691 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18692 ASSERT_VK_SUCCESS(err);
18693
18694 VkDescriptorSet descriptor_set;
18695 VkDescriptorSetAllocateInfo alloc_info = {};
18696 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18697 alloc_info.descriptorSetCount = 1;
18698 alloc_info.descriptorPool = ds_pool;
18699 alloc_info.pSetLayouts = &ds_layout;
18700 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18701 ASSERT_VK_SUCCESS(err);
18702
18703 VkDescriptorBufferInfo buffer_info = {};
18704 buffer_info.buffer = buffer;
18705 buffer_info.offset = 0;
18706 buffer_info.range = 1024;
18707
18708 VkWriteDescriptorSet descriptor_write;
18709 memset(&descriptor_write, 0, sizeof(descriptor_write));
18710 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18711 descriptor_write.dstSet = descriptor_set;
18712 descriptor_write.dstBinding = 0;
18713 descriptor_write.descriptorCount = 1;
18714 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18715 descriptor_write.pBufferInfo = &buffer_info;
18716
18717 // Set pImageInfo and pTexelBufferView to invalid values, which should
18718 // be
18719 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18720 // This will most likely produce a crash if the parameter_validation
18721 // layer
18722 // does not correctly ignore pImageInfo.
18723 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18724 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18725
18726 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18727
18728 m_errorMonitor->VerifyNotFound();
18729
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018730 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18731 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18732 vkDestroyBuffer(m_device->device(), buffer, NULL);
18733 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18734 }
18735
18736 // Texel Buffer Case
18737 {
18738 m_errorMonitor->ExpectSuccess();
18739
18740 VkBuffer buffer;
18741 uint32_t queue_family_index = 0;
18742 VkBufferCreateInfo buffer_create_info = {};
18743 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18744 buffer_create_info.size = 1024;
18745 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18746 buffer_create_info.queueFamilyIndexCount = 1;
18747 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18748
18749 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18750 ASSERT_VK_SUCCESS(err);
18751
18752 VkMemoryRequirements memory_reqs;
18753 VkDeviceMemory buffer_memory;
18754 bool pass;
18755 VkMemoryAllocateInfo memory_info = {};
18756 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18757 memory_info.pNext = NULL;
18758 memory_info.allocationSize = 0;
18759 memory_info.memoryTypeIndex = 0;
18760
18761 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18762 memory_info.allocationSize = memory_reqs.size;
18763 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18764 ASSERT_TRUE(pass);
18765
18766 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18767 ASSERT_VK_SUCCESS(err);
18768 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18769 ASSERT_VK_SUCCESS(err);
18770
18771 VkBufferViewCreateInfo buff_view_ci = {};
18772 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18773 buff_view_ci.buffer = buffer;
18774 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18775 buff_view_ci.range = VK_WHOLE_SIZE;
18776 VkBufferView buffer_view;
18777 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18778
18779 VkDescriptorPoolSize ds_type_count = {};
18780 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18781 ds_type_count.descriptorCount = 1;
18782
18783 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18784 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18785 ds_pool_ci.pNext = NULL;
18786 ds_pool_ci.maxSets = 1;
18787 ds_pool_ci.poolSizeCount = 1;
18788 ds_pool_ci.pPoolSizes = &ds_type_count;
18789
18790 VkDescriptorPool ds_pool;
18791 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18792 ASSERT_VK_SUCCESS(err);
18793
18794 VkDescriptorSetLayoutBinding dsl_binding = {};
18795 dsl_binding.binding = 0;
18796 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18797 dsl_binding.descriptorCount = 1;
18798 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18799 dsl_binding.pImmutableSamplers = NULL;
18800
18801 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18802 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18803 ds_layout_ci.pNext = NULL;
18804 ds_layout_ci.bindingCount = 1;
18805 ds_layout_ci.pBindings = &dsl_binding;
18806 VkDescriptorSetLayout ds_layout;
18807 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18808 ASSERT_VK_SUCCESS(err);
18809
18810 VkDescriptorSet descriptor_set;
18811 VkDescriptorSetAllocateInfo alloc_info = {};
18812 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18813 alloc_info.descriptorSetCount = 1;
18814 alloc_info.descriptorPool = ds_pool;
18815 alloc_info.pSetLayouts = &ds_layout;
18816 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18817 ASSERT_VK_SUCCESS(err);
18818
18819 VkWriteDescriptorSet descriptor_write;
18820 memset(&descriptor_write, 0, sizeof(descriptor_write));
18821 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18822 descriptor_write.dstSet = descriptor_set;
18823 descriptor_write.dstBinding = 0;
18824 descriptor_write.descriptorCount = 1;
18825 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18826 descriptor_write.pTexelBufferView = &buffer_view;
18827
18828 // Set pImageInfo and pBufferInfo to invalid values, which should be
18829 // ignored for descriptorType ==
18830 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18831 // This will most likely produce a crash if the parameter_validation
18832 // layer
18833 // does not correctly ignore pImageInfo and pBufferInfo.
18834 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18835 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18836
18837 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18838
18839 m_errorMonitor->VerifyNotFound();
18840
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018841 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18842 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18843 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18844 vkDestroyBuffer(m_device->device(), buffer, NULL);
18845 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18846 }
18847}
18848
Tobin Ehlisf7428442016-10-25 07:58:24 -060018849TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18850 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18851
Tony Barbour1fa09702017-03-16 12:09:08 -060018852 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018853 // Create layout where two binding #s are "1"
18854 static const uint32_t NUM_BINDINGS = 3;
18855 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18856 dsl_binding[0].binding = 1;
18857 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18858 dsl_binding[0].descriptorCount = 1;
18859 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18860 dsl_binding[0].pImmutableSamplers = NULL;
18861 dsl_binding[1].binding = 0;
18862 dsl_binding[1].descriptorCount = 1;
18863 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18864 dsl_binding[1].descriptorCount = 1;
18865 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18866 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018867 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018868 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18869 dsl_binding[2].descriptorCount = 1;
18870 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18871 dsl_binding[2].pImmutableSamplers = NULL;
18872
18873 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18874 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18875 ds_layout_ci.pNext = NULL;
18876 ds_layout_ci.bindingCount = NUM_BINDINGS;
18877 ds_layout_ci.pBindings = dsl_binding;
18878 VkDescriptorSetLayout ds_layout;
18879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18880 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18881 m_errorMonitor->VerifyFound();
18882}
18883
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018884TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018885 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18886
Tony Barbour1fa09702017-03-16 12:09:08 -060018887 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018888
Tony Barbour552f6c02016-12-21 14:34:07 -070018889 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018890
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018891 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18892
18893 {
18894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18895 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18896 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18897 m_errorMonitor->VerifyFound();
18898 }
18899
18900 {
18901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18902 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18903 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18904 m_errorMonitor->VerifyFound();
18905 }
18906
18907 {
18908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18909 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18910 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18911 m_errorMonitor->VerifyFound();
18912 }
18913
18914 {
18915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18916 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18917 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18918 m_errorMonitor->VerifyFound();
18919 }
18920
18921 {
18922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18923 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18924 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18925 m_errorMonitor->VerifyFound();
18926 }
18927
18928 {
18929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18930 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18931 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18932 m_errorMonitor->VerifyFound();
18933 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018934
18935 {
18936 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18937 VkRect2D scissor = {{-1, 0}, {16, 16}};
18938 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18939 m_errorMonitor->VerifyFound();
18940 }
18941
18942 {
18943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18944 VkRect2D scissor = {{0, -2}, {16, 16}};
18945 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18946 m_errorMonitor->VerifyFound();
18947 }
18948
18949 {
18950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18951 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18952 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18953 m_errorMonitor->VerifyFound();
18954 }
18955
18956 {
18957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18958 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18959 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18960 m_errorMonitor->VerifyFound();
18961 }
18962
Tony Barbour552f6c02016-12-21 14:34:07 -070018963 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018964}
18965
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018966// This is a positive test. No failures are expected.
18967TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18968 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18969 VkResult err;
18970
Tony Barbour1fa09702017-03-16 12:09:08 -060018971 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018972 m_errorMonitor->ExpectSuccess();
18973 VkDescriptorPoolSize ds_type_count = {};
18974 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18975 ds_type_count.descriptorCount = 2;
18976
18977 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18978 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18979 ds_pool_ci.pNext = NULL;
18980 ds_pool_ci.maxSets = 1;
18981 ds_pool_ci.poolSizeCount = 1;
18982 ds_pool_ci.pPoolSizes = &ds_type_count;
18983
18984 VkDescriptorPool ds_pool;
18985 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18986 ASSERT_VK_SUCCESS(err);
18987
18988 // Create layout with two uniform buffer descriptors w/ empty binding between them
18989 static const uint32_t NUM_BINDINGS = 3;
18990 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18991 dsl_binding[0].binding = 0;
18992 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18993 dsl_binding[0].descriptorCount = 1;
18994 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18995 dsl_binding[0].pImmutableSamplers = NULL;
18996 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018997 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018998 dsl_binding[2].binding = 2;
18999 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19000 dsl_binding[2].descriptorCount = 1;
19001 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19002 dsl_binding[2].pImmutableSamplers = NULL;
19003
19004 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19005 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19006 ds_layout_ci.pNext = NULL;
19007 ds_layout_ci.bindingCount = NUM_BINDINGS;
19008 ds_layout_ci.pBindings = dsl_binding;
19009 VkDescriptorSetLayout ds_layout;
19010 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19011 ASSERT_VK_SUCCESS(err);
19012
19013 VkDescriptorSet descriptor_set = {};
19014 VkDescriptorSetAllocateInfo alloc_info = {};
19015 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19016 alloc_info.descriptorSetCount = 1;
19017 alloc_info.descriptorPool = ds_pool;
19018 alloc_info.pSetLayouts = &ds_layout;
19019 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19020 ASSERT_VK_SUCCESS(err);
19021
19022 // Create a buffer to be used for update
19023 VkBufferCreateInfo buff_ci = {};
19024 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19025 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19026 buff_ci.size = 256;
19027 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19028 VkBuffer buffer;
19029 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19030 ASSERT_VK_SUCCESS(err);
19031 // Have to bind memory to buffer before descriptor update
19032 VkMemoryAllocateInfo mem_alloc = {};
19033 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19034 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019035 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019036 mem_alloc.memoryTypeIndex = 0;
19037
19038 VkMemoryRequirements mem_reqs;
19039 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19040 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19041 if (!pass) {
19042 vkDestroyBuffer(m_device->device(), buffer, NULL);
19043 return;
19044 }
19045
19046 VkDeviceMemory mem;
19047 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19048 ASSERT_VK_SUCCESS(err);
19049 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19050 ASSERT_VK_SUCCESS(err);
19051
19052 // Only update the descriptor at binding 2
19053 VkDescriptorBufferInfo buff_info = {};
19054 buff_info.buffer = buffer;
19055 buff_info.offset = 0;
19056 buff_info.range = VK_WHOLE_SIZE;
19057 VkWriteDescriptorSet descriptor_write = {};
19058 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19059 descriptor_write.dstBinding = 2;
19060 descriptor_write.descriptorCount = 1;
19061 descriptor_write.pTexelBufferView = nullptr;
19062 descriptor_write.pBufferInfo = &buff_info;
19063 descriptor_write.pImageInfo = nullptr;
19064 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19065 descriptor_write.dstSet = descriptor_set;
19066
19067 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19068
19069 m_errorMonitor->VerifyNotFound();
19070 // Cleanup
19071 vkFreeMemory(m_device->device(), mem, NULL);
19072 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19073 vkDestroyBuffer(m_device->device(), buffer, NULL);
19074 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19075}
19076
19077// This is a positive test. No failures are expected.
19078TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19079 VkResult err;
19080 bool pass;
19081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019082 TEST_DESCRIPTION(
19083 "Create a buffer, allocate memory, bind memory, destroy "
19084 "the buffer, create an image, and bind the same memory to "
19085 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019086
19087 m_errorMonitor->ExpectSuccess();
19088
Tony Barbour1fa09702017-03-16 12:09:08 -060019089 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019090
19091 VkBuffer buffer;
19092 VkImage image;
19093 VkDeviceMemory mem;
19094 VkMemoryRequirements mem_reqs;
19095
19096 VkBufferCreateInfo buf_info = {};
19097 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19098 buf_info.pNext = NULL;
19099 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19100 buf_info.size = 256;
19101 buf_info.queueFamilyIndexCount = 0;
19102 buf_info.pQueueFamilyIndices = NULL;
19103 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19104 buf_info.flags = 0;
19105 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19106 ASSERT_VK_SUCCESS(err);
19107
19108 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19109
19110 VkMemoryAllocateInfo alloc_info = {};
19111 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19112 alloc_info.pNext = NULL;
19113 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019114
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019115 // Ensure memory is big enough for both bindings
19116 alloc_info.allocationSize = 0x10000;
19117
19118 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19119 if (!pass) {
19120 vkDestroyBuffer(m_device->device(), buffer, NULL);
19121 return;
19122 }
19123
19124 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19125 ASSERT_VK_SUCCESS(err);
19126
19127 uint8_t *pData;
19128 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19129 ASSERT_VK_SUCCESS(err);
19130
19131 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19132
19133 vkUnmapMemory(m_device->device(), mem);
19134
19135 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19136 ASSERT_VK_SUCCESS(err);
19137
19138 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19139 // memory. In fact, it was never used by the GPU.
19140 // Just be be sure, wait for idle.
19141 vkDestroyBuffer(m_device->device(), buffer, NULL);
19142 vkDeviceWaitIdle(m_device->device());
19143
Tobin Ehlis6a005702016-12-28 15:25:56 -070019144 // Use optimal as some platforms report linear support but then fail image creation
19145 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19146 VkImageFormatProperties image_format_properties;
19147 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19148 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19149 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019150 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019151 vkFreeMemory(m_device->device(), mem, NULL);
19152 return;
19153 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019154 VkImageCreateInfo image_create_info = {};
19155 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19156 image_create_info.pNext = NULL;
19157 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19158 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19159 image_create_info.extent.width = 64;
19160 image_create_info.extent.height = 64;
19161 image_create_info.extent.depth = 1;
19162 image_create_info.mipLevels = 1;
19163 image_create_info.arrayLayers = 1;
19164 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019165 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019166 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19167 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19168 image_create_info.queueFamilyIndexCount = 0;
19169 image_create_info.pQueueFamilyIndices = NULL;
19170 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19171 image_create_info.flags = 0;
19172
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019173 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019174 * to be textures or it will be the staging image if they are not.
19175 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019176 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19177 ASSERT_VK_SUCCESS(err);
19178
19179 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19180
Tobin Ehlis6a005702016-12-28 15:25:56 -070019181 VkMemoryAllocateInfo mem_alloc = {};
19182 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19183 mem_alloc.pNext = NULL;
19184 mem_alloc.allocationSize = 0;
19185 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019186 mem_alloc.allocationSize = mem_reqs.size;
19187
19188 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19189 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019190 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019191 vkDestroyImage(m_device->device(), image, NULL);
19192 return;
19193 }
19194
19195 // VALIDATION FAILURE:
19196 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19197 ASSERT_VK_SUCCESS(err);
19198
19199 m_errorMonitor->VerifyNotFound();
19200
19201 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019202 vkDestroyImage(m_device->device(), image, NULL);
19203}
19204
Tony Barbourab713912017-02-02 14:17:35 -070019205// This is a positive test. No failures are expected.
19206TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19207 VkResult err;
19208
19209 TEST_DESCRIPTION(
19210 "Call all applicable destroy and free routines with NULL"
19211 "handles, expecting no validation errors");
19212
19213 m_errorMonitor->ExpectSuccess();
19214
Tony Barbour1fa09702017-03-16 12:09:08 -060019215 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019216 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19217 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19218 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19219 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19220 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19221 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19222 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19223 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19224 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19225 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19226 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19227 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19228 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19229 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19230 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19231 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19232 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19233 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19234 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19235 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19236
19237 VkCommandPool command_pool;
19238 VkCommandPoolCreateInfo pool_create_info{};
19239 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19240 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19241 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19242 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19243 VkCommandBuffer command_buffers[3] = {};
19244 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19245 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19246 command_buffer_allocate_info.commandPool = command_pool;
19247 command_buffer_allocate_info.commandBufferCount = 1;
19248 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19249 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19250 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19251 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19252
19253 VkDescriptorPoolSize ds_type_count = {};
19254 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19255 ds_type_count.descriptorCount = 1;
19256
19257 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19258 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19259 ds_pool_ci.pNext = NULL;
19260 ds_pool_ci.maxSets = 1;
19261 ds_pool_ci.poolSizeCount = 1;
19262 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19263 ds_pool_ci.pPoolSizes = &ds_type_count;
19264
19265 VkDescriptorPool ds_pool;
19266 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19267 ASSERT_VK_SUCCESS(err);
19268
19269 VkDescriptorSetLayoutBinding dsl_binding = {};
19270 dsl_binding.binding = 2;
19271 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19272 dsl_binding.descriptorCount = 1;
19273 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19274 dsl_binding.pImmutableSamplers = NULL;
19275 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19276 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19277 ds_layout_ci.pNext = NULL;
19278 ds_layout_ci.bindingCount = 1;
19279 ds_layout_ci.pBindings = &dsl_binding;
19280 VkDescriptorSetLayout ds_layout;
19281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19282 ASSERT_VK_SUCCESS(err);
19283
19284 VkDescriptorSet descriptor_sets[3] = {};
19285 VkDescriptorSetAllocateInfo alloc_info = {};
19286 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19287 alloc_info.descriptorSetCount = 1;
19288 alloc_info.descriptorPool = ds_pool;
19289 alloc_info.pSetLayouts = &ds_layout;
19290 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19291 ASSERT_VK_SUCCESS(err);
19292 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19293 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19294 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19295
19296 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19297
19298 m_errorMonitor->VerifyNotFound();
19299}
19300
Tony Barbour626994c2017-02-08 15:29:37 -070019301TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019302 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019303
19304 m_errorMonitor->ExpectSuccess();
19305
Tony Barbour1fa09702017-03-16 12:09:08 -060019306 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019307 VkCommandBuffer cmd_bufs[4];
19308 VkCommandBufferAllocateInfo alloc_info;
19309 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19310 alloc_info.pNext = NULL;
19311 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019312 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019313 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19314 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19315 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019316 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019317 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19318 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019319 ASSERT_TRUE(image.initialized());
19320 VkCommandBufferBeginInfo cb_binfo;
19321 cb_binfo.pNext = NULL;
19322 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19323 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19324 cb_binfo.flags = 0;
19325 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19326 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19327 VkImageMemoryBarrier img_barrier = {};
19328 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19329 img_barrier.pNext = NULL;
19330 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19331 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19332 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19333 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19334 img_barrier.image = image.handle();
19335 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19336 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19337 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19338 img_barrier.subresourceRange.baseArrayLayer = 0;
19339 img_barrier.subresourceRange.baseMipLevel = 0;
19340 img_barrier.subresourceRange.layerCount = 1;
19341 img_barrier.subresourceRange.levelCount = 1;
19342 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19343 &img_barrier);
19344 vkEndCommandBuffer(cmd_bufs[0]);
19345 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19346 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19347 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19348 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19349 &img_barrier);
19350 vkEndCommandBuffer(cmd_bufs[1]);
19351 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19352 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19353 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19354 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19355 &img_barrier);
19356 vkEndCommandBuffer(cmd_bufs[2]);
19357 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19358 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19359 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19360 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19361 &img_barrier);
19362 vkEndCommandBuffer(cmd_bufs[3]);
19363
19364 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19365 VkSemaphore semaphore1, semaphore2;
19366 VkSemaphoreCreateInfo semaphore_create_info{};
19367 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19368 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19369 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19370 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19371 VkSubmitInfo submit_info[3];
19372 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19373 submit_info[0].pNext = nullptr;
19374 submit_info[0].commandBufferCount = 1;
19375 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19376 submit_info[0].signalSemaphoreCount = 1;
19377 submit_info[0].pSignalSemaphores = &semaphore1;
19378 submit_info[0].waitSemaphoreCount = 0;
19379 submit_info[0].pWaitDstStageMask = nullptr;
19380 submit_info[0].pWaitDstStageMask = flags;
19381 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19382 submit_info[1].pNext = nullptr;
19383 submit_info[1].commandBufferCount = 1;
19384 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19385 submit_info[1].waitSemaphoreCount = 1;
19386 submit_info[1].pWaitSemaphores = &semaphore1;
19387 submit_info[1].signalSemaphoreCount = 1;
19388 submit_info[1].pSignalSemaphores = &semaphore2;
19389 submit_info[1].pWaitDstStageMask = flags;
19390 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19391 submit_info[2].pNext = nullptr;
19392 submit_info[2].commandBufferCount = 2;
19393 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19394 submit_info[2].waitSemaphoreCount = 1;
19395 submit_info[2].pWaitSemaphores = &semaphore2;
19396 submit_info[2].signalSemaphoreCount = 0;
19397 submit_info[2].pSignalSemaphores = nullptr;
19398 submit_info[2].pWaitDstStageMask = flags;
19399 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19400 vkQueueWaitIdle(m_device->m_queue);
19401
19402 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19403 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19404 m_errorMonitor->VerifyNotFound();
19405}
19406
Tobin Ehlis953e8392016-11-17 10:54:13 -070019407TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19408 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19409 // We previously had a bug where dynamic offset of inactive bindings was still being used
19410 VkResult err;
19411 m_errorMonitor->ExpectSuccess();
19412
Tony Barbour1fa09702017-03-16 12:09:08 -060019413 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019414 ASSERT_NO_FATAL_FAILURE(InitViewport());
19415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19416
19417 VkDescriptorPoolSize ds_type_count = {};
19418 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19419 ds_type_count.descriptorCount = 3;
19420
19421 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19422 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19423 ds_pool_ci.pNext = NULL;
19424 ds_pool_ci.maxSets = 1;
19425 ds_pool_ci.poolSizeCount = 1;
19426 ds_pool_ci.pPoolSizes = &ds_type_count;
19427
19428 VkDescriptorPool ds_pool;
19429 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19430 ASSERT_VK_SUCCESS(err);
19431
19432 const uint32_t BINDING_COUNT = 3;
19433 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019434 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019435 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19436 dsl_binding[0].descriptorCount = 1;
19437 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19438 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019439 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019440 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19441 dsl_binding[1].descriptorCount = 1;
19442 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19443 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019444 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019445 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19446 dsl_binding[2].descriptorCount = 1;
19447 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19448 dsl_binding[2].pImmutableSamplers = NULL;
19449
19450 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19451 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19452 ds_layout_ci.pNext = NULL;
19453 ds_layout_ci.bindingCount = BINDING_COUNT;
19454 ds_layout_ci.pBindings = dsl_binding;
19455 VkDescriptorSetLayout ds_layout;
19456 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19457 ASSERT_VK_SUCCESS(err);
19458
19459 VkDescriptorSet descriptor_set;
19460 VkDescriptorSetAllocateInfo alloc_info = {};
19461 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19462 alloc_info.descriptorSetCount = 1;
19463 alloc_info.descriptorPool = ds_pool;
19464 alloc_info.pSetLayouts = &ds_layout;
19465 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19466 ASSERT_VK_SUCCESS(err);
19467
19468 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19469 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19470 pipeline_layout_ci.pNext = NULL;
19471 pipeline_layout_ci.setLayoutCount = 1;
19472 pipeline_layout_ci.pSetLayouts = &ds_layout;
19473
19474 VkPipelineLayout pipeline_layout;
19475 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19476 ASSERT_VK_SUCCESS(err);
19477
19478 // Create two buffers to update the descriptors with
19479 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19480 uint32_t qfi = 0;
19481 VkBufferCreateInfo buffCI = {};
19482 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19483 buffCI.size = 2048;
19484 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19485 buffCI.queueFamilyIndexCount = 1;
19486 buffCI.pQueueFamilyIndices = &qfi;
19487
19488 VkBuffer dyub1;
19489 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19490 ASSERT_VK_SUCCESS(err);
19491 // buffer2
19492 buffCI.size = 1024;
19493 VkBuffer dyub2;
19494 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19495 ASSERT_VK_SUCCESS(err);
19496 // Allocate memory and bind to buffers
19497 VkMemoryAllocateInfo mem_alloc[2] = {};
19498 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19499 mem_alloc[0].pNext = NULL;
19500 mem_alloc[0].memoryTypeIndex = 0;
19501 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19502 mem_alloc[1].pNext = NULL;
19503 mem_alloc[1].memoryTypeIndex = 0;
19504
19505 VkMemoryRequirements mem_reqs1;
19506 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19507 VkMemoryRequirements mem_reqs2;
19508 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19509 mem_alloc[0].allocationSize = mem_reqs1.size;
19510 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19511 mem_alloc[1].allocationSize = mem_reqs2.size;
19512 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19513 if (!pass) {
19514 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19515 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19516 return;
19517 }
19518
19519 VkDeviceMemory mem1;
19520 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19521 ASSERT_VK_SUCCESS(err);
19522 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19523 ASSERT_VK_SUCCESS(err);
19524 VkDeviceMemory mem2;
19525 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19526 ASSERT_VK_SUCCESS(err);
19527 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19528 ASSERT_VK_SUCCESS(err);
19529 // Update descriptors
19530 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19531 buff_info[0].buffer = dyub1;
19532 buff_info[0].offset = 0;
19533 buff_info[0].range = 256;
19534 buff_info[1].buffer = dyub1;
19535 buff_info[1].offset = 256;
19536 buff_info[1].range = 512;
19537 buff_info[2].buffer = dyub2;
19538 buff_info[2].offset = 0;
19539 buff_info[2].range = 512;
19540
19541 VkWriteDescriptorSet descriptor_write;
19542 memset(&descriptor_write, 0, sizeof(descriptor_write));
19543 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19544 descriptor_write.dstSet = descriptor_set;
19545 descriptor_write.dstBinding = 0;
19546 descriptor_write.descriptorCount = BINDING_COUNT;
19547 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19548 descriptor_write.pBufferInfo = buff_info;
19549
19550 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19551
Tony Barbour552f6c02016-12-21 14:34:07 -070019552 m_commandBuffer->BeginCommandBuffer();
19553 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019554
19555 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019556 char const *vsSource =
19557 "#version 450\n"
19558 "\n"
19559 "out gl_PerVertex { \n"
19560 " vec4 gl_Position;\n"
19561 "};\n"
19562 "void main(){\n"
19563 " gl_Position = vec4(1);\n"
19564 "}\n";
19565 char const *fsSource =
19566 "#version 450\n"
19567 "\n"
19568 "layout(location=0) out vec4 x;\n"
19569 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19570 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19571 "void main(){\n"
19572 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19573 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019574 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19575 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19576 VkPipelineObj pipe(m_device);
19577 pipe.SetViewport(m_viewports);
19578 pipe.SetScissor(m_scissors);
19579 pipe.AddShader(&vs);
19580 pipe.AddShader(&fs);
19581 pipe.AddColorAttachment();
19582 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19583
19584 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19585 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19586 // we used to have a bug in this case.
19587 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19588 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19589 &descriptor_set, BINDING_COUNT, dyn_off);
19590 Draw(1, 0, 0, 0);
19591 m_errorMonitor->VerifyNotFound();
19592
19593 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19594 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19595 vkFreeMemory(m_device->device(), mem1, NULL);
19596 vkFreeMemory(m_device->device(), mem2, NULL);
19597
19598 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19599 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19600 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19601}
19602
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019603TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019604 TEST_DESCRIPTION(
19605 "Ensure that validations handling of non-coherent memory "
19606 "mapping while using VK_WHOLE_SIZE does not cause access "
19607 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019608 VkResult err;
19609 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019610 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019611
19612 VkDeviceMemory mem;
19613 VkMemoryRequirements mem_reqs;
19614 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019615 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019616 VkMemoryAllocateInfo alloc_info = {};
19617 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19618 alloc_info.pNext = NULL;
19619 alloc_info.memoryTypeIndex = 0;
19620
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019621 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019622 alloc_info.allocationSize = allocation_size;
19623
19624 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19625 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 -070019626 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019627 if (!pass) {
19628 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019629 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19630 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019631 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019632 pass = m_device->phy().set_memory_type(
19633 mem_reqs.memoryTypeBits, &alloc_info,
19634 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19635 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019636 if (!pass) {
19637 return;
19638 }
19639 }
19640 }
19641
19642 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19643 ASSERT_VK_SUCCESS(err);
19644
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019645 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019646 m_errorMonitor->ExpectSuccess();
19647 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19648 ASSERT_VK_SUCCESS(err);
19649 VkMappedMemoryRange mmr = {};
19650 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19651 mmr.memory = mem;
19652 mmr.offset = 0;
19653 mmr.size = VK_WHOLE_SIZE;
19654 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19655 ASSERT_VK_SUCCESS(err);
19656 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19657 ASSERT_VK_SUCCESS(err);
19658 m_errorMonitor->VerifyNotFound();
19659 vkUnmapMemory(m_device->device(), mem);
19660
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019661 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019662 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019663 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019664 ASSERT_VK_SUCCESS(err);
19665 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19666 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019667 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019668 mmr.size = VK_WHOLE_SIZE;
19669 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19670 ASSERT_VK_SUCCESS(err);
19671 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19672 ASSERT_VK_SUCCESS(err);
19673 m_errorMonitor->VerifyNotFound();
19674 vkUnmapMemory(m_device->device(), mem);
19675
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019676 // Map with offset and size
19677 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019678 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019679 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019680 ASSERT_VK_SUCCESS(err);
19681 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19682 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019683 mmr.offset = 4 * atom_size;
19684 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019685 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19686 ASSERT_VK_SUCCESS(err);
19687 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19688 ASSERT_VK_SUCCESS(err);
19689 m_errorMonitor->VerifyNotFound();
19690 vkUnmapMemory(m_device->device(), mem);
19691
19692 // Map without offset and flush WHOLE_SIZE with two separate offsets
19693 m_errorMonitor->ExpectSuccess();
19694 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19695 ASSERT_VK_SUCCESS(err);
19696 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19697 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019698 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019699 mmr.size = VK_WHOLE_SIZE;
19700 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19701 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019702 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019703 mmr.size = VK_WHOLE_SIZE;
19704 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19705 ASSERT_VK_SUCCESS(err);
19706 m_errorMonitor->VerifyNotFound();
19707 vkUnmapMemory(m_device->device(), mem);
19708
19709 vkFreeMemory(m_device->device(), mem, NULL);
19710}
19711
19712// This is a positive test. We used to expect error in this case but spec now allows it
19713TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19714 m_errorMonitor->ExpectSuccess();
19715 vk_testing::Fence testFence;
19716 VkFenceCreateInfo fenceInfo = {};
19717 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19718 fenceInfo.pNext = NULL;
19719
Tony Barbour1fa09702017-03-16 12:09:08 -060019720 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019721 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019722 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019723 VkResult result = vkResetFences(m_device->device(), 1, fences);
19724 ASSERT_VK_SUCCESS(result);
19725
19726 m_errorMonitor->VerifyNotFound();
19727}
19728
19729TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19730 m_errorMonitor->ExpectSuccess();
19731
Tony Barbour1fa09702017-03-16 12:09:08 -060019732 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019733 VkResult err;
19734
19735 // Record (empty!) command buffer that can be submitted multiple times
19736 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019737 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19738 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019739 m_commandBuffer->BeginCommandBuffer(&cbbi);
19740 m_commandBuffer->EndCommandBuffer();
19741
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019742 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019743 VkFence fence;
19744 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19745 ASSERT_VK_SUCCESS(err);
19746
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019747 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019748 VkSemaphore s1, s2;
19749 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19750 ASSERT_VK_SUCCESS(err);
19751 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19752 ASSERT_VK_SUCCESS(err);
19753
19754 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019755 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019756 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19757 ASSERT_VK_SUCCESS(err);
19758
19759 // Submit CB again, signaling s2.
19760 si.pSignalSemaphores = &s2;
19761 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19762 ASSERT_VK_SUCCESS(err);
19763
19764 // Wait for fence.
19765 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19766 ASSERT_VK_SUCCESS(err);
19767
19768 // CB is still in flight from second submission, but semaphore s1 is no
19769 // longer in flight. delete it.
19770 vkDestroySemaphore(m_device->device(), s1, nullptr);
19771
19772 m_errorMonitor->VerifyNotFound();
19773
19774 // Force device idle and clean up remaining objects
19775 vkDeviceWaitIdle(m_device->device());
19776 vkDestroySemaphore(m_device->device(), s2, nullptr);
19777 vkDestroyFence(m_device->device(), fence, nullptr);
19778}
19779
19780TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19781 m_errorMonitor->ExpectSuccess();
19782
Tony Barbour1fa09702017-03-16 12:09:08 -060019783 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019784 VkResult err;
19785
19786 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019787 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019788 VkFence f1;
19789 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19790 ASSERT_VK_SUCCESS(err);
19791
19792 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019793 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019794 VkFence f2;
19795 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19796 ASSERT_VK_SUCCESS(err);
19797
19798 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019799 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019800 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19801
19802 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019803 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019804 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19805
19806 // Should have both retired!
19807 vkDestroyFence(m_device->device(), f1, nullptr);
19808 vkDestroyFence(m_device->device(), f2, nullptr);
19809
19810 m_errorMonitor->VerifyNotFound();
19811}
19812
19813TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019814 TEST_DESCRIPTION(
19815 "Verify that creating an image view from an image with valid usage "
19816 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019817
Tony Barbour1fa09702017-03-16 12:09:08 -060019818 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019819
19820 m_errorMonitor->ExpectSuccess();
19821 // Verify that we can create a view with usage INPUT_ATTACHMENT
19822 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019823 image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019824 ASSERT_TRUE(image.initialized());
19825 VkImageView imageView;
19826 VkImageViewCreateInfo ivci = {};
19827 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19828 ivci.image = image.handle();
19829 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19830 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19831 ivci.subresourceRange.layerCount = 1;
19832 ivci.subresourceRange.baseMipLevel = 0;
19833 ivci.subresourceRange.levelCount = 1;
19834 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19835
19836 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19837 m_errorMonitor->VerifyNotFound();
19838 vkDestroyImageView(m_device->device(), imageView, NULL);
19839}
19840
19841// This is a positive test. No failures are expected.
19842TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019843 TEST_DESCRIPTION(
19844 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19845 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019846
Tony Barbour1fa09702017-03-16 12:09:08 -060019847 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019848
19849 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019850 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019851 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019852
19853 m_errorMonitor->ExpectSuccess();
19854
19855 VkImage image;
19856 VkImageCreateInfo image_create_info = {};
19857 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19858 image_create_info.pNext = NULL;
19859 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19860 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19861 image_create_info.extent.width = 64;
19862 image_create_info.extent.height = 64;
19863 image_create_info.extent.depth = 1;
19864 image_create_info.mipLevels = 1;
19865 image_create_info.arrayLayers = 1;
19866 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19867 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19868 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19869 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19870 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19871 ASSERT_VK_SUCCESS(err);
19872
19873 VkMemoryRequirements memory_reqs;
19874 VkDeviceMemory memory_one, memory_two;
19875 bool pass;
19876 VkMemoryAllocateInfo memory_info = {};
19877 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19878 memory_info.pNext = NULL;
19879 memory_info.allocationSize = 0;
19880 memory_info.memoryTypeIndex = 0;
19881 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19882 // Find an image big enough to allow sparse mapping of 2 memory regions
19883 // Increase the image size until it is at least twice the
19884 // size of the required alignment, to ensure we can bind both
19885 // allocated memory blocks to the image on aligned offsets.
19886 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19887 vkDestroyImage(m_device->device(), image, nullptr);
19888 image_create_info.extent.width *= 2;
19889 image_create_info.extent.height *= 2;
19890 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19891 ASSERT_VK_SUCCESS(err);
19892 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19893 }
19894 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19895 // at the end of the first
19896 memory_info.allocationSize = memory_reqs.alignment;
19897 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19898 ASSERT_TRUE(pass);
19899 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19900 ASSERT_VK_SUCCESS(err);
19901 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19902 ASSERT_VK_SUCCESS(err);
19903 VkSparseMemoryBind binds[2];
19904 binds[0].flags = 0;
19905 binds[0].memory = memory_one;
19906 binds[0].memoryOffset = 0;
19907 binds[0].resourceOffset = 0;
19908 binds[0].size = memory_info.allocationSize;
19909 binds[1].flags = 0;
19910 binds[1].memory = memory_two;
19911 binds[1].memoryOffset = 0;
19912 binds[1].resourceOffset = memory_info.allocationSize;
19913 binds[1].size = memory_info.allocationSize;
19914
19915 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19916 opaqueBindInfo.image = image;
19917 opaqueBindInfo.bindCount = 2;
19918 opaqueBindInfo.pBinds = binds;
19919
19920 VkFence fence = VK_NULL_HANDLE;
19921 VkBindSparseInfo bindSparseInfo = {};
19922 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19923 bindSparseInfo.imageOpaqueBindCount = 1;
19924 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19925
19926 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19927 vkQueueWaitIdle(m_device->m_queue);
19928 vkDestroyImage(m_device->device(), image, NULL);
19929 vkFreeMemory(m_device->device(), memory_one, NULL);
19930 vkFreeMemory(m_device->device(), memory_two, NULL);
19931 m_errorMonitor->VerifyNotFound();
19932}
19933
19934TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019935 TEST_DESCRIPTION(
19936 "Ensure that CmdBeginRenderPass with an attachment's "
19937 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19938 "the command buffer has prior knowledge of that "
19939 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019940
19941 m_errorMonitor->ExpectSuccess();
19942
Tony Barbour1fa09702017-03-16 12:09:08 -060019943 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019944
19945 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019946 VkAttachmentDescription attachment = {0,
19947 VK_FORMAT_R8G8B8A8_UNORM,
19948 VK_SAMPLE_COUNT_1_BIT,
19949 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19950 VK_ATTACHMENT_STORE_OP_STORE,
19951 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19952 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19953 VK_IMAGE_LAYOUT_UNDEFINED,
19954 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019955
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019956 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019957
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019958 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019959
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019960 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961
19962 VkRenderPass rp;
19963 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19964 ASSERT_VK_SUCCESS(err);
19965
19966 // A compatible framebuffer.
19967 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019968 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019969 ASSERT_TRUE(image.initialized());
19970
19971 VkImageViewCreateInfo ivci = {
19972 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19973 nullptr,
19974 0,
19975 image.handle(),
19976 VK_IMAGE_VIEW_TYPE_2D,
19977 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019978 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19979 VK_COMPONENT_SWIZZLE_IDENTITY},
19980 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019981 };
19982 VkImageView view;
19983 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19984 ASSERT_VK_SUCCESS(err);
19985
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019986 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019987 VkFramebuffer fb;
19988 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19989 ASSERT_VK_SUCCESS(err);
19990
19991 // Record a single command buffer which uses this renderpass twice. The
19992 // bug is triggered at the beginning of the second renderpass, when the
19993 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019994 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 -070019995 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019996 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19997 vkCmdEndRenderPass(m_commandBuffer->handle());
19998 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19999
20000 m_errorMonitor->VerifyNotFound();
20001
20002 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020003 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020004
20005 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20006 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20007 vkDestroyImageView(m_device->device(), view, nullptr);
20008}
20009
20010TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020011 TEST_DESCRIPTION(
20012 "This test should pass. Create a Framebuffer and "
20013 "command buffer, bind them together, then destroy "
20014 "command pool and framebuffer and verify there are no "
20015 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020016
20017 m_errorMonitor->ExpectSuccess();
20018
Tony Barbour1fa09702017-03-16 12:09:08 -060020019 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020020
20021 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020022 VkAttachmentDescription attachment = {0,
20023 VK_FORMAT_R8G8B8A8_UNORM,
20024 VK_SAMPLE_COUNT_1_BIT,
20025 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20026 VK_ATTACHMENT_STORE_OP_STORE,
20027 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20028 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20029 VK_IMAGE_LAYOUT_UNDEFINED,
20030 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020031
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020032 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020033
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020034 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020035
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020036 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020037
20038 VkRenderPass rp;
20039 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20040 ASSERT_VK_SUCCESS(err);
20041
20042 // A compatible framebuffer.
20043 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020044 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020045 ASSERT_TRUE(image.initialized());
20046
20047 VkImageViewCreateInfo ivci = {
20048 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20049 nullptr,
20050 0,
20051 image.handle(),
20052 VK_IMAGE_VIEW_TYPE_2D,
20053 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020054 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20055 VK_COMPONENT_SWIZZLE_IDENTITY},
20056 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020057 };
20058 VkImageView view;
20059 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20060 ASSERT_VK_SUCCESS(err);
20061
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020062 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020063 VkFramebuffer fb;
20064 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20065 ASSERT_VK_SUCCESS(err);
20066
20067 // Explicitly create a command buffer to bind the FB to so that we can then
20068 // destroy the command pool in order to implicitly free command buffer
20069 VkCommandPool command_pool;
20070 VkCommandPoolCreateInfo pool_create_info{};
20071 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20072 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20073 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20074 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20075
20076 VkCommandBuffer command_buffer;
20077 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20078 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20079 command_buffer_allocate_info.commandPool = command_pool;
20080 command_buffer_allocate_info.commandBufferCount = 1;
20081 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20082 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20083
20084 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020085 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 -060020086 VkCommandBufferBeginInfo begin_info{};
20087 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20088 vkBeginCommandBuffer(command_buffer, &begin_info);
20089
20090 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20091 vkCmdEndRenderPass(command_buffer);
20092 vkEndCommandBuffer(command_buffer);
20093 vkDestroyImageView(m_device->device(), view, nullptr);
20094 // Destroy command pool to implicitly free command buffer
20095 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20096 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20097 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20098 m_errorMonitor->VerifyNotFound();
20099}
20100
20101TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020102 TEST_DESCRIPTION(
20103 "Ensure that CmdBeginRenderPass applies the layout "
20104 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020105
20106 m_errorMonitor->ExpectSuccess();
20107
Tony Barbour1fa09702017-03-16 12:09:08 -060020108 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020109
20110 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020111 VkAttachmentDescription attachment = {0,
20112 VK_FORMAT_R8G8B8A8_UNORM,
20113 VK_SAMPLE_COUNT_1_BIT,
20114 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20115 VK_ATTACHMENT_STORE_OP_STORE,
20116 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20117 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20118 VK_IMAGE_LAYOUT_UNDEFINED,
20119 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020120
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020121 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020122
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020123 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020124
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020125 VkSubpassDependency dep = {0,
20126 0,
20127 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20128 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20129 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20130 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20131 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020132
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020133 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020134
20135 VkResult err;
20136 VkRenderPass rp;
20137 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20138 ASSERT_VK_SUCCESS(err);
20139
20140 // A compatible framebuffer.
20141 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020142 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020143 ASSERT_TRUE(image.initialized());
20144
20145 VkImageViewCreateInfo ivci = {
20146 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20147 nullptr,
20148 0,
20149 image.handle(),
20150 VK_IMAGE_VIEW_TYPE_2D,
20151 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020152 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20153 VK_COMPONENT_SWIZZLE_IDENTITY},
20154 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020155 };
20156 VkImageView view;
20157 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20158 ASSERT_VK_SUCCESS(err);
20159
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020160 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020161 VkFramebuffer fb;
20162 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20163 ASSERT_VK_SUCCESS(err);
20164
20165 // Record a single command buffer which issues a pipeline barrier w/
20166 // image memory barrier for the attachment. This detects the previously
20167 // missing tracking of the subpass layout by throwing a validation error
20168 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020169 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 -070020170 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020171 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20172
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020173 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20174 nullptr,
20175 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20176 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20177 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20178 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20179 VK_QUEUE_FAMILY_IGNORED,
20180 VK_QUEUE_FAMILY_IGNORED,
20181 image.handle(),
20182 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020183 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020184 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20185 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020186
20187 vkCmdEndRenderPass(m_commandBuffer->handle());
20188 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020189 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020190
20191 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20192 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20193 vkDestroyImageView(m_device->device(), view, nullptr);
20194}
20195
20196TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020197 TEST_DESCRIPTION(
20198 "Validate that when an imageView of a depth/stencil image "
20199 "is used as a depth/stencil framebuffer attachment, the "
20200 "aspectMask is ignored and both depth and stencil image "
20201 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020202
Tony Barbour1fa09702017-03-16 12:09:08 -060020203 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020204 VkFormatProperties format_properties;
20205 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20206 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20207 return;
20208 }
20209
20210 m_errorMonitor->ExpectSuccess();
20211
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020212 VkAttachmentDescription attachment = {0,
20213 VK_FORMAT_D32_SFLOAT_S8_UINT,
20214 VK_SAMPLE_COUNT_1_BIT,
20215 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20216 VK_ATTACHMENT_STORE_OP_STORE,
20217 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20218 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20219 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20220 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020221
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020222 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020223
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020224 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020225
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020226 VkSubpassDependency dep = {0,
20227 0,
20228 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20229 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20230 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20231 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20232 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020233
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020234 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020235
20236 VkResult err;
20237 VkRenderPass rp;
20238 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20239 ASSERT_VK_SUCCESS(err);
20240
20241 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020242 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20243 0x26, // usage
20244 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020245 ASSERT_TRUE(image.initialized());
20246 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20247
20248 VkImageViewCreateInfo ivci = {
20249 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20250 nullptr,
20251 0,
20252 image.handle(),
20253 VK_IMAGE_VIEW_TYPE_2D,
20254 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020255 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20256 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020257 };
20258 VkImageView view;
20259 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20260 ASSERT_VK_SUCCESS(err);
20261
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020262 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020263 VkFramebuffer fb;
20264 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20265 ASSERT_VK_SUCCESS(err);
20266
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020267 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 -070020268 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020269 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20270
20271 VkImageMemoryBarrier imb = {};
20272 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20273 imb.pNext = nullptr;
20274 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20275 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20276 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20277 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20278 imb.srcQueueFamilyIndex = 0;
20279 imb.dstQueueFamilyIndex = 0;
20280 imb.image = image.handle();
20281 imb.subresourceRange.aspectMask = 0x6;
20282 imb.subresourceRange.baseMipLevel = 0;
20283 imb.subresourceRange.levelCount = 0x1;
20284 imb.subresourceRange.baseArrayLayer = 0;
20285 imb.subresourceRange.layerCount = 0x1;
20286
20287 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020288 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20289 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020290
20291 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020292 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020293 QueueCommandBuffer(false);
20294 m_errorMonitor->VerifyNotFound();
20295
20296 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20297 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20298 vkDestroyImageView(m_device->device(), view, nullptr);
20299}
20300
20301TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020302 TEST_DESCRIPTION(
20303 "Ensure that layout transitions work correctly without "
20304 "errors, when an attachment reference is "
20305 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020306
20307 m_errorMonitor->ExpectSuccess();
20308
Tony Barbour1fa09702017-03-16 12:09:08 -060020309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020310
20311 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020312 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020313
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020314 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020315
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020316 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020317
20318 VkRenderPass rp;
20319 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20320 ASSERT_VK_SUCCESS(err);
20321
20322 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020323 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020324 VkFramebuffer fb;
20325 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20326 ASSERT_VK_SUCCESS(err);
20327
20328 // Record a command buffer which just begins and ends the renderpass. The
20329 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020330 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 -070020331 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020332 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20333 vkCmdEndRenderPass(m_commandBuffer->handle());
20334 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020335 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020336
20337 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20338 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20339}
20340
20341// This is a positive test. No errors are expected.
20342TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020343 TEST_DESCRIPTION(
20344 "Create a stencil-only attachment with a LOAD_OP set to "
20345 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020346 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020347 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020348 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020349 if (!depth_format) {
20350 printf(" No Depth + Stencil format found. Skipped.\n");
20351 return;
20352 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020353 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020354 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020355 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20356 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020357 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20358 return;
20359 }
20360
Tony Barbourf887b162017-03-09 10:06:46 -070020361 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020362 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020363 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020364 VkAttachmentDescription att = {};
20365 VkAttachmentReference ref = {};
20366 att.format = depth_stencil_fmt;
20367 att.samples = VK_SAMPLE_COUNT_1_BIT;
20368 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20369 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20370 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20371 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20372 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20373 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20374
20375 VkClearValue clear;
20376 clear.depthStencil.depth = 1.0;
20377 clear.depthStencil.stencil = 0;
20378 ref.attachment = 0;
20379 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20380
20381 VkSubpassDescription subpass = {};
20382 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20383 subpass.flags = 0;
20384 subpass.inputAttachmentCount = 0;
20385 subpass.pInputAttachments = NULL;
20386 subpass.colorAttachmentCount = 0;
20387 subpass.pColorAttachments = NULL;
20388 subpass.pResolveAttachments = NULL;
20389 subpass.pDepthStencilAttachment = &ref;
20390 subpass.preserveAttachmentCount = 0;
20391 subpass.pPreserveAttachments = NULL;
20392
20393 VkRenderPass rp;
20394 VkRenderPassCreateInfo rp_info = {};
20395 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20396 rp_info.attachmentCount = 1;
20397 rp_info.pAttachments = &att;
20398 rp_info.subpassCount = 1;
20399 rp_info.pSubpasses = &subpass;
20400 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20401 ASSERT_VK_SUCCESS(result);
20402
20403 VkImageView *depthView = m_depthStencil->BindInfo();
20404 VkFramebufferCreateInfo fb_info = {};
20405 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20406 fb_info.pNext = NULL;
20407 fb_info.renderPass = rp;
20408 fb_info.attachmentCount = 1;
20409 fb_info.pAttachments = depthView;
20410 fb_info.width = 100;
20411 fb_info.height = 100;
20412 fb_info.layers = 1;
20413 VkFramebuffer fb;
20414 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20415 ASSERT_VK_SUCCESS(result);
20416
20417 VkRenderPassBeginInfo rpbinfo = {};
20418 rpbinfo.clearValueCount = 1;
20419 rpbinfo.pClearValues = &clear;
20420 rpbinfo.pNext = NULL;
20421 rpbinfo.renderPass = rp;
20422 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20423 rpbinfo.renderArea.extent.width = 100;
20424 rpbinfo.renderArea.extent.height = 100;
20425 rpbinfo.renderArea.offset.x = 0;
20426 rpbinfo.renderArea.offset.y = 0;
20427 rpbinfo.framebuffer = fb;
20428
20429 VkFence fence = {};
20430 VkFenceCreateInfo fence_ci = {};
20431 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20432 fence_ci.pNext = nullptr;
20433 fence_ci.flags = 0;
20434 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20435 ASSERT_VK_SUCCESS(result);
20436
20437 m_commandBuffer->BeginCommandBuffer();
20438 m_commandBuffer->BeginRenderPass(rpbinfo);
20439 m_commandBuffer->EndRenderPass();
20440 m_commandBuffer->EndCommandBuffer();
20441 m_commandBuffer->QueueCommandBuffer(fence);
20442
20443 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020444 destImage.Init(100, 100, 1, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020445 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020446 VkImageMemoryBarrier barrier = {};
20447 VkImageSubresourceRange range;
20448 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20449 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20450 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20451 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20452 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20453 barrier.image = m_depthStencil->handle();
20454 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20455 range.baseMipLevel = 0;
20456 range.levelCount = 1;
20457 range.baseArrayLayer = 0;
20458 range.layerCount = 1;
20459 barrier.subresourceRange = range;
20460 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20461 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20462 cmdbuf.BeginCommandBuffer();
20463 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 -070020464 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020465 barrier.srcAccessMask = 0;
20466 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20467 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20468 barrier.image = destImage.handle();
20469 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20470 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 -070020471 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020472 VkImageCopy cregion;
20473 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20474 cregion.srcSubresource.mipLevel = 0;
20475 cregion.srcSubresource.baseArrayLayer = 0;
20476 cregion.srcSubresource.layerCount = 1;
20477 cregion.srcOffset.x = 0;
20478 cregion.srcOffset.y = 0;
20479 cregion.srcOffset.z = 0;
20480 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20481 cregion.dstSubresource.mipLevel = 0;
20482 cregion.dstSubresource.baseArrayLayer = 0;
20483 cregion.dstSubresource.layerCount = 1;
20484 cregion.dstOffset.x = 0;
20485 cregion.dstOffset.y = 0;
20486 cregion.dstOffset.z = 0;
20487 cregion.extent.width = 100;
20488 cregion.extent.height = 100;
20489 cregion.extent.depth = 1;
20490 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020491 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020492 cmdbuf.EndCommandBuffer();
20493
20494 VkSubmitInfo submit_info;
20495 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20496 submit_info.pNext = NULL;
20497 submit_info.waitSemaphoreCount = 0;
20498 submit_info.pWaitSemaphores = NULL;
20499 submit_info.pWaitDstStageMask = NULL;
20500 submit_info.commandBufferCount = 1;
20501 submit_info.pCommandBuffers = &cmdbuf.handle();
20502 submit_info.signalSemaphoreCount = 0;
20503 submit_info.pSignalSemaphores = NULL;
20504
20505 m_errorMonitor->ExpectSuccess();
20506 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20507 m_errorMonitor->VerifyNotFound();
20508
20509 vkQueueWaitIdle(m_device->m_queue);
20510 vkDestroyFence(m_device->device(), fence, nullptr);
20511 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20512 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20513}
20514
20515// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020516TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20517 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20518
20519 m_errorMonitor->ExpectSuccess();
20520
Tony Barbour1fa09702017-03-16 12:09:08 -060020521 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020522 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020523 if (!depth_format) {
20524 printf(" No Depth + Stencil format found. Skipped.\n");
20525 return;
20526 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020527 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20528
20529 VkImageMemoryBarrier img_barrier = {};
20530 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20531 img_barrier.pNext = NULL;
20532 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20533 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20534 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20535 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20536 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20537 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20538 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20539 img_barrier.subresourceRange.baseArrayLayer = 0;
20540 img_barrier.subresourceRange.baseMipLevel = 0;
20541 img_barrier.subresourceRange.layerCount = 1;
20542 img_barrier.subresourceRange.levelCount = 1;
20543
20544 {
20545 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020546 img_color.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020547 ASSERT_TRUE(img_color.initialized());
20548
20549 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020550 img_ds1.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020551 ASSERT_TRUE(img_ds1.initialized());
20552
20553 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020554 img_ds2.Init(128, 128, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020555 ASSERT_TRUE(img_ds2.initialized());
20556
20557 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020558 img_xfer_src.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020559 ASSERT_TRUE(img_xfer_src.initialized());
20560
20561 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020562 img_xfer_dst.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020563 ASSERT_TRUE(img_xfer_dst.initialized());
20564
20565 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020566 img_sampled.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020567 ASSERT_TRUE(img_sampled.initialized());
20568
20569 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020570 img_input.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020571 ASSERT_TRUE(img_input.initialized());
20572
20573 const struct {
20574 VkImageObj &image_obj;
20575 VkImageLayout old_layout;
20576 VkImageLayout new_layout;
20577 } buffer_layouts[] = {
20578 // clang-format off
20579 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20580 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20581 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20582 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20583 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20584 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20585 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20586 // clang-format on
20587 };
20588 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20589
20590 m_commandBuffer->BeginCommandBuffer();
20591 for (uint32_t i = 0; i < layout_count; ++i) {
20592 img_barrier.image = buffer_layouts[i].image_obj.handle();
20593 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20594 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20595 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20596 : VK_IMAGE_ASPECT_COLOR_BIT;
20597
20598 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20599 img_barrier.newLayout = buffer_layouts[i].new_layout;
20600 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20601 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20602
20603 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20604 img_barrier.newLayout = buffer_layouts[i].old_layout;
20605 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20606 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20607 }
20608 m_commandBuffer->EndCommandBuffer();
20609
20610 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20611 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20612 }
20613 m_errorMonitor->VerifyNotFound();
20614}
20615
20616// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020617TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20618 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20619
20620 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020621 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020622
20623 VkEvent event;
20624 VkEventCreateInfo event_create_info{};
20625 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20626 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20627
20628 VkCommandPool command_pool;
20629 VkCommandPoolCreateInfo pool_create_info{};
20630 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20631 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20632 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20633 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20634
20635 VkCommandBuffer command_buffer;
20636 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20637 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20638 command_buffer_allocate_info.commandPool = command_pool;
20639 command_buffer_allocate_info.commandBufferCount = 1;
20640 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20641 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20642
20643 VkQueue queue = VK_NULL_HANDLE;
20644 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20645
20646 {
20647 VkCommandBufferBeginInfo begin_info{};
20648 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20649 vkBeginCommandBuffer(command_buffer, &begin_info);
20650
20651 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 -070020652 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020653 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20654 vkEndCommandBuffer(command_buffer);
20655 }
20656 {
20657 VkSubmitInfo submit_info{};
20658 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20659 submit_info.commandBufferCount = 1;
20660 submit_info.pCommandBuffers = &command_buffer;
20661 submit_info.signalSemaphoreCount = 0;
20662 submit_info.pSignalSemaphores = nullptr;
20663 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20664 }
20665 { vkSetEvent(m_device->device(), event); }
20666
20667 vkQueueWaitIdle(queue);
20668
20669 vkDestroyEvent(m_device->device(), event, nullptr);
20670 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20671 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20672
20673 m_errorMonitor->VerifyNotFound();
20674}
20675// This is a positive test. No errors should be generated.
20676TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20677 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20678
Tony Barbour1fa09702017-03-16 12:09:08 -060020679 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020680 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020681
20682 m_errorMonitor->ExpectSuccess();
20683
20684 VkQueryPool query_pool;
20685 VkQueryPoolCreateInfo query_pool_create_info{};
20686 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20687 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20688 query_pool_create_info.queryCount = 1;
20689 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20690
20691 VkCommandPool command_pool;
20692 VkCommandPoolCreateInfo pool_create_info{};
20693 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20694 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20695 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20696 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20697
20698 VkCommandBuffer command_buffer;
20699 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20700 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20701 command_buffer_allocate_info.commandPool = command_pool;
20702 command_buffer_allocate_info.commandBufferCount = 1;
20703 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20704 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20705
20706 VkCommandBuffer secondary_command_buffer;
20707 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20708 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20709
20710 VkQueue queue = VK_NULL_HANDLE;
20711 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20712
20713 uint32_t qfi = 0;
20714 VkBufferCreateInfo buff_create_info = {};
20715 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20716 buff_create_info.size = 1024;
20717 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20718 buff_create_info.queueFamilyIndexCount = 1;
20719 buff_create_info.pQueueFamilyIndices = &qfi;
20720
20721 VkResult err;
20722 VkBuffer buffer;
20723 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20724 ASSERT_VK_SUCCESS(err);
20725 VkMemoryAllocateInfo mem_alloc = {};
20726 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20727 mem_alloc.pNext = NULL;
20728 mem_alloc.allocationSize = 1024;
20729 mem_alloc.memoryTypeIndex = 0;
20730
20731 VkMemoryRequirements memReqs;
20732 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20733 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20734 if (!pass) {
20735 vkDestroyBuffer(m_device->device(), buffer, NULL);
20736 return;
20737 }
20738
20739 VkDeviceMemory mem;
20740 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20741 ASSERT_VK_SUCCESS(err);
20742 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20743 ASSERT_VK_SUCCESS(err);
20744
20745 VkCommandBufferInheritanceInfo hinfo = {};
20746 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20747 hinfo.renderPass = VK_NULL_HANDLE;
20748 hinfo.subpass = 0;
20749 hinfo.framebuffer = VK_NULL_HANDLE;
20750 hinfo.occlusionQueryEnable = VK_FALSE;
20751 hinfo.queryFlags = 0;
20752 hinfo.pipelineStatistics = 0;
20753
20754 {
20755 VkCommandBufferBeginInfo begin_info{};
20756 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20757 begin_info.pInheritanceInfo = &hinfo;
20758 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20759
20760 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20761 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20762
20763 vkEndCommandBuffer(secondary_command_buffer);
20764
20765 begin_info.pInheritanceInfo = nullptr;
20766 vkBeginCommandBuffer(command_buffer, &begin_info);
20767
20768 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20769 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20770
20771 vkEndCommandBuffer(command_buffer);
20772 }
20773 {
20774 VkSubmitInfo submit_info{};
20775 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20776 submit_info.commandBufferCount = 1;
20777 submit_info.pCommandBuffers = &command_buffer;
20778 submit_info.signalSemaphoreCount = 0;
20779 submit_info.pSignalSemaphores = nullptr;
20780 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20781 }
20782
20783 vkQueueWaitIdle(queue);
20784
20785 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20786 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20787 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20788 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20789 vkDestroyBuffer(m_device->device(), buffer, NULL);
20790 vkFreeMemory(m_device->device(), mem, NULL);
20791
20792 m_errorMonitor->VerifyNotFound();
20793}
20794
20795// This is a positive test. No errors should be generated.
20796TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20797 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20798
Tony Barbour1fa09702017-03-16 12:09:08 -060020799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020800 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020801
20802 m_errorMonitor->ExpectSuccess();
20803
20804 VkQueryPool query_pool;
20805 VkQueryPoolCreateInfo query_pool_create_info{};
20806 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20807 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20808 query_pool_create_info.queryCount = 1;
20809 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20810
20811 VkCommandPool command_pool;
20812 VkCommandPoolCreateInfo pool_create_info{};
20813 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20814 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20815 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20816 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20817
20818 VkCommandBuffer command_buffer[2];
20819 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20820 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20821 command_buffer_allocate_info.commandPool = command_pool;
20822 command_buffer_allocate_info.commandBufferCount = 2;
20823 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20824 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20825
20826 VkQueue queue = VK_NULL_HANDLE;
20827 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20828
20829 uint32_t qfi = 0;
20830 VkBufferCreateInfo buff_create_info = {};
20831 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20832 buff_create_info.size = 1024;
20833 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20834 buff_create_info.queueFamilyIndexCount = 1;
20835 buff_create_info.pQueueFamilyIndices = &qfi;
20836
20837 VkResult err;
20838 VkBuffer buffer;
20839 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20840 ASSERT_VK_SUCCESS(err);
20841 VkMemoryAllocateInfo mem_alloc = {};
20842 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20843 mem_alloc.pNext = NULL;
20844 mem_alloc.allocationSize = 1024;
20845 mem_alloc.memoryTypeIndex = 0;
20846
20847 VkMemoryRequirements memReqs;
20848 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20849 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20850 if (!pass) {
20851 vkDestroyBuffer(m_device->device(), buffer, NULL);
20852 return;
20853 }
20854
20855 VkDeviceMemory mem;
20856 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20857 ASSERT_VK_SUCCESS(err);
20858 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20859 ASSERT_VK_SUCCESS(err);
20860
20861 {
20862 VkCommandBufferBeginInfo begin_info{};
20863 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20864 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20865
20866 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20867 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20868
20869 vkEndCommandBuffer(command_buffer[0]);
20870
20871 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20872
20873 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20874
20875 vkEndCommandBuffer(command_buffer[1]);
20876 }
20877 {
20878 VkSubmitInfo submit_info{};
20879 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20880 submit_info.commandBufferCount = 2;
20881 submit_info.pCommandBuffers = command_buffer;
20882 submit_info.signalSemaphoreCount = 0;
20883 submit_info.pSignalSemaphores = nullptr;
20884 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20885 }
20886
20887 vkQueueWaitIdle(queue);
20888
20889 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20890 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20891 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20892 vkDestroyBuffer(m_device->device(), buffer, NULL);
20893 vkFreeMemory(m_device->device(), mem, NULL);
20894
20895 m_errorMonitor->VerifyNotFound();
20896}
20897
Tony Barbourc46924f2016-11-04 11:49:52 -060020898TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020899 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20900
Tony Barbour1fa09702017-03-16 12:09:08 -060020901 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020902 VkEvent event;
20903 VkEventCreateInfo event_create_info{};
20904 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20905 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20906
20907 VkCommandPool command_pool;
20908 VkCommandPoolCreateInfo pool_create_info{};
20909 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20910 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20911 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20912 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20913
20914 VkCommandBuffer command_buffer;
20915 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20916 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20917 command_buffer_allocate_info.commandPool = command_pool;
20918 command_buffer_allocate_info.commandBufferCount = 1;
20919 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20920 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20921
20922 VkQueue queue = VK_NULL_HANDLE;
20923 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20924
20925 {
20926 VkCommandBufferBeginInfo begin_info{};
20927 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20928 vkBeginCommandBuffer(command_buffer, &begin_info);
20929
20930 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020931 vkEndCommandBuffer(command_buffer);
20932 }
20933 {
20934 VkSubmitInfo submit_info{};
20935 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20936 submit_info.commandBufferCount = 1;
20937 submit_info.pCommandBuffers = &command_buffer;
20938 submit_info.signalSemaphoreCount = 0;
20939 submit_info.pSignalSemaphores = nullptr;
20940 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20941 }
20942 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20944 "that is already in use by a "
20945 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020946 vkSetEvent(m_device->device(), event);
20947 m_errorMonitor->VerifyFound();
20948 }
20949
20950 vkQueueWaitIdle(queue);
20951
20952 vkDestroyEvent(m_device->device(), event, nullptr);
20953 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20954 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20955}
20956
20957// This is a positive test. No errors should be generated.
20958TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020959 TEST_DESCRIPTION(
20960 "Two command buffers with two separate fences are each "
20961 "run through a Submit & WaitForFences cycle 3 times. This "
20962 "previously revealed a bug so running this positive test "
20963 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020964 m_errorMonitor->ExpectSuccess();
20965
Tony Barbour1fa09702017-03-16 12:09:08 -060020966 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020967 VkQueue queue = VK_NULL_HANDLE;
20968 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20969
20970 static const uint32_t NUM_OBJECTS = 2;
20971 static const uint32_t NUM_FRAMES = 3;
20972 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20973 VkFence fences[NUM_OBJECTS] = {};
20974
20975 VkCommandPool cmd_pool;
20976 VkCommandPoolCreateInfo cmd_pool_ci = {};
20977 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20978 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20979 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20980 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20981 ASSERT_VK_SUCCESS(err);
20982
20983 VkCommandBufferAllocateInfo cmd_buf_info = {};
20984 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20985 cmd_buf_info.commandPool = cmd_pool;
20986 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20987 cmd_buf_info.commandBufferCount = 1;
20988
20989 VkFenceCreateInfo fence_ci = {};
20990 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20991 fence_ci.pNext = nullptr;
20992 fence_ci.flags = 0;
20993
20994 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20995 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20996 ASSERT_VK_SUCCESS(err);
20997 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20998 ASSERT_VK_SUCCESS(err);
20999 }
21000
21001 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21002 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21003 // Create empty cmd buffer
21004 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21005 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21006
21007 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21008 ASSERT_VK_SUCCESS(err);
21009 err = vkEndCommandBuffer(cmd_buffers[obj]);
21010 ASSERT_VK_SUCCESS(err);
21011
21012 VkSubmitInfo submit_info = {};
21013 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21014 submit_info.commandBufferCount = 1;
21015 submit_info.pCommandBuffers = &cmd_buffers[obj];
21016 // Submit cmd buffer and wait for fence
21017 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21018 ASSERT_VK_SUCCESS(err);
21019 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21020 ASSERT_VK_SUCCESS(err);
21021 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21022 ASSERT_VK_SUCCESS(err);
21023 }
21024 }
21025 m_errorMonitor->VerifyNotFound();
21026 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21027 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21028 vkDestroyFence(m_device->device(), fences[i], nullptr);
21029 }
21030}
21031// This is a positive test. No errors should be generated.
21032TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021033 TEST_DESCRIPTION(
21034 "Two command buffers, each in a separate QueueSubmit call "
21035 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021036
Tony Barbour1fa09702017-03-16 12:09:08 -060021037 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021038 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021039
21040 m_errorMonitor->ExpectSuccess();
21041
21042 VkSemaphore semaphore;
21043 VkSemaphoreCreateInfo semaphore_create_info{};
21044 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21045 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21046
21047 VkCommandPool command_pool;
21048 VkCommandPoolCreateInfo pool_create_info{};
21049 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21050 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21051 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21052 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21053
21054 VkCommandBuffer command_buffer[2];
21055 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21056 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21057 command_buffer_allocate_info.commandPool = command_pool;
21058 command_buffer_allocate_info.commandBufferCount = 2;
21059 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21060 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21061
21062 VkQueue queue = VK_NULL_HANDLE;
21063 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21064
21065 {
21066 VkCommandBufferBeginInfo begin_info{};
21067 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21068 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21069
21070 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 -070021071 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021072
21073 VkViewport viewport{};
21074 viewport.maxDepth = 1.0f;
21075 viewport.minDepth = 0.0f;
21076 viewport.width = 512;
21077 viewport.height = 512;
21078 viewport.x = 0;
21079 viewport.y = 0;
21080 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21081 vkEndCommandBuffer(command_buffer[0]);
21082 }
21083 {
21084 VkCommandBufferBeginInfo begin_info{};
21085 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21086 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21087
21088 VkViewport viewport{};
21089 viewport.maxDepth = 1.0f;
21090 viewport.minDepth = 0.0f;
21091 viewport.width = 512;
21092 viewport.height = 512;
21093 viewport.x = 0;
21094 viewport.y = 0;
21095 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21096 vkEndCommandBuffer(command_buffer[1]);
21097 }
21098 {
21099 VkSubmitInfo submit_info{};
21100 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21101 submit_info.commandBufferCount = 1;
21102 submit_info.pCommandBuffers = &command_buffer[0];
21103 submit_info.signalSemaphoreCount = 1;
21104 submit_info.pSignalSemaphores = &semaphore;
21105 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21106 }
21107 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021108 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021109 VkSubmitInfo submit_info{};
21110 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21111 submit_info.commandBufferCount = 1;
21112 submit_info.pCommandBuffers = &command_buffer[1];
21113 submit_info.waitSemaphoreCount = 1;
21114 submit_info.pWaitSemaphores = &semaphore;
21115 submit_info.pWaitDstStageMask = flags;
21116 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21117 }
21118
21119 vkQueueWaitIdle(m_device->m_queue);
21120
21121 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21122 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21123 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21124
21125 m_errorMonitor->VerifyNotFound();
21126}
21127
21128// This is a positive test. No errors should be generated.
21129TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021130 TEST_DESCRIPTION(
21131 "Two command buffers, each in a separate QueueSubmit call "
21132 "submitted on separate queues, the second having a fence"
21133 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021134
Tony Barbour1fa09702017-03-16 12:09:08 -060021135 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021136 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021137
21138 m_errorMonitor->ExpectSuccess();
21139
21140 VkFence fence;
21141 VkFenceCreateInfo fence_create_info{};
21142 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21143 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21144
21145 VkSemaphore semaphore;
21146 VkSemaphoreCreateInfo semaphore_create_info{};
21147 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21148 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21149
21150 VkCommandPool command_pool;
21151 VkCommandPoolCreateInfo pool_create_info{};
21152 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21153 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21154 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21155 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21156
21157 VkCommandBuffer command_buffer[2];
21158 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21159 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21160 command_buffer_allocate_info.commandPool = command_pool;
21161 command_buffer_allocate_info.commandBufferCount = 2;
21162 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21163 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21164
21165 VkQueue queue = VK_NULL_HANDLE;
21166 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21167
21168 {
21169 VkCommandBufferBeginInfo begin_info{};
21170 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21171 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21172
21173 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 -070021174 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021175
21176 VkViewport viewport{};
21177 viewport.maxDepth = 1.0f;
21178 viewport.minDepth = 0.0f;
21179 viewport.width = 512;
21180 viewport.height = 512;
21181 viewport.x = 0;
21182 viewport.y = 0;
21183 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21184 vkEndCommandBuffer(command_buffer[0]);
21185 }
21186 {
21187 VkCommandBufferBeginInfo begin_info{};
21188 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21189 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21190
21191 VkViewport viewport{};
21192 viewport.maxDepth = 1.0f;
21193 viewport.minDepth = 0.0f;
21194 viewport.width = 512;
21195 viewport.height = 512;
21196 viewport.x = 0;
21197 viewport.y = 0;
21198 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21199 vkEndCommandBuffer(command_buffer[1]);
21200 }
21201 {
21202 VkSubmitInfo submit_info{};
21203 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21204 submit_info.commandBufferCount = 1;
21205 submit_info.pCommandBuffers = &command_buffer[0];
21206 submit_info.signalSemaphoreCount = 1;
21207 submit_info.pSignalSemaphores = &semaphore;
21208 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21209 }
21210 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021211 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021212 VkSubmitInfo submit_info{};
21213 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21214 submit_info.commandBufferCount = 1;
21215 submit_info.pCommandBuffers = &command_buffer[1];
21216 submit_info.waitSemaphoreCount = 1;
21217 submit_info.pWaitSemaphores = &semaphore;
21218 submit_info.pWaitDstStageMask = flags;
21219 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21220 }
21221
21222 vkQueueWaitIdle(m_device->m_queue);
21223
21224 vkDestroyFence(m_device->device(), fence, nullptr);
21225 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21226 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21227 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21228
21229 m_errorMonitor->VerifyNotFound();
21230}
21231
21232// This is a positive test. No errors should be generated.
21233TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021234 TEST_DESCRIPTION(
21235 "Two command buffers, each in a separate QueueSubmit call "
21236 "submitted on separate queues, the second having a fence"
21237 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021238
Tony Barbour1fa09702017-03-16 12:09:08 -060021239 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021240 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021241
21242 m_errorMonitor->ExpectSuccess();
21243
21244 VkFence fence;
21245 VkFenceCreateInfo fence_create_info{};
21246 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21247 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21248
21249 VkSemaphore semaphore;
21250 VkSemaphoreCreateInfo semaphore_create_info{};
21251 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21252 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21253
21254 VkCommandPool command_pool;
21255 VkCommandPoolCreateInfo pool_create_info{};
21256 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21257 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21258 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21259 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21260
21261 VkCommandBuffer command_buffer[2];
21262 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21263 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21264 command_buffer_allocate_info.commandPool = command_pool;
21265 command_buffer_allocate_info.commandBufferCount = 2;
21266 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21267 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21268
21269 VkQueue queue = VK_NULL_HANDLE;
21270 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21271
21272 {
21273 VkCommandBufferBeginInfo begin_info{};
21274 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21275 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21276
21277 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 -070021278 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021279
21280 VkViewport viewport{};
21281 viewport.maxDepth = 1.0f;
21282 viewport.minDepth = 0.0f;
21283 viewport.width = 512;
21284 viewport.height = 512;
21285 viewport.x = 0;
21286 viewport.y = 0;
21287 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21288 vkEndCommandBuffer(command_buffer[0]);
21289 }
21290 {
21291 VkCommandBufferBeginInfo begin_info{};
21292 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21293 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21294
21295 VkViewport viewport{};
21296 viewport.maxDepth = 1.0f;
21297 viewport.minDepth = 0.0f;
21298 viewport.width = 512;
21299 viewport.height = 512;
21300 viewport.x = 0;
21301 viewport.y = 0;
21302 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21303 vkEndCommandBuffer(command_buffer[1]);
21304 }
21305 {
21306 VkSubmitInfo submit_info{};
21307 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21308 submit_info.commandBufferCount = 1;
21309 submit_info.pCommandBuffers = &command_buffer[0];
21310 submit_info.signalSemaphoreCount = 1;
21311 submit_info.pSignalSemaphores = &semaphore;
21312 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21313 }
21314 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021315 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021316 VkSubmitInfo submit_info{};
21317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21318 submit_info.commandBufferCount = 1;
21319 submit_info.pCommandBuffers = &command_buffer[1];
21320 submit_info.waitSemaphoreCount = 1;
21321 submit_info.pWaitSemaphores = &semaphore;
21322 submit_info.pWaitDstStageMask = flags;
21323 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21324 }
21325
21326 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21327 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21328
21329 vkDestroyFence(m_device->device(), fence, nullptr);
21330 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21331 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21332 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21333
21334 m_errorMonitor->VerifyNotFound();
21335}
21336
21337TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021338 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021339 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021340 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021341 return;
21342 }
21343
21344 VkResult err;
21345
21346 m_errorMonitor->ExpectSuccess();
21347
21348 VkQueue q0 = m_device->m_queue;
21349 VkQueue q1 = nullptr;
21350 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21351 ASSERT_NE(q1, nullptr);
21352
21353 // An (empty) command buffer. We must have work in the first submission --
21354 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021355 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021356 VkCommandPool pool;
21357 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21358 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021359 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21360 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021361 VkCommandBuffer cb;
21362 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21363 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021364 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021365 err = vkBeginCommandBuffer(cb, &cbbi);
21366 ASSERT_VK_SUCCESS(err);
21367 err = vkEndCommandBuffer(cb);
21368 ASSERT_VK_SUCCESS(err);
21369
21370 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021371 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021372 VkSemaphore s;
21373 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21374 ASSERT_VK_SUCCESS(err);
21375
21376 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021377 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021378
21379 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21380 ASSERT_VK_SUCCESS(err);
21381
21382 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021383 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021384 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021385
21386 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21387 ASSERT_VK_SUCCESS(err);
21388
21389 // Wait for q0 idle
21390 err = vkQueueWaitIdle(q0);
21391 ASSERT_VK_SUCCESS(err);
21392
21393 // Command buffer should have been completed (it was on q0); reset the pool.
21394 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21395
21396 m_errorMonitor->VerifyNotFound();
21397
21398 // Force device completely idle and clean up resources
21399 vkDeviceWaitIdle(m_device->device());
21400 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21401 vkDestroySemaphore(m_device->device(), s, nullptr);
21402}
21403
21404// This is a positive test. No errors should be generated.
21405TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021406 TEST_DESCRIPTION(
21407 "Two command buffers, each in a separate QueueSubmit call "
21408 "submitted on separate queues, the second having a fence, "
21409 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021410
Tony Barbour1fa09702017-03-16 12:09:08 -060021411 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021412 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021413
21414 m_errorMonitor->ExpectSuccess();
21415
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021416 VkFence fence;
21417 VkFenceCreateInfo fence_create_info{};
21418 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21419 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21420
21421 VkSemaphore semaphore;
21422 VkSemaphoreCreateInfo semaphore_create_info{};
21423 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21424 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21425
21426 VkCommandPool command_pool;
21427 VkCommandPoolCreateInfo pool_create_info{};
21428 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21429 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21430 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21431 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21432
21433 VkCommandBuffer command_buffer[2];
21434 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21435 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21436 command_buffer_allocate_info.commandPool = command_pool;
21437 command_buffer_allocate_info.commandBufferCount = 2;
21438 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21439 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21440
21441 VkQueue queue = VK_NULL_HANDLE;
21442 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21443
21444 {
21445 VkCommandBufferBeginInfo begin_info{};
21446 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21447 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21448
21449 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 -070021450 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021451
21452 VkViewport viewport{};
21453 viewport.maxDepth = 1.0f;
21454 viewport.minDepth = 0.0f;
21455 viewport.width = 512;
21456 viewport.height = 512;
21457 viewport.x = 0;
21458 viewport.y = 0;
21459 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21460 vkEndCommandBuffer(command_buffer[0]);
21461 }
21462 {
21463 VkCommandBufferBeginInfo begin_info{};
21464 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21465 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21466
21467 VkViewport viewport{};
21468 viewport.maxDepth = 1.0f;
21469 viewport.minDepth = 0.0f;
21470 viewport.width = 512;
21471 viewport.height = 512;
21472 viewport.x = 0;
21473 viewport.y = 0;
21474 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21475 vkEndCommandBuffer(command_buffer[1]);
21476 }
21477 {
21478 VkSubmitInfo submit_info{};
21479 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21480 submit_info.commandBufferCount = 1;
21481 submit_info.pCommandBuffers = &command_buffer[0];
21482 submit_info.signalSemaphoreCount = 1;
21483 submit_info.pSignalSemaphores = &semaphore;
21484 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21485 }
21486 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021487 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021488 VkSubmitInfo submit_info{};
21489 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21490 submit_info.commandBufferCount = 1;
21491 submit_info.pCommandBuffers = &command_buffer[1];
21492 submit_info.waitSemaphoreCount = 1;
21493 submit_info.pWaitSemaphores = &semaphore;
21494 submit_info.pWaitDstStageMask = flags;
21495 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21496 }
21497
21498 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21499
21500 vkDestroyFence(m_device->device(), fence, nullptr);
21501 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21502 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21503 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21504
21505 m_errorMonitor->VerifyNotFound();
21506}
21507
21508// This is a positive test. No errors should be generated.
21509TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021510 TEST_DESCRIPTION(
21511 "Two command buffers, each in a separate QueueSubmit call "
21512 "on the same queue, sharing a signal/wait semaphore, the "
21513 "second having a fence, "
21514 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021515
21516 m_errorMonitor->ExpectSuccess();
21517
Tony Barbour1fa09702017-03-16 12:09:08 -060021518 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021519 VkFence fence;
21520 VkFenceCreateInfo fence_create_info{};
21521 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21522 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21523
21524 VkSemaphore semaphore;
21525 VkSemaphoreCreateInfo semaphore_create_info{};
21526 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21527 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21528
21529 VkCommandPool command_pool;
21530 VkCommandPoolCreateInfo pool_create_info{};
21531 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21532 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21533 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21534 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21535
21536 VkCommandBuffer command_buffer[2];
21537 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21538 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21539 command_buffer_allocate_info.commandPool = command_pool;
21540 command_buffer_allocate_info.commandBufferCount = 2;
21541 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21542 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21543
21544 {
21545 VkCommandBufferBeginInfo begin_info{};
21546 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21547 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21548
21549 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 -070021550 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021551
21552 VkViewport viewport{};
21553 viewport.maxDepth = 1.0f;
21554 viewport.minDepth = 0.0f;
21555 viewport.width = 512;
21556 viewport.height = 512;
21557 viewport.x = 0;
21558 viewport.y = 0;
21559 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21560 vkEndCommandBuffer(command_buffer[0]);
21561 }
21562 {
21563 VkCommandBufferBeginInfo begin_info{};
21564 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21565 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21566
21567 VkViewport viewport{};
21568 viewport.maxDepth = 1.0f;
21569 viewport.minDepth = 0.0f;
21570 viewport.width = 512;
21571 viewport.height = 512;
21572 viewport.x = 0;
21573 viewport.y = 0;
21574 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21575 vkEndCommandBuffer(command_buffer[1]);
21576 }
21577 {
21578 VkSubmitInfo submit_info{};
21579 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21580 submit_info.commandBufferCount = 1;
21581 submit_info.pCommandBuffers = &command_buffer[0];
21582 submit_info.signalSemaphoreCount = 1;
21583 submit_info.pSignalSemaphores = &semaphore;
21584 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21585 }
21586 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021587 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021588 VkSubmitInfo submit_info{};
21589 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21590 submit_info.commandBufferCount = 1;
21591 submit_info.pCommandBuffers = &command_buffer[1];
21592 submit_info.waitSemaphoreCount = 1;
21593 submit_info.pWaitSemaphores = &semaphore;
21594 submit_info.pWaitDstStageMask = flags;
21595 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21596 }
21597
21598 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21599
21600 vkDestroyFence(m_device->device(), fence, nullptr);
21601 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21602 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21603 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21604
21605 m_errorMonitor->VerifyNotFound();
21606}
21607
21608// This is a positive test. No errors should be generated.
21609TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021610 TEST_DESCRIPTION(
21611 "Two command buffers, each in a separate QueueSubmit call "
21612 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21613 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021614
21615 m_errorMonitor->ExpectSuccess();
21616
Tony Barbour1fa09702017-03-16 12:09:08 -060021617 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021618 VkFence fence;
21619 VkFenceCreateInfo fence_create_info{};
21620 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21621 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21622
21623 VkCommandPool command_pool;
21624 VkCommandPoolCreateInfo pool_create_info{};
21625 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21626 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21627 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21628 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21629
21630 VkCommandBuffer command_buffer[2];
21631 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21632 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21633 command_buffer_allocate_info.commandPool = command_pool;
21634 command_buffer_allocate_info.commandBufferCount = 2;
21635 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21636 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21637
21638 {
21639 VkCommandBufferBeginInfo begin_info{};
21640 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21641 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21642
21643 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 -070021644 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021645
21646 VkViewport viewport{};
21647 viewport.maxDepth = 1.0f;
21648 viewport.minDepth = 0.0f;
21649 viewport.width = 512;
21650 viewport.height = 512;
21651 viewport.x = 0;
21652 viewport.y = 0;
21653 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21654 vkEndCommandBuffer(command_buffer[0]);
21655 }
21656 {
21657 VkCommandBufferBeginInfo begin_info{};
21658 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21659 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21660
21661 VkViewport viewport{};
21662 viewport.maxDepth = 1.0f;
21663 viewport.minDepth = 0.0f;
21664 viewport.width = 512;
21665 viewport.height = 512;
21666 viewport.x = 0;
21667 viewport.y = 0;
21668 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21669 vkEndCommandBuffer(command_buffer[1]);
21670 }
21671 {
21672 VkSubmitInfo submit_info{};
21673 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21674 submit_info.commandBufferCount = 1;
21675 submit_info.pCommandBuffers = &command_buffer[0];
21676 submit_info.signalSemaphoreCount = 0;
21677 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21678 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21679 }
21680 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021681 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021682 VkSubmitInfo submit_info{};
21683 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21684 submit_info.commandBufferCount = 1;
21685 submit_info.pCommandBuffers = &command_buffer[1];
21686 submit_info.waitSemaphoreCount = 0;
21687 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21688 submit_info.pWaitDstStageMask = flags;
21689 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21690 }
21691
21692 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21693
21694 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21695 ASSERT_VK_SUCCESS(err);
21696
21697 vkDestroyFence(m_device->device(), fence, nullptr);
21698 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21699 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21700
21701 m_errorMonitor->VerifyNotFound();
21702}
21703
21704// This is a positive test. No errors should be generated.
21705TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021706 TEST_DESCRIPTION(
21707 "Two command buffers, each in a separate QueueSubmit call "
21708 "on the same queue, the second having a fence, followed "
21709 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021710
21711 m_errorMonitor->ExpectSuccess();
21712
Tony Barbour1fa09702017-03-16 12:09:08 -060021713 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021714 VkFence fence;
21715 VkFenceCreateInfo fence_create_info{};
21716 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21717 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21718
21719 VkCommandPool command_pool;
21720 VkCommandPoolCreateInfo pool_create_info{};
21721 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21722 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21723 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21724 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21725
21726 VkCommandBuffer command_buffer[2];
21727 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21728 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21729 command_buffer_allocate_info.commandPool = command_pool;
21730 command_buffer_allocate_info.commandBufferCount = 2;
21731 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21732 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21733
21734 {
21735 VkCommandBufferBeginInfo begin_info{};
21736 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21737 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21738
21739 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 -070021740 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021741
21742 VkViewport viewport{};
21743 viewport.maxDepth = 1.0f;
21744 viewport.minDepth = 0.0f;
21745 viewport.width = 512;
21746 viewport.height = 512;
21747 viewport.x = 0;
21748 viewport.y = 0;
21749 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21750 vkEndCommandBuffer(command_buffer[0]);
21751 }
21752 {
21753 VkCommandBufferBeginInfo begin_info{};
21754 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21755 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21756
21757 VkViewport viewport{};
21758 viewport.maxDepth = 1.0f;
21759 viewport.minDepth = 0.0f;
21760 viewport.width = 512;
21761 viewport.height = 512;
21762 viewport.x = 0;
21763 viewport.y = 0;
21764 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21765 vkEndCommandBuffer(command_buffer[1]);
21766 }
21767 {
21768 VkSubmitInfo submit_info{};
21769 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21770 submit_info.commandBufferCount = 1;
21771 submit_info.pCommandBuffers = &command_buffer[0];
21772 submit_info.signalSemaphoreCount = 0;
21773 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21774 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21775 }
21776 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021777 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021778 VkSubmitInfo submit_info{};
21779 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21780 submit_info.commandBufferCount = 1;
21781 submit_info.pCommandBuffers = &command_buffer[1];
21782 submit_info.waitSemaphoreCount = 0;
21783 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21784 submit_info.pWaitDstStageMask = flags;
21785 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21786 }
21787
21788 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21789
21790 vkDestroyFence(m_device->device(), fence, nullptr);
21791 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21792 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21793
21794 m_errorMonitor->VerifyNotFound();
21795}
21796
21797// This is a positive test. No errors should be generated.
21798TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021799 TEST_DESCRIPTION(
21800 "Two command buffers each in a separate SubmitInfo sent in a single "
21801 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021802 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021803
21804 m_errorMonitor->ExpectSuccess();
21805
21806 VkFence fence;
21807 VkFenceCreateInfo fence_create_info{};
21808 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21809 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21810
21811 VkSemaphore semaphore;
21812 VkSemaphoreCreateInfo semaphore_create_info{};
21813 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21814 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21815
21816 VkCommandPool command_pool;
21817 VkCommandPoolCreateInfo pool_create_info{};
21818 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21819 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21820 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21821 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21822
21823 VkCommandBuffer command_buffer[2];
21824 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21825 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21826 command_buffer_allocate_info.commandPool = command_pool;
21827 command_buffer_allocate_info.commandBufferCount = 2;
21828 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21829 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21830
21831 {
21832 VkCommandBufferBeginInfo begin_info{};
21833 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21834 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21835
21836 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 -070021837 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021838
21839 VkViewport viewport{};
21840 viewport.maxDepth = 1.0f;
21841 viewport.minDepth = 0.0f;
21842 viewport.width = 512;
21843 viewport.height = 512;
21844 viewport.x = 0;
21845 viewport.y = 0;
21846 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21847 vkEndCommandBuffer(command_buffer[0]);
21848 }
21849 {
21850 VkCommandBufferBeginInfo begin_info{};
21851 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21852 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21853
21854 VkViewport viewport{};
21855 viewport.maxDepth = 1.0f;
21856 viewport.minDepth = 0.0f;
21857 viewport.width = 512;
21858 viewport.height = 512;
21859 viewport.x = 0;
21860 viewport.y = 0;
21861 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21862 vkEndCommandBuffer(command_buffer[1]);
21863 }
21864 {
21865 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021866 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021867
21868 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21869 submit_info[0].pNext = NULL;
21870 submit_info[0].commandBufferCount = 1;
21871 submit_info[0].pCommandBuffers = &command_buffer[0];
21872 submit_info[0].signalSemaphoreCount = 1;
21873 submit_info[0].pSignalSemaphores = &semaphore;
21874 submit_info[0].waitSemaphoreCount = 0;
21875 submit_info[0].pWaitSemaphores = NULL;
21876 submit_info[0].pWaitDstStageMask = 0;
21877
21878 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21879 submit_info[1].pNext = NULL;
21880 submit_info[1].commandBufferCount = 1;
21881 submit_info[1].pCommandBuffers = &command_buffer[1];
21882 submit_info[1].waitSemaphoreCount = 1;
21883 submit_info[1].pWaitSemaphores = &semaphore;
21884 submit_info[1].pWaitDstStageMask = flags;
21885 submit_info[1].signalSemaphoreCount = 0;
21886 submit_info[1].pSignalSemaphores = NULL;
21887 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21888 }
21889
21890 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21891
21892 vkDestroyFence(m_device->device(), fence, nullptr);
21893 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21894 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21895 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21896
21897 m_errorMonitor->VerifyNotFound();
21898}
21899
21900TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21901 m_errorMonitor->ExpectSuccess();
21902
Tony Barbour1fa09702017-03-16 12:09:08 -060021903 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021904 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21905
Tony Barbour552f6c02016-12-21 14:34:07 -070021906 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021907
21908 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21909 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21910 m_errorMonitor->VerifyNotFound();
21911 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21912 m_errorMonitor->VerifyNotFound();
21913 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21914 m_errorMonitor->VerifyNotFound();
21915
21916 m_commandBuffer->EndCommandBuffer();
21917 m_errorMonitor->VerifyNotFound();
21918}
21919
21920TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021921 TEST_DESCRIPTION(
21922 "Positive test where we create a renderpass with an "
21923 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21924 "has a valid layout, and a second subpass then uses a "
21925 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021926 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021927 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021928 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021929 if (!depth_format) {
21930 printf(" No Depth + Stencil format found. Skipped.\n");
21931 return;
21932 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021933
21934 VkAttachmentReference attach[2] = {};
21935 attach[0].attachment = 0;
21936 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21937 attach[1].attachment = 0;
21938 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21939 VkSubpassDescription subpasses[2] = {};
21940 // First subpass clears DS attach on load
21941 subpasses[0].pDepthStencilAttachment = &attach[0];
21942 // 2nd subpass reads in DS as input attachment
21943 subpasses[1].inputAttachmentCount = 1;
21944 subpasses[1].pInputAttachments = &attach[1];
21945 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021946 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021947 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21948 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21949 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21950 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21951 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21952 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21953 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21954 VkRenderPassCreateInfo rpci = {};
21955 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21956 rpci.attachmentCount = 1;
21957 rpci.pAttachments = &attach_desc;
21958 rpci.subpassCount = 2;
21959 rpci.pSubpasses = subpasses;
21960
21961 // Now create RenderPass and verify no errors
21962 VkRenderPass rp;
21963 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21964 m_errorMonitor->VerifyNotFound();
21965
21966 vkDestroyRenderPass(m_device->device(), rp, NULL);
21967}
21968
Tobin Ehlis01103de2017-02-16 13:22:47 -070021969TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21970 TEST_DESCRIPTION(
21971 "Create a render pass with depth-stencil attachment where layout transition "
21972 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21973 "transition has correctly occurred at queue submit time with no validation errors.");
21974
Tony Barbour1fa09702017-03-16 12:09:08 -060021975 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060021976 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021977 if (!depth_format) {
21978 printf(" No Depth + Stencil format found. Skipped.\n");
21979 return;
21980 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021981 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021982 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021983 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21984 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021985 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021986 return;
21987 }
21988
21989 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021990 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21991
21992 // A renderpass with one depth/stencil attachment.
21993 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021994 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021995 VK_SAMPLE_COUNT_1_BIT,
21996 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21997 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21998 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21999 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22000 VK_IMAGE_LAYOUT_UNDEFINED,
22001 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22002
22003 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22004
22005 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22006
22007 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22008
22009 VkRenderPass rp;
22010 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22011 ASSERT_VK_SUCCESS(err);
22012 // A compatible ds image.
22013 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022014 image.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis01103de2017-02-16 13:22:47 -070022015 ASSERT_TRUE(image.initialized());
22016
22017 VkImageViewCreateInfo ivci = {
22018 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22019 nullptr,
22020 0,
22021 image.handle(),
22022 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022023 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022024 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22025 VK_COMPONENT_SWIZZLE_IDENTITY},
22026 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22027 };
22028 VkImageView view;
22029 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22030 ASSERT_VK_SUCCESS(err);
22031
22032 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22033 VkFramebuffer fb;
22034 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22035 ASSERT_VK_SUCCESS(err);
22036
22037 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22038 m_commandBuffer->BeginCommandBuffer();
22039 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22040 vkCmdEndRenderPass(m_commandBuffer->handle());
22041 m_commandBuffer->EndCommandBuffer();
22042 QueueCommandBuffer(false);
22043 m_errorMonitor->VerifyNotFound();
22044
22045 // Cleanup
22046 vkDestroyImageView(m_device->device(), view, NULL);
22047 vkDestroyRenderPass(m_device->device(), rp, NULL);
22048 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22049}
22050
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022051TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022052 TEST_DESCRIPTION(
22053 "Test that pipeline validation accepts matrices passed "
22054 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022055 m_errorMonitor->ExpectSuccess();
22056
Tony Barbour1fa09702017-03-16 12:09:08 -060022057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22059
22060 VkVertexInputBindingDescription input_binding;
22061 memset(&input_binding, 0, sizeof(input_binding));
22062
22063 VkVertexInputAttributeDescription input_attribs[2];
22064 memset(input_attribs, 0, sizeof(input_attribs));
22065
22066 for (int i = 0; i < 2; i++) {
22067 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22068 input_attribs[i].location = i;
22069 }
22070
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022071 char const *vsSource =
22072 "#version 450\n"
22073 "\n"
22074 "layout(location=0) in mat2x4 x;\n"
22075 "out gl_PerVertex {\n"
22076 " vec4 gl_Position;\n"
22077 "};\n"
22078 "void main(){\n"
22079 " gl_Position = x[0] + x[1];\n"
22080 "}\n";
22081 char const *fsSource =
22082 "#version 450\n"
22083 "\n"
22084 "layout(location=0) out vec4 color;\n"
22085 "void main(){\n"
22086 " color = vec4(1);\n"
22087 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022088
22089 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22090 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22091
22092 VkPipelineObj pipe(m_device);
22093 pipe.AddColorAttachment();
22094 pipe.AddShader(&vs);
22095 pipe.AddShader(&fs);
22096
22097 pipe.AddVertexInputBindings(&input_binding, 1);
22098 pipe.AddVertexInputAttribs(input_attribs, 2);
22099
22100 VkDescriptorSetObj descriptorSet(m_device);
22101 descriptorSet.AppendDummy();
22102 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22103
22104 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22105
22106 /* expect success */
22107 m_errorMonitor->VerifyNotFound();
22108}
22109
22110TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22111 m_errorMonitor->ExpectSuccess();
22112
Tony Barbour1fa09702017-03-16 12:09:08 -060022113 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022114 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22115
22116 VkVertexInputBindingDescription input_binding;
22117 memset(&input_binding, 0, sizeof(input_binding));
22118
22119 VkVertexInputAttributeDescription input_attribs[2];
22120 memset(input_attribs, 0, sizeof(input_attribs));
22121
22122 for (int i = 0; i < 2; i++) {
22123 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22124 input_attribs[i].location = i;
22125 }
22126
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022127 char const *vsSource =
22128 "#version 450\n"
22129 "\n"
22130 "layout(location=0) in vec4 x[2];\n"
22131 "out gl_PerVertex {\n"
22132 " vec4 gl_Position;\n"
22133 "};\n"
22134 "void main(){\n"
22135 " gl_Position = x[0] + x[1];\n"
22136 "}\n";
22137 char const *fsSource =
22138 "#version 450\n"
22139 "\n"
22140 "layout(location=0) out vec4 color;\n"
22141 "void main(){\n"
22142 " color = vec4(1);\n"
22143 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022144
22145 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22146 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22147
22148 VkPipelineObj pipe(m_device);
22149 pipe.AddColorAttachment();
22150 pipe.AddShader(&vs);
22151 pipe.AddShader(&fs);
22152
22153 pipe.AddVertexInputBindings(&input_binding, 1);
22154 pipe.AddVertexInputAttribs(input_attribs, 2);
22155
22156 VkDescriptorSetObj descriptorSet(m_device);
22157 descriptorSet.AppendDummy();
22158 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22159
22160 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22161
22162 m_errorMonitor->VerifyNotFound();
22163}
22164
22165TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022166 TEST_DESCRIPTION(
22167 "Test that pipeline validation accepts consuming a vertex attribute "
22168 "through multiple vertex shader inputs, each consuming a different "
22169 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022170 m_errorMonitor->ExpectSuccess();
22171
Tony Barbour1fa09702017-03-16 12:09:08 -060022172 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22174
22175 VkVertexInputBindingDescription input_binding;
22176 memset(&input_binding, 0, sizeof(input_binding));
22177
22178 VkVertexInputAttributeDescription input_attribs[3];
22179 memset(input_attribs, 0, sizeof(input_attribs));
22180
22181 for (int i = 0; i < 3; i++) {
22182 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22183 input_attribs[i].location = i;
22184 }
22185
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022186 char const *vsSource =
22187 "#version 450\n"
22188 "\n"
22189 "layout(location=0) in vec4 x;\n"
22190 "layout(location=1) in vec3 y1;\n"
22191 "layout(location=1, component=3) in float y2;\n"
22192 "layout(location=2) in vec4 z;\n"
22193 "out gl_PerVertex {\n"
22194 " vec4 gl_Position;\n"
22195 "};\n"
22196 "void main(){\n"
22197 " gl_Position = x + vec4(y1, y2) + z;\n"
22198 "}\n";
22199 char const *fsSource =
22200 "#version 450\n"
22201 "\n"
22202 "layout(location=0) out vec4 color;\n"
22203 "void main(){\n"
22204 " color = vec4(1);\n"
22205 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022206
22207 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22208 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22209
22210 VkPipelineObj pipe(m_device);
22211 pipe.AddColorAttachment();
22212 pipe.AddShader(&vs);
22213 pipe.AddShader(&fs);
22214
22215 pipe.AddVertexInputBindings(&input_binding, 1);
22216 pipe.AddVertexInputAttribs(input_attribs, 3);
22217
22218 VkDescriptorSetObj descriptorSet(m_device);
22219 descriptorSet.AppendDummy();
22220 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22221
22222 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22223
22224 m_errorMonitor->VerifyNotFound();
22225}
22226
22227TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22228 m_errorMonitor->ExpectSuccess();
22229
Tony Barbour1fa09702017-03-16 12:09:08 -060022230 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22232
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022233 char const *vsSource =
22234 "#version 450\n"
22235 "out gl_PerVertex {\n"
22236 " vec4 gl_Position;\n"
22237 "};\n"
22238 "void main(){\n"
22239 " gl_Position = vec4(0);\n"
22240 "}\n";
22241 char const *fsSource =
22242 "#version 450\n"
22243 "\n"
22244 "layout(location=0) out vec4 color;\n"
22245 "void main(){\n"
22246 " color = vec4(1);\n"
22247 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022248
22249 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22250 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22251
22252 VkPipelineObj pipe(m_device);
22253 pipe.AddColorAttachment();
22254 pipe.AddShader(&vs);
22255 pipe.AddShader(&fs);
22256
22257 VkDescriptorSetObj descriptorSet(m_device);
22258 descriptorSet.AppendDummy();
22259 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22260
22261 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22262
22263 m_errorMonitor->VerifyNotFound();
22264}
22265
22266TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022267 TEST_DESCRIPTION(
22268 "Test that pipeline validation accepts the relaxed type matching rules "
22269 "set out in 14.1.3: fundamental type must match, and producer side must "
22270 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022271 m_errorMonitor->ExpectSuccess();
22272
22273 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22274
Tony Barbour1fa09702017-03-16 12:09:08 -060022275 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22277
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022278 char const *vsSource =
22279 "#version 450\n"
22280 "out gl_PerVertex {\n"
22281 " vec4 gl_Position;\n"
22282 "};\n"
22283 "layout(location=0) out vec3 x;\n"
22284 "layout(location=1) out ivec3 y;\n"
22285 "layout(location=2) out vec3 z;\n"
22286 "void main(){\n"
22287 " gl_Position = vec4(0);\n"
22288 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22289 "}\n";
22290 char const *fsSource =
22291 "#version 450\n"
22292 "\n"
22293 "layout(location=0) out vec4 color;\n"
22294 "layout(location=0) in float x;\n"
22295 "layout(location=1) flat in int y;\n"
22296 "layout(location=2) in vec2 z;\n"
22297 "void main(){\n"
22298 " color = vec4(1 + x + y + z.x);\n"
22299 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022300
22301 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22302 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22303
22304 VkPipelineObj pipe(m_device);
22305 pipe.AddColorAttachment();
22306 pipe.AddShader(&vs);
22307 pipe.AddShader(&fs);
22308
22309 VkDescriptorSetObj descriptorSet(m_device);
22310 descriptorSet.AppendDummy();
22311 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22312
22313 VkResult err = VK_SUCCESS;
22314 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22315 ASSERT_VK_SUCCESS(err);
22316
22317 m_errorMonitor->VerifyNotFound();
22318}
22319
22320TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022321 TEST_DESCRIPTION(
22322 "Test that pipeline validation accepts per-vertex variables "
22323 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022324 m_errorMonitor->ExpectSuccess();
22325
Tony Barbour1fa09702017-03-16 12:09:08 -060022326 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22328
22329 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022330 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022331 return;
22332 }
22333
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022334 char const *vsSource =
22335 "#version 450\n"
22336 "void main(){}\n";
22337 char const *tcsSource =
22338 "#version 450\n"
22339 "layout(location=0) out int x[];\n"
22340 "layout(vertices=3) out;\n"
22341 "void main(){\n"
22342 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22343 " gl_TessLevelInner[0] = 1;\n"
22344 " x[gl_InvocationID] = gl_InvocationID;\n"
22345 "}\n";
22346 char const *tesSource =
22347 "#version 450\n"
22348 "layout(triangles, equal_spacing, cw) in;\n"
22349 "layout(location=0) in int x[];\n"
22350 "out gl_PerVertex { vec4 gl_Position; };\n"
22351 "void main(){\n"
22352 " gl_Position.xyz = gl_TessCoord;\n"
22353 " gl_Position.w = x[0] + x[1] + x[2];\n"
22354 "}\n";
22355 char const *fsSource =
22356 "#version 450\n"
22357 "layout(location=0) out vec4 color;\n"
22358 "void main(){\n"
22359 " color = vec4(1);\n"
22360 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022361
22362 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22363 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22364 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22365 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22366
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022367 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22368 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022369
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022370 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022371
22372 VkPipelineObj pipe(m_device);
22373 pipe.SetInputAssembly(&iasci);
22374 pipe.SetTessellation(&tsci);
22375 pipe.AddColorAttachment();
22376 pipe.AddShader(&vs);
22377 pipe.AddShader(&tcs);
22378 pipe.AddShader(&tes);
22379 pipe.AddShader(&fs);
22380
22381 VkDescriptorSetObj descriptorSet(m_device);
22382 descriptorSet.AppendDummy();
22383 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22384
22385 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22386
22387 m_errorMonitor->VerifyNotFound();
22388}
22389
22390TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022391 TEST_DESCRIPTION(
22392 "Test that pipeline validation accepts a user-defined "
22393 "interface block passed into the geometry shader. This "
22394 "is interesting because the 'extra' array level is not "
22395 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022396 m_errorMonitor->ExpectSuccess();
22397
Tony Barbour1fa09702017-03-16 12:09:08 -060022398 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22400
22401 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022402 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022403 return;
22404 }
22405
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022406 char const *vsSource =
22407 "#version 450\n"
22408 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22409 "void main(){\n"
22410 " vs_out.x = vec4(1);\n"
22411 "}\n";
22412 char const *gsSource =
22413 "#version 450\n"
22414 "layout(triangles) in;\n"
22415 "layout(triangle_strip, max_vertices=3) out;\n"
22416 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22417 "out gl_PerVertex { vec4 gl_Position; };\n"
22418 "void main() {\n"
22419 " gl_Position = gs_in[0].x;\n"
22420 " EmitVertex();\n"
22421 "}\n";
22422 char const *fsSource =
22423 "#version 450\n"
22424 "layout(location=0) out vec4 color;\n"
22425 "void main(){\n"
22426 " color = vec4(1);\n"
22427 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022428
22429 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22430 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22431 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22432
22433 VkPipelineObj pipe(m_device);
22434 pipe.AddColorAttachment();
22435 pipe.AddShader(&vs);
22436 pipe.AddShader(&gs);
22437 pipe.AddShader(&fs);
22438
22439 VkDescriptorSetObj descriptorSet(m_device);
22440 descriptorSet.AppendDummy();
22441 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22442
22443 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22444
22445 m_errorMonitor->VerifyNotFound();
22446}
22447
22448TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022449 TEST_DESCRIPTION(
22450 "Test that pipeline validation accepts basic use of 64bit vertex "
22451 "attributes. This is interesting because they consume multiple "
22452 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022453 m_errorMonitor->ExpectSuccess();
22454
Tony Barbour1fa09702017-03-16 12:09:08 -060022455 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22457
22458 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022459 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022460 return;
22461 }
22462
22463 VkVertexInputBindingDescription input_bindings[1];
22464 memset(input_bindings, 0, sizeof(input_bindings));
22465
22466 VkVertexInputAttributeDescription input_attribs[4];
22467 memset(input_attribs, 0, sizeof(input_attribs));
22468 input_attribs[0].location = 0;
22469 input_attribs[0].offset = 0;
22470 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22471 input_attribs[1].location = 2;
22472 input_attribs[1].offset = 32;
22473 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22474 input_attribs[2].location = 4;
22475 input_attribs[2].offset = 64;
22476 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22477 input_attribs[3].location = 6;
22478 input_attribs[3].offset = 96;
22479 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22480
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022481 char const *vsSource =
22482 "#version 450\n"
22483 "\n"
22484 "layout(location=0) in dmat4 x;\n"
22485 "out gl_PerVertex {\n"
22486 " vec4 gl_Position;\n"
22487 "};\n"
22488 "void main(){\n"
22489 " gl_Position = vec4(x[0][0]);\n"
22490 "}\n";
22491 char const *fsSource =
22492 "#version 450\n"
22493 "\n"
22494 "layout(location=0) out vec4 color;\n"
22495 "void main(){\n"
22496 " color = vec4(1);\n"
22497 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022498
22499 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22500 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22501
22502 VkPipelineObj pipe(m_device);
22503 pipe.AddColorAttachment();
22504 pipe.AddShader(&vs);
22505 pipe.AddShader(&fs);
22506
22507 pipe.AddVertexInputBindings(input_bindings, 1);
22508 pipe.AddVertexInputAttribs(input_attribs, 4);
22509
22510 VkDescriptorSetObj descriptorSet(m_device);
22511 descriptorSet.AppendDummy();
22512 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22513
22514 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22515
22516 m_errorMonitor->VerifyNotFound();
22517}
22518
22519TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22520 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22521 m_errorMonitor->ExpectSuccess();
22522
Tony Barbour1fa09702017-03-16 12:09:08 -060022523 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022524
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022525 char const *vsSource =
22526 "#version 450\n"
22527 "\n"
22528 "out gl_PerVertex {\n"
22529 " vec4 gl_Position;\n"
22530 "};\n"
22531 "void main(){\n"
22532 " gl_Position = vec4(1);\n"
22533 "}\n";
22534 char const *fsSource =
22535 "#version 450\n"
22536 "\n"
22537 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22538 "layout(location=0) out vec4 color;\n"
22539 "void main() {\n"
22540 " color = subpassLoad(x);\n"
22541 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022542
22543 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22544 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22545
22546 VkPipelineObj pipe(m_device);
22547 pipe.AddShader(&vs);
22548 pipe.AddShader(&fs);
22549 pipe.AddColorAttachment();
22550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22551
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022552 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22553 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022554 VkDescriptorSetLayout dsl;
22555 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22556 ASSERT_VK_SUCCESS(err);
22557
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022558 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022559 VkPipelineLayout pl;
22560 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22561 ASSERT_VK_SUCCESS(err);
22562
22563 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022564 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22565 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22566 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22567 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22568 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 -060022569 };
22570 VkAttachmentReference color = {
22571 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22572 };
22573 VkAttachmentReference input = {
22574 1, VK_IMAGE_LAYOUT_GENERAL,
22575 };
22576
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022577 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022578
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022579 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022580 VkRenderPass rp;
22581 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22582 ASSERT_VK_SUCCESS(err);
22583
22584 // should be OK. would go wrong here if it's going to...
22585 pipe.CreateVKPipeline(pl, rp);
22586
22587 m_errorMonitor->VerifyNotFound();
22588
22589 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22590 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22591 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22592}
22593
22594TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022595 TEST_DESCRIPTION(
22596 "Test that pipeline validation accepts a compute pipeline which declares a "
22597 "descriptor-backed resource which is not provided, but the shader does not "
22598 "statically use it. This is interesting because it requires compute pipelines "
22599 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022600 m_errorMonitor->ExpectSuccess();
22601
Tony Barbour1fa09702017-03-16 12:09:08 -060022602 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022603
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022604 char const *csSource =
22605 "#version 450\n"
22606 "\n"
22607 "layout(local_size_x=1) in;\n"
22608 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22609 "void main(){\n"
22610 " // x is not used.\n"
22611 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022612
22613 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22614
22615 VkDescriptorSetObj descriptorSet(m_device);
22616 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22617
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022618 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22619 nullptr,
22620 0,
22621 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22622 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22623 descriptorSet.GetPipelineLayout(),
22624 VK_NULL_HANDLE,
22625 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022626
22627 VkPipeline pipe;
22628 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22629
22630 m_errorMonitor->VerifyNotFound();
22631
22632 if (err == VK_SUCCESS) {
22633 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22634 }
22635}
22636
22637TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022638 TEST_DESCRIPTION(
22639 "Test that pipeline validation accepts a shader consuming only the "
22640 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022641 m_errorMonitor->ExpectSuccess();
22642
Tony Barbour1fa09702017-03-16 12:09:08 -060022643 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022644
22645 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022646 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22647 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22648 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022649 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022650 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022651 VkDescriptorSetLayout dsl;
22652 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22653 ASSERT_VK_SUCCESS(err);
22654
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022655 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022656 VkPipelineLayout pl;
22657 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22658 ASSERT_VK_SUCCESS(err);
22659
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022660 char const *csSource =
22661 "#version 450\n"
22662 "\n"
22663 "layout(local_size_x=1) in;\n"
22664 "layout(set=0, binding=0) uniform sampler s;\n"
22665 "layout(set=0, binding=1) uniform texture2D t;\n"
22666 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22667 "void main() {\n"
22668 " x = texture(sampler2D(t, s), vec2(0));\n"
22669 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022670 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22671
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022672 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22673 nullptr,
22674 0,
22675 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22676 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22677 pl,
22678 VK_NULL_HANDLE,
22679 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022680
22681 VkPipeline pipe;
22682 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22683
22684 m_errorMonitor->VerifyNotFound();
22685
22686 if (err == VK_SUCCESS) {
22687 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22688 }
22689
22690 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22691 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22692}
22693
22694TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022695 TEST_DESCRIPTION(
22696 "Test that pipeline validation accepts a shader consuming only the "
22697 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022698 m_errorMonitor->ExpectSuccess();
22699
Tony Barbour1fa09702017-03-16 12:09:08 -060022700 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022701
22702 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022703 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22704 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22705 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022706 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022707 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022708 VkDescriptorSetLayout dsl;
22709 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22710 ASSERT_VK_SUCCESS(err);
22711
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022712 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022713 VkPipelineLayout pl;
22714 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22715 ASSERT_VK_SUCCESS(err);
22716
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022717 char const *csSource =
22718 "#version 450\n"
22719 "\n"
22720 "layout(local_size_x=1) in;\n"
22721 "layout(set=0, binding=0) uniform texture2D t;\n"
22722 "layout(set=0, binding=1) uniform sampler s;\n"
22723 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22724 "void main() {\n"
22725 " x = texture(sampler2D(t, s), vec2(0));\n"
22726 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022727 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22728
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022729 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22730 nullptr,
22731 0,
22732 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22733 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22734 pl,
22735 VK_NULL_HANDLE,
22736 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022737
22738 VkPipeline pipe;
22739 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22740
22741 m_errorMonitor->VerifyNotFound();
22742
22743 if (err == VK_SUCCESS) {
22744 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22745 }
22746
22747 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22748 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22749}
22750
22751TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022752 TEST_DESCRIPTION(
22753 "Test that pipeline validation accepts a shader consuming "
22754 "both the sampler and the image of a combined image+sampler "
22755 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022756 m_errorMonitor->ExpectSuccess();
22757
Tony Barbour1fa09702017-03-16 12:09:08 -060022758 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022759
22760 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022761 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22762 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022763 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022764 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022765 VkDescriptorSetLayout dsl;
22766 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22767 ASSERT_VK_SUCCESS(err);
22768
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022769 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022770 VkPipelineLayout pl;
22771 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22772 ASSERT_VK_SUCCESS(err);
22773
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022774 char const *csSource =
22775 "#version 450\n"
22776 "\n"
22777 "layout(local_size_x=1) in;\n"
22778 "layout(set=0, binding=0) uniform texture2D t;\n"
22779 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22780 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22781 "void main() {\n"
22782 " x = texture(sampler2D(t, s), vec2(0));\n"
22783 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022784 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22785
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022786 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22787 nullptr,
22788 0,
22789 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22790 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22791 pl,
22792 VK_NULL_HANDLE,
22793 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022794
22795 VkPipeline pipe;
22796 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22797
22798 m_errorMonitor->VerifyNotFound();
22799
22800 if (err == VK_SUCCESS) {
22801 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22802 }
22803
22804 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22805 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22806}
22807
Tony Barbour3ed87a02017-03-15 16:19:02 -060022808TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022809 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22810
Tony Barbour3ed87a02017-03-15 16:19:02 -060022811 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022812 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022813
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022814 // Ensure that extension is available and enabled.
22815 uint32_t extension_count = 0;
22816 bool supports_maintenance1_extension = false;
22817 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22818 ASSERT_VK_SUCCESS(err);
22819 if (extension_count > 0) {
22820 std::vector<VkExtensionProperties> available_extensions(extension_count);
22821
22822 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22823 ASSERT_VK_SUCCESS(err);
22824 for (const auto &extension_props : available_extensions) {
22825 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22826 supports_maintenance1_extension = true;
22827 }
22828 }
22829 }
22830
22831 // Proceed if extension is supported by hardware
22832 if (!supports_maintenance1_extension) {
22833 printf(" Maintenance1 Extension not supported, skipping tests\n");
22834 return;
22835 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022836
22837 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060022838 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022839 VkCommandBuffer cmd_buf;
22840 VkCommandBufferAllocateInfo alloc_info;
22841 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22842 alloc_info.pNext = NULL;
22843 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022844 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022845 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22846 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22847
22848 VkCommandBufferBeginInfo cb_binfo;
22849 cb_binfo.pNext = NULL;
22850 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22851 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22852 cb_binfo.flags = 0;
22853 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22854 // Set Negative height, should give error if Maintenance 1 is not enabled
22855 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22856 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22857 vkEndCommandBuffer(cmd_buf);
22858
22859 m_errorMonitor->VerifyNotFound();
22860}
22861
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060022862TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
22863 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
22864
22865 ASSERT_NO_FATAL_FAILURE(Init());
22866
22867 uint32_t extension_count = 0;
22868 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22869 ASSERT_VK_SUCCESS(err);
22870
22871 if (extension_count > 0) {
22872 std::vector<VkExtensionProperties> available_extensions(extension_count);
22873 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22874 ASSERT_VK_SUCCESS(err);
22875
22876 for (const auto &extension_props : available_extensions) {
22877 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22878 // Create two pNext structures which by themselves would be valid
22879 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22880 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
22881 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22882 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
22883 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22884
22885 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22886 dedicated_buffer_create_info_2.pNext = nullptr;
22887 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
22888
22889 uint32_t queue_family_index = 0;
22890 VkBufferCreateInfo buffer_create_info = {};
22891 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22892 buffer_create_info.pNext = &dedicated_buffer_create_info;
22893 buffer_create_info.size = 1024;
22894 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22895 buffer_create_info.queueFamilyIndexCount = 1;
22896 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22897
22898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
22899 VkBuffer buffer;
22900 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
22901 m_errorMonitor->VerifyFound();
22902 }
22903 }
22904 }
22905}
22906
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022907TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22908 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22909
Tony Barbour1fa09702017-03-16 12:09:08 -060022910 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022911
22912 // Positive test to check parameter_validation and unique_objects support
22913 // for NV_dedicated_allocation
22914 uint32_t extension_count = 0;
22915 bool supports_nv_dedicated_allocation = false;
22916 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22917 ASSERT_VK_SUCCESS(err);
22918
22919 if (extension_count > 0) {
22920 std::vector<VkExtensionProperties> available_extensions(extension_count);
22921
22922 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22923 ASSERT_VK_SUCCESS(err);
22924
22925 for (const auto &extension_props : available_extensions) {
22926 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22927 supports_nv_dedicated_allocation = true;
22928 }
22929 }
22930 }
22931
22932 if (supports_nv_dedicated_allocation) {
22933 m_errorMonitor->ExpectSuccess();
22934
22935 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22936 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22937 dedicated_buffer_create_info.pNext = nullptr;
22938 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22939
22940 uint32_t queue_family_index = 0;
22941 VkBufferCreateInfo buffer_create_info = {};
22942 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22943 buffer_create_info.pNext = &dedicated_buffer_create_info;
22944 buffer_create_info.size = 1024;
22945 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22946 buffer_create_info.queueFamilyIndexCount = 1;
22947 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22948
22949 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022950 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022951 ASSERT_VK_SUCCESS(err);
22952
22953 VkMemoryRequirements memory_reqs;
22954 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22955
22956 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22957 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22958 dedicated_memory_info.pNext = nullptr;
22959 dedicated_memory_info.buffer = buffer;
22960 dedicated_memory_info.image = VK_NULL_HANDLE;
22961
22962 VkMemoryAllocateInfo memory_info = {};
22963 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22964 memory_info.pNext = &dedicated_memory_info;
22965 memory_info.allocationSize = memory_reqs.size;
22966
22967 bool pass;
22968 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22969 ASSERT_TRUE(pass);
22970
22971 VkDeviceMemory buffer_memory;
22972 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22973 ASSERT_VK_SUCCESS(err);
22974
22975 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22976 ASSERT_VK_SUCCESS(err);
22977
22978 vkDestroyBuffer(m_device->device(), buffer, NULL);
22979 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22980
22981 m_errorMonitor->VerifyNotFound();
22982 }
22983}
22984
22985TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22986 VkResult err;
22987
22988 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22989
Tony Barbour1fa09702017-03-16 12:09:08 -060022990 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22992
22993 std::vector<const char *> device_extension_names;
22994 auto features = m_device->phy().features();
22995 // Artificially disable support for non-solid fill modes
22996 features.fillModeNonSolid = false;
22997 // The sacrificial device object
22998 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22999
23000 VkRenderpassObj render_pass(&test_device);
23001
23002 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23003 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23004 pipeline_layout_ci.setLayoutCount = 0;
23005 pipeline_layout_ci.pSetLayouts = NULL;
23006
23007 VkPipelineLayout pipeline_layout;
23008 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23009 ASSERT_VK_SUCCESS(err);
23010
23011 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23012 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23013 rs_ci.pNext = nullptr;
23014 rs_ci.lineWidth = 1.0f;
23015 rs_ci.rasterizerDiscardEnable = true;
23016
23017 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23018 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23019
23020 // Set polygonMode=FILL. No error is expected
23021 m_errorMonitor->ExpectSuccess();
23022 {
23023 VkPipelineObj pipe(&test_device);
23024 pipe.AddShader(&vs);
23025 pipe.AddShader(&fs);
23026 pipe.AddColorAttachment();
23027 // Set polygonMode to a good value
23028 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23029 pipe.SetRasterization(&rs_ci);
23030 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23031 }
23032 m_errorMonitor->VerifyNotFound();
23033
23034 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23035}
23036
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023037#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023038TEST_F(VkPositiveLayerTest, LongFenceChain)
23039{
23040 m_errorMonitor->ExpectSuccess();
23041
Tony Barbour1fa09702017-03-16 12:09:08 -060023042 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023043 VkResult err;
23044
23045 std::vector<VkFence> fences;
23046
23047 const int chainLength = 32768;
23048
23049 for (int i = 0; i < chainLength; i++) {
23050 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23051 VkFence fence;
23052 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23053 ASSERT_VK_SUCCESS(err);
23054
23055 fences.push_back(fence);
23056
23057 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23058 0, nullptr, 0, nullptr };
23059 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23060 ASSERT_VK_SUCCESS(err);
23061
23062 }
23063
23064 // BOOM, stack overflow.
23065 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23066
23067 for (auto fence : fences)
23068 vkDestroyFence(m_device->device(), fence, nullptr);
23069
23070 m_errorMonitor->VerifyNotFound();
23071}
23072#endif
23073
Cody Northrop1242dfd2016-07-13 17:24:59 -060023074#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023075const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023076static bool initialized = false;
23077static bool active = false;
23078
23079// Convert Intents to argv
23080// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023081std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023082 std::vector<std::string> args;
23083 JavaVM &vm = *app.activity->vm;
23084 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023085 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023086
23087 JNIEnv &env = *p_env;
23088 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023089 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023090 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023091 jmethodID get_string_extra_method =
23092 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023093 jvalue get_string_extra_args;
23094 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023095 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023096
23097 std::string args_str;
23098 if (extra_str) {
23099 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23100 args_str = extra_utf;
23101 env.ReleaseStringUTFChars(extra_str, extra_utf);
23102 env.DeleteLocalRef(extra_str);
23103 }
23104
23105 env.DeleteLocalRef(get_string_extra_args.l);
23106 env.DeleteLocalRef(intent);
23107 vm.DetachCurrentThread();
23108
23109 // split args_str
23110 std::stringstream ss(args_str);
23111 std::string arg;
23112 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023113 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023114 }
23115
23116 return args;
23117}
23118
Cody Northropb94529f2017-04-05 13:05:51 -060023119void addFullTestCommentIfPresent(const ::testing::TestInfo& test_info, std::string& error_message) {
23120 const char* const type_param = test_info.type_param();
23121 const char* const value_param = test_info.value_param();
23122
23123 if (type_param != NULL || value_param != NULL) {
23124 error_message.append(", where ");
23125 if (type_param != NULL) {
23126 error_message.append("TypeParam = ").append(type_param);
23127 if (value_param != NULL)
23128 error_message.append(" and ");
23129 }
23130 if (value_param != NULL) {
23131 error_message.append("GetParam() = ").append(value_param);
23132 }
23133 }
23134}
23135
23136// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23137class LogcatPrinter : public ::testing::EmptyTestEventListener {
23138 // Called before a test starts.
23139 virtual void OnTestStart(const ::testing::TestInfo& test_info) {
23140 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23141 }
23142
23143 // Called after a failed assertion or a SUCCEED() invocation.
23144 virtual void OnTestPartResult(const ::testing::TestPartResult& result) {
23145
23146 // If the test part succeeded, we don't need to do anything.
23147 if (result.type() == ::testing::TestPartResult::kSuccess)
23148 return;
23149
23150 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s",
23151 result.failed() ? "*** Failure" : "Success",
23152 result.file_name(),
23153 result.line_number(),
23154 result.summary());
23155 }
23156
23157 // Called after a test ends.
23158 virtual void OnTestEnd(const ::testing::TestInfo& info) {
23159 std::string result;
23160 if (info.result()->Passed()) {
23161 result.append("[ OK ]");
23162 } else {
23163 result.append("[ FAILED ]");
23164 }
23165 result.append(info.test_case_name()).append(".").append(info.name());
23166 if (info.result()->Failed())
23167 addFullTestCommentIfPresent(info, result);
23168
23169 if (::testing::GTEST_FLAG(print_time)) {
23170 std::ostringstream os;
23171 os << info.result()->elapsed_time();
23172 result.append(" (").append(os.str()).append(" ms)");
23173 }
23174
23175 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23176 };
23177};
23178
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023179static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023180
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023181static void processCommand(struct android_app *app, int32_t cmd) {
23182 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023183 case APP_CMD_INIT_WINDOW: {
23184 if (app->window) {
23185 initialized = true;
23186 }
23187 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023188 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023189 case APP_CMD_GAINED_FOCUS: {
23190 active = true;
23191 break;
23192 }
23193 case APP_CMD_LOST_FOCUS: {
23194 active = false;
23195 break;
23196 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023197 }
23198}
23199
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023200void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023201 app_dummy();
23202
Cody Northrop1242dfd2016-07-13 17:24:59 -060023203
23204 int vulkanSupport = InitVulkan();
23205 if (vulkanSupport == 0) {
23206 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23207 return;
23208 }
23209
23210 app->onAppCmd = processCommand;
23211 app->onInputEvent = processInput;
23212
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023213 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023214 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023215 struct android_poll_source *source;
23216 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023217 if (source) {
23218 source->process(app, source);
23219 }
23220
23221 if (app->destroyRequested != 0) {
23222 VkTestFramework::Finish();
23223 return;
23224 }
23225 }
23226
23227 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023228 // Use the following key to send arguments to gtest, i.e.
23229 // --es args "--gtest_filter=-VkLayerTest.foo"
23230 const char key[] = "args";
23231 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023232
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023233 std::string filter = "";
23234 if (args.size() > 0) {
23235 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23236 filter += args[0];
23237 } else {
23238 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23239 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023240
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023241 int argc = 2;
23242 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23243 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023244
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023245 // Route output to files until we can override the gtest output
23246 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23247 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023248
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023249 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023250
23251 ::testing::TestEventListeners& listeners = ::testing::UnitTest::GetInstance()->listeners();
23252 listeners.Append(new LogcatPrinter);
23253
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023254 VkTestFramework::InitArgs(&argc, argv);
23255 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023256
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023257 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023258
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023259 if (result != 0) {
23260 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23261 } else {
23262 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23263 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023264
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023265 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023266
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023267 fclose(stdout);
23268 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023269
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023270 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023271 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023272 }
23273 }
23274}
23275#endif
23276
Tony Barbour300a6082015-04-07 13:44:53 -060023277int main(int argc, char **argv) {
23278 int result;
23279
Cody Northrop8e54a402016-03-08 22:25:52 -070023280#ifdef ANDROID
23281 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023282 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023283#endif
23284
Tony Barbour300a6082015-04-07 13:44:53 -060023285 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023286 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023287
23288 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23289
23290 result = RUN_ALL_TESTS();
23291
Tony Barbour6918cd52015-04-09 12:58:51 -060023292 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023293 return result;
23294}