blob: cb029d929159c03033b2ee95462fbb8ae974cb80 [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");
Mark Lobodzinski74597792017-04-11 15:43:49 -06005330 m_errorMonitor->SetUnexpectedError("Unable to remove RenderPass 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");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006051 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorSet 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 Ehlisaabbcd02017-04-13 14:15:21 -06006074TEST_F(VkLayerTest, ImageDescriptorLayoutMismatch) {
6075 TEST_DESCRIPTION("Update an image sampler with a layout that doesn't match the actual image layout at the image is used.");
6076 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
6077 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.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
6088 ds_pool_ci.maxSets = 1;
6089 ds_pool_ci.poolSizeCount = 1;
6090 ds_pool_ci.pPoolSizes = &ds_type_count;
6091
6092 VkDescriptorPool ds_pool;
6093 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6094 ASSERT_VK_SUCCESS(err);
6095
6096 VkDescriptorSetLayoutBinding dsl_binding = {};
6097 dsl_binding.binding = 0;
6098 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6099 dsl_binding.descriptorCount = 1;
6100 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6101 dsl_binding.pImmutableSamplers = NULL;
6102
6103 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6104 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6105 ds_layout_ci.pNext = NULL;
6106 ds_layout_ci.bindingCount = 1;
6107 ds_layout_ci.pBindings = &dsl_binding;
6108 VkDescriptorSetLayout ds_layout;
6109 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6110 ASSERT_VK_SUCCESS(err);
6111
6112 VkDescriptorSet descriptorSet;
6113 VkDescriptorSetAllocateInfo alloc_info = {};
6114 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6115 alloc_info.descriptorSetCount = 1;
6116 alloc_info.descriptorPool = ds_pool;
6117 alloc_info.pSetLayouts = &ds_layout;
6118 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6119 ASSERT_VK_SUCCESS(err);
6120
6121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6123 pipeline_layout_ci.pNext = NULL;
6124 pipeline_layout_ci.setLayoutCount = 1;
6125 pipeline_layout_ci.pSetLayouts = &ds_layout;
6126
6127 VkPipelineLayout pipeline_layout;
6128 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6129 ASSERT_VK_SUCCESS(err);
6130
6131 // Create images to update the descriptor with
6132 const VkFormat format = VK_FORMAT_B8G8R8A8_UNORM;
6133 VkImageObj image(m_device);
6134 image.Init(32, 32, 1, format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_TILING_OPTIMAL,
6135 0);
6136 ASSERT_TRUE(image.initialized());
6137
6138 VkImageViewCreateInfo image_view_create_info = {};
6139 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6140 image_view_create_info.image = image.handle();
6141 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6142 image_view_create_info.format = format;
6143 image_view_create_info.subresourceRange.layerCount = 1;
6144 image_view_create_info.subresourceRange.baseMipLevel = 0;
6145 image_view_create_info.subresourceRange.levelCount = 1;
6146 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6147
6148 VkImageView view;
6149 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6150 ASSERT_VK_SUCCESS(err);
6151 // Create Sampler
6152 VkSamplerCreateInfo sampler_ci = {};
6153 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6154 sampler_ci.pNext = NULL;
6155 sampler_ci.magFilter = VK_FILTER_NEAREST;
6156 sampler_ci.minFilter = VK_FILTER_NEAREST;
6157 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6158 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6159 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6160 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6161 sampler_ci.mipLodBias = 1.0;
6162 sampler_ci.anisotropyEnable = VK_FALSE;
6163 sampler_ci.maxAnisotropy = 1;
6164 sampler_ci.compareEnable = VK_FALSE;
6165 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6166 sampler_ci.minLod = 1.0;
6167 sampler_ci.maxLod = 1.0;
6168 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6169 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6170 VkSampler sampler;
6171 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6172 ASSERT_VK_SUCCESS(err);
6173 // Update descriptor with image and sampler
6174 VkDescriptorImageInfo img_info = {};
6175 img_info.sampler = sampler;
6176 img_info.imageView = view;
6177 // This should cause a mis-match. Actual layout at use time is SHADER_RO
6178 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6179
6180 VkWriteDescriptorSet descriptor_write;
6181 memset(&descriptor_write, 0, sizeof(descriptor_write));
6182 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6183 descriptor_write.dstSet = descriptorSet;
6184 descriptor_write.dstBinding = 0;
6185 descriptor_write.descriptorCount = 1;
6186 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6187 descriptor_write.pImageInfo = &img_info;
6188
6189 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6190
6191 // Create PSO to be used for draw-time errors below
6192 char const *vsSource =
6193 "#version 450\n"
6194 "\n"
6195 "out gl_PerVertex { \n"
6196 " vec4 gl_Position;\n"
6197 "};\n"
6198 "void main(){\n"
6199 " gl_Position = vec4(1);\n"
6200 "}\n";
6201 char const *fsSource =
6202 "#version 450\n"
6203 "\n"
6204 "layout(set=0, binding=0) uniform sampler2D s;\n"
6205 "layout(location=0) out vec4 x;\n"
6206 "void main(){\n"
6207 " x = texture(s, vec2(1));\n"
6208 "}\n";
6209 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6210 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6211 VkPipelineObj pipe(m_device);
6212 pipe.AddShader(&vs);
6213 pipe.AddShader(&fs);
6214 pipe.AddColorAttachment();
6215 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6216
6217 VkCommandBufferObj cmd_buf(m_device, m_commandPool);
6218 cmd_buf.BeginCommandBuffer();
6219 cmd_buf.BeginRenderPass(m_renderPassBeginInfo);
6220 // record layout different than actual descriptor layout of SHADER_RO
6221 image.SetLayout(&cmd_buf, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
6222 vkCmdBindPipeline(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6223 vkCmdBindDescriptorSets(cmd_buf.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
6224 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6225 VkRect2D scissor = {{0, 0}, {16, 16}};
6226 vkCmdSetViewport(cmd_buf.handle(), 0, 1, &viewport);
6227 vkCmdSetScissor(cmd_buf.handle(), 0, 1, &scissor);
6228 // At draw time the update layout will mis-match the actual layout
6229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6230 " with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match the "
6231 "actual current layout VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL.");
6232 m_errorMonitor->SetDesiredFailureMsg(
6233 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6234 " Image layout specified at vkUpdateDescriptorSets() time doesn't match actual image layout at time descriptor is used.");
6235 cmd_buf.Draw(1, 0, 0, 0);
6236 m_errorMonitor->VerifyFound();
6237 cmd_buf.EndRenderPass();
6238 cmd_buf.EndCommandBuffer();
6239 // Submit cmd buffer
6240 VkSubmitInfo submit_info = {};
6241 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6242 submit_info.commandBufferCount = 1;
6243 submit_info.pCommandBuffers = &cmd_buf.handle();
6244 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6245 vkQueueWaitIdle(m_device->m_queue);
6246 // Cleanup
6247 vkDestroySampler(m_device->device(), sampler, NULL);
6248 vkDestroyImageView(m_device->device(), view, NULL);
6249 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6250 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6251 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6252}
6253
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006254TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6255 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006256 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006257 ASSERT_NO_FATAL_FAILURE(InitViewport());
6258 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6259
6260 VkDescriptorPoolSize ds_type_count = {};
6261 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6262 ds_type_count.descriptorCount = 1;
6263
6264 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6265 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6266 ds_pool_ci.pNext = NULL;
6267 ds_pool_ci.maxSets = 1;
6268 ds_pool_ci.poolSizeCount = 1;
6269 ds_pool_ci.pPoolSizes = &ds_type_count;
6270
6271 VkDescriptorPool ds_pool;
6272 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6273 ASSERT_VK_SUCCESS(err);
6274
6275 VkDescriptorSetLayoutBinding dsl_binding = {};
6276 dsl_binding.binding = 0;
6277 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6278 dsl_binding.descriptorCount = 1;
6279 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6280 dsl_binding.pImmutableSamplers = NULL;
6281
6282 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6283 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6284 ds_layout_ci.pNext = NULL;
6285 ds_layout_ci.bindingCount = 1;
6286 ds_layout_ci.pBindings = &dsl_binding;
6287 VkDescriptorSetLayout ds_layout;
6288 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6289 ASSERT_VK_SUCCESS(err);
6290
6291 VkDescriptorSet descriptor_set;
6292 VkDescriptorSetAllocateInfo alloc_info = {};
6293 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6294 alloc_info.descriptorSetCount = 1;
6295 alloc_info.descriptorPool = ds_pool;
6296 alloc_info.pSetLayouts = &ds_layout;
6297 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6298 ASSERT_VK_SUCCESS(err);
6299
6300 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6301 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6302 pipeline_layout_ci.pNext = NULL;
6303 pipeline_layout_ci.setLayoutCount = 1;
6304 pipeline_layout_ci.pSetLayouts = &ds_layout;
6305
6306 VkPipelineLayout pipeline_layout;
6307 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6308 ASSERT_VK_SUCCESS(err);
6309
6310 // Create image to update the descriptor with
6311 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06006312 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 -06006313 ASSERT_TRUE(image.initialized());
6314
6315 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6316 // Create Sampler
6317 VkSamplerCreateInfo sampler_ci = {};
6318 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6319 sampler_ci.pNext = NULL;
6320 sampler_ci.magFilter = VK_FILTER_NEAREST;
6321 sampler_ci.minFilter = VK_FILTER_NEAREST;
6322 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6323 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6324 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6325 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6326 sampler_ci.mipLodBias = 1.0;
6327 sampler_ci.anisotropyEnable = VK_FALSE;
6328 sampler_ci.maxAnisotropy = 1;
6329 sampler_ci.compareEnable = VK_FALSE;
6330 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6331 sampler_ci.minLod = 1.0;
6332 sampler_ci.maxLod = 1.0;
6333 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6334 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6335 VkSampler sampler;
6336 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6337 ASSERT_VK_SUCCESS(err);
6338 // Update descriptor with image and sampler
6339 VkDescriptorImageInfo img_info = {};
6340 img_info.sampler = sampler;
6341 img_info.imageView = view;
6342 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6343
6344 VkWriteDescriptorSet descriptor_write;
6345 memset(&descriptor_write, 0, sizeof(descriptor_write));
6346 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6347 descriptor_write.dstSet = descriptor_set;
6348 descriptor_write.dstBinding = 0;
6349 descriptor_write.descriptorCount = 1;
6350 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6351 descriptor_write.pImageInfo = &img_info;
6352
6353 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6354
6355 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006356 char const *vsSource =
6357 "#version 450\n"
6358 "\n"
6359 "out gl_PerVertex { \n"
6360 " vec4 gl_Position;\n"
6361 "};\n"
6362 "void main(){\n"
6363 " gl_Position = vec4(1);\n"
6364 "}\n";
6365 char const *fsSource =
6366 "#version 450\n"
6367 "\n"
6368 "layout(set=0, binding=0) uniform sampler2D s;\n"
6369 "layout(location=0) out vec4 x;\n"
6370 "void main(){\n"
6371 " x = texture(s, vec2(1));\n"
6372 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006373 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6374 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6375 VkPipelineObj pipe(m_device);
6376 pipe.AddShader(&vs);
6377 pipe.AddShader(&fs);
6378 pipe.AddColorAttachment();
6379 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6380
Tony Barbour552f6c02016-12-21 14:34:07 -07006381 m_commandBuffer->BeginCommandBuffer();
6382 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006383 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6384 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6385 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006386
6387 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6388 VkRect2D scissor = {{0, 0}, {16, 16}};
6389 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6390 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6391
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006392 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006393 m_commandBuffer->EndRenderPass();
6394 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006395 // Submit cmd buffer to put pool in-flight
6396 VkSubmitInfo submit_info = {};
6397 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6398 submit_info.commandBufferCount = 1;
6399 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6400 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6401 // Destroy pool while in-flight, causing error
6402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6403 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6404 m_errorMonitor->VerifyFound();
6405 vkQueueWaitIdle(m_device->m_queue);
6406 // Cleanup
6407 vkDestroySampler(m_device->device(), sampler, NULL);
6408 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6409 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006410 m_errorMonitor->SetUnexpectedError(
6411 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -06006412 m_errorMonitor->SetUnexpectedError("Unable to remove DescriptorPool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006413 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006414 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006415}
6416
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006417TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6418 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006419 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006420 ASSERT_NO_FATAL_FAILURE(InitViewport());
6421 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6422
6423 VkDescriptorPoolSize ds_type_count = {};
6424 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6425 ds_type_count.descriptorCount = 1;
6426
6427 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6428 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6429 ds_pool_ci.pNext = NULL;
6430 ds_pool_ci.maxSets = 1;
6431 ds_pool_ci.poolSizeCount = 1;
6432 ds_pool_ci.pPoolSizes = &ds_type_count;
6433
6434 VkDescriptorPool ds_pool;
6435 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6436 ASSERT_VK_SUCCESS(err);
6437
6438 VkDescriptorSetLayoutBinding dsl_binding = {};
6439 dsl_binding.binding = 0;
6440 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6441 dsl_binding.descriptorCount = 1;
6442 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6443 dsl_binding.pImmutableSamplers = NULL;
6444
6445 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6446 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6447 ds_layout_ci.pNext = NULL;
6448 ds_layout_ci.bindingCount = 1;
6449 ds_layout_ci.pBindings = &dsl_binding;
6450 VkDescriptorSetLayout ds_layout;
6451 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6452 ASSERT_VK_SUCCESS(err);
6453
6454 VkDescriptorSet descriptorSet;
6455 VkDescriptorSetAllocateInfo alloc_info = {};
6456 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6457 alloc_info.descriptorSetCount = 1;
6458 alloc_info.descriptorPool = ds_pool;
6459 alloc_info.pSetLayouts = &ds_layout;
6460 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6461 ASSERT_VK_SUCCESS(err);
6462
6463 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6464 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6465 pipeline_layout_ci.pNext = NULL;
6466 pipeline_layout_ci.setLayoutCount = 1;
6467 pipeline_layout_ci.pSetLayouts = &ds_layout;
6468
6469 VkPipelineLayout pipeline_layout;
6470 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6471 ASSERT_VK_SUCCESS(err);
6472
6473 // Create images to update the descriptor with
6474 VkImage image;
6475 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6476 const int32_t tex_width = 32;
6477 const int32_t tex_height = 32;
6478 VkImageCreateInfo image_create_info = {};
6479 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6480 image_create_info.pNext = NULL;
6481 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6482 image_create_info.format = tex_format;
6483 image_create_info.extent.width = tex_width;
6484 image_create_info.extent.height = tex_height;
6485 image_create_info.extent.depth = 1;
6486 image_create_info.mipLevels = 1;
6487 image_create_info.arrayLayers = 1;
6488 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6489 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6490 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6491 image_create_info.flags = 0;
6492 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6493 ASSERT_VK_SUCCESS(err);
6494 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6495 VkMemoryRequirements memory_reqs;
6496 VkDeviceMemory image_memory;
6497 bool pass;
6498 VkMemoryAllocateInfo memory_info = {};
6499 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6500 memory_info.pNext = NULL;
6501 memory_info.allocationSize = 0;
6502 memory_info.memoryTypeIndex = 0;
6503 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6504 // Allocate enough memory for image
6505 memory_info.allocationSize = memory_reqs.size;
6506 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6507 ASSERT_TRUE(pass);
6508 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6509 ASSERT_VK_SUCCESS(err);
6510 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6511 ASSERT_VK_SUCCESS(err);
6512
6513 VkImageViewCreateInfo image_view_create_info = {};
6514 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6515 image_view_create_info.image = image;
6516 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6517 image_view_create_info.format = tex_format;
6518 image_view_create_info.subresourceRange.layerCount = 1;
6519 image_view_create_info.subresourceRange.baseMipLevel = 0;
6520 image_view_create_info.subresourceRange.levelCount = 1;
6521 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6522
6523 VkImageView view;
6524 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6525 ASSERT_VK_SUCCESS(err);
6526 // Create Samplers
6527 VkSamplerCreateInfo sampler_ci = {};
6528 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6529 sampler_ci.pNext = NULL;
6530 sampler_ci.magFilter = VK_FILTER_NEAREST;
6531 sampler_ci.minFilter = VK_FILTER_NEAREST;
6532 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6533 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6534 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6535 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6536 sampler_ci.mipLodBias = 1.0;
6537 sampler_ci.anisotropyEnable = VK_FALSE;
6538 sampler_ci.maxAnisotropy = 1;
6539 sampler_ci.compareEnable = VK_FALSE;
6540 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6541 sampler_ci.minLod = 1.0;
6542 sampler_ci.maxLod = 1.0;
6543 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6544 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6545 VkSampler sampler;
6546 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6547 ASSERT_VK_SUCCESS(err);
6548 // Update descriptor with image and sampler
6549 VkDescriptorImageInfo img_info = {};
6550 img_info.sampler = sampler;
6551 img_info.imageView = view;
6552 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6553
6554 VkWriteDescriptorSet descriptor_write;
6555 memset(&descriptor_write, 0, sizeof(descriptor_write));
6556 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6557 descriptor_write.dstSet = descriptorSet;
6558 descriptor_write.dstBinding = 0;
6559 descriptor_write.descriptorCount = 1;
6560 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6561 descriptor_write.pImageInfo = &img_info;
6562 // Break memory binding and attempt update
6563 vkFreeMemory(m_device->device(), image_memory, nullptr);
6564 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006565 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6567 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6568 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6569 m_errorMonitor->VerifyFound();
6570 // Cleanup
6571 vkDestroyImage(m_device->device(), image, NULL);
6572 vkDestroySampler(m_device->device(), sampler, NULL);
6573 vkDestroyImageView(m_device->device(), view, NULL);
6574 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6575 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6576 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6577}
6578
Karl Schultz6addd812016-02-02 17:17:23 -07006579TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006580 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6581 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006582 // Create a valid cmd buffer
6583 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006584 uint64_t fake_pipeline_handle = 0xbaad6001;
6585 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006586 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6588
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006590 m_commandBuffer->BeginCommandBuffer();
6591 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006592 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006593 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006594
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006595 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006596 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 -06006597 Draw(1, 0, 0, 0);
6598 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006599
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006600 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006601 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 -07006602 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006603 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6604 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006605}
6606
Karl Schultz6addd812016-02-02 17:17:23 -07006607TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006608 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006609 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006610
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006612
Tony Barbour1fa09702017-03-16 12:09:08 -06006613 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006614 ASSERT_NO_FATAL_FAILURE(InitViewport());
6615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006616 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006617 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6618 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006619
6620 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006621 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6622 ds_pool_ci.pNext = NULL;
6623 ds_pool_ci.maxSets = 1;
6624 ds_pool_ci.poolSizeCount = 1;
6625 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006626
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006627 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006628 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006629 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006630
Tony Barboureb254902015-07-15 12:50:33 -06006631 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006632 dsl_binding.binding = 0;
6633 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6634 dsl_binding.descriptorCount = 1;
6635 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6636 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006637
Tony Barboureb254902015-07-15 12:50:33 -06006638 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006639 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6640 ds_layout_ci.pNext = NULL;
6641 ds_layout_ci.bindingCount = 1;
6642 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006643 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006644 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006645 ASSERT_VK_SUCCESS(err);
6646
6647 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006648 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006649 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006650 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006651 alloc_info.descriptorPool = ds_pool;
6652 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006653 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006654 ASSERT_VK_SUCCESS(err);
6655
Tony Barboureb254902015-07-15 12:50:33 -06006656 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006657 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6658 pipeline_layout_ci.pNext = NULL;
6659 pipeline_layout_ci.setLayoutCount = 1;
6660 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006661
6662 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006663 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006664 ASSERT_VK_SUCCESS(err);
6665
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006666 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006667 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006668 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006669 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006670
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006671 VkPipelineObj pipe(m_device);
6672 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006673 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006674 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006675 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006676
Tony Barbour552f6c02016-12-21 14:34:07 -07006677 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006678 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6679 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6680 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006681
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006682 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006683
Chia-I Wuf7458c52015-10-26 21:10:41 +08006684 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6685 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6686 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006687}
6688
Karl Schultz6addd812016-02-02 17:17:23 -07006689TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006690 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006691 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006692
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006694
Tony Barbour1fa09702017-03-16 12:09:08 -06006695 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006696 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006697 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6698 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006699
6700 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006701 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6702 ds_pool_ci.pNext = NULL;
6703 ds_pool_ci.maxSets = 1;
6704 ds_pool_ci.poolSizeCount = 1;
6705 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006706
6707 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006708 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006709 ASSERT_VK_SUCCESS(err);
6710
6711 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006712 dsl_binding.binding = 0;
6713 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6714 dsl_binding.descriptorCount = 1;
6715 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6716 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006717
6718 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006719 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6720 ds_layout_ci.pNext = NULL;
6721 ds_layout_ci.bindingCount = 1;
6722 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006723 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006724 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006725 ASSERT_VK_SUCCESS(err);
6726
6727 VkDescriptorSet descriptorSet;
6728 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006729 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006730 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006731 alloc_info.descriptorPool = ds_pool;
6732 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006733 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006734 ASSERT_VK_SUCCESS(err);
6735
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006736 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006737 VkWriteDescriptorSet descriptor_write;
6738 memset(&descriptor_write, 0, sizeof(descriptor_write));
6739 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6740 descriptor_write.dstSet = descriptorSet;
6741 descriptor_write.dstBinding = 0;
6742 descriptor_write.descriptorCount = 1;
6743 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6744 descriptor_write.pTexelBufferView = &view;
6745
6746 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6747
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006748 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006749
6750 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6751 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6752}
6753
Mark Youngd339ba32016-05-30 13:28:35 -06006754TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006755 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 -06006756
6757 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006759 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006760
Tony Barbour1fa09702017-03-16 12:09:08 -06006761 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006762
6763 // Create a buffer with no bound memory and then attempt to create
6764 // a buffer view.
6765 VkBufferCreateInfo buff_ci = {};
6766 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006767 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006768 buff_ci.size = 256;
6769 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6770 VkBuffer buffer;
6771 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6772 ASSERT_VK_SUCCESS(err);
6773
6774 VkBufferViewCreateInfo buff_view_ci = {};
6775 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6776 buff_view_ci.buffer = buffer;
6777 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6778 buff_view_ci.range = VK_WHOLE_SIZE;
6779 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006780 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006781
6782 m_errorMonitor->VerifyFound();
6783 vkDestroyBuffer(m_device->device(), buffer, NULL);
6784 // If last error is success, it still created the view, so delete it.
6785 if (err == VK_SUCCESS) {
6786 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6787 }
6788}
6789
Karl Schultz6addd812016-02-02 17:17:23 -07006790TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6791 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6792 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006793 // 1. No dynamicOffset supplied
6794 // 2. Too many dynamicOffsets supplied
6795 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006796 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6798 " requires 1 dynamicOffsets, but only "
6799 "0 dynamicOffsets are left in "
6800 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006801
Tony Barbour1fa09702017-03-16 12:09:08 -06006802 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006803 ASSERT_NO_FATAL_FAILURE(InitViewport());
6804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6805
6806 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006807 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6808 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006809
6810 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006811 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6812 ds_pool_ci.pNext = NULL;
6813 ds_pool_ci.maxSets = 1;
6814 ds_pool_ci.poolSizeCount = 1;
6815 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006816
6817 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006818 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006819 ASSERT_VK_SUCCESS(err);
6820
6821 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006822 dsl_binding.binding = 0;
6823 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6824 dsl_binding.descriptorCount = 1;
6825 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6826 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006827
6828 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006829 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6830 ds_layout_ci.pNext = NULL;
6831 ds_layout_ci.bindingCount = 1;
6832 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006833 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006834 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006835 ASSERT_VK_SUCCESS(err);
6836
6837 VkDescriptorSet descriptorSet;
6838 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006839 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006840 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006841 alloc_info.descriptorPool = ds_pool;
6842 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006843 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006844 ASSERT_VK_SUCCESS(err);
6845
6846 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006847 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6848 pipeline_layout_ci.pNext = NULL;
6849 pipeline_layout_ci.setLayoutCount = 1;
6850 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006851
6852 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006853 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006854 ASSERT_VK_SUCCESS(err);
6855
6856 // Create a buffer to update the descriptor with
6857 uint32_t qfi = 0;
6858 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006859 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6860 buffCI.size = 1024;
6861 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6862 buffCI.queueFamilyIndexCount = 1;
6863 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006864
6865 VkBuffer dyub;
6866 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6867 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006868 // Allocate memory and bind to buffer so we can make it to the appropriate
6869 // error
6870 VkMemoryAllocateInfo mem_alloc = {};
6871 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6872 mem_alloc.pNext = NULL;
6873 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006874 mem_alloc.memoryTypeIndex = 0;
6875
6876 VkMemoryRequirements memReqs;
6877 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006878 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006879 if (!pass) {
6880 vkDestroyBuffer(m_device->device(), dyub, NULL);
6881 return;
6882 }
6883
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006884 VkDeviceMemory mem;
6885 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6886 ASSERT_VK_SUCCESS(err);
6887 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6888 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006889 // Correctly update descriptor to avoid "NOT_UPDATED" error
6890 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006891 buffInfo.buffer = dyub;
6892 buffInfo.offset = 0;
6893 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006894
6895 VkWriteDescriptorSet descriptor_write;
6896 memset(&descriptor_write, 0, sizeof(descriptor_write));
6897 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6898 descriptor_write.dstSet = descriptorSet;
6899 descriptor_write.dstBinding = 0;
6900 descriptor_write.descriptorCount = 1;
6901 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6902 descriptor_write.pBufferInfo = &buffInfo;
6903
6904 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6905
Tony Barbour552f6c02016-12-21 14:34:07 -07006906 m_commandBuffer->BeginCommandBuffer();
6907 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006908 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6909 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006910 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006911 uint32_t pDynOff[2] = {512, 756};
6912 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6914 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6915 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6916 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006917 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006918 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6920 " dynamic offset 512 combined with "
6921 "offset 0 and range 1024 that "
6922 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006923 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006924 char const *vsSource =
6925 "#version 450\n"
6926 "\n"
6927 "out gl_PerVertex { \n"
6928 " vec4 gl_Position;\n"
6929 "};\n"
6930 "void main(){\n"
6931 " gl_Position = vec4(1);\n"
6932 "}\n";
6933 char const *fsSource =
6934 "#version 450\n"
6935 "\n"
6936 "layout(location=0) out vec4 x;\n"
6937 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6938 "void main(){\n"
6939 " x = vec4(bar.y);\n"
6940 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006941 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6942 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6943 VkPipelineObj pipe(m_device);
6944 pipe.AddShader(&vs);
6945 pipe.AddShader(&fs);
6946 pipe.AddColorAttachment();
6947 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6948
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006949 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6950 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6951 VkRect2D scissor = {{0, 0}, {16, 16}};
6952 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6953
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006954 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006955 // This update should succeed, but offset size of 512 will overstep buffer
6956 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006957 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6958 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006959 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006960 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006961
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006962 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006963 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006964
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006965 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006966 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006967 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6968}
6969
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006970TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006971 TEST_DESCRIPTION(
6972 "Attempt to update a descriptor with a non-sparse buffer "
6973 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006974 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006976 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6978 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006979
Tony Barbour1fa09702017-03-16 12:09:08 -06006980 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006981 ASSERT_NO_FATAL_FAILURE(InitViewport());
6982 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6983
6984 VkDescriptorPoolSize ds_type_count = {};
6985 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6986 ds_type_count.descriptorCount = 1;
6987
6988 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6989 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6990 ds_pool_ci.pNext = NULL;
6991 ds_pool_ci.maxSets = 1;
6992 ds_pool_ci.poolSizeCount = 1;
6993 ds_pool_ci.pPoolSizes = &ds_type_count;
6994
6995 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006996 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006997 ASSERT_VK_SUCCESS(err);
6998
6999 VkDescriptorSetLayoutBinding dsl_binding = {};
7000 dsl_binding.binding = 0;
7001 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7002 dsl_binding.descriptorCount = 1;
7003 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7004 dsl_binding.pImmutableSamplers = NULL;
7005
7006 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
7007 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7008 ds_layout_ci.pNext = NULL;
7009 ds_layout_ci.bindingCount = 1;
7010 ds_layout_ci.pBindings = &dsl_binding;
7011 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007012 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007013 ASSERT_VK_SUCCESS(err);
7014
7015 VkDescriptorSet descriptorSet;
7016 VkDescriptorSetAllocateInfo alloc_info = {};
7017 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
7018 alloc_info.descriptorSetCount = 1;
7019 alloc_info.descriptorPool = ds_pool;
7020 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007021 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06007022 ASSERT_VK_SUCCESS(err);
7023
7024 // Create a buffer to update the descriptor with
7025 uint32_t qfi = 0;
7026 VkBufferCreateInfo buffCI = {};
7027 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7028 buffCI.size = 1024;
7029 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7030 buffCI.queueFamilyIndexCount = 1;
7031 buffCI.pQueueFamilyIndices = &qfi;
7032
7033 VkBuffer dyub;
7034 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
7035 ASSERT_VK_SUCCESS(err);
7036
7037 // Attempt to update descriptor without binding memory to it
7038 VkDescriptorBufferInfo buffInfo = {};
7039 buffInfo.buffer = dyub;
7040 buffInfo.offset = 0;
7041 buffInfo.range = 1024;
7042
7043 VkWriteDescriptorSet descriptor_write;
7044 memset(&descriptor_write, 0, sizeof(descriptor_write));
7045 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
7046 descriptor_write.dstSet = descriptorSet;
7047 descriptor_write.dstBinding = 0;
7048 descriptor_write.descriptorCount = 1;
7049 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
7050 descriptor_write.pBufferInfo = &buffInfo;
7051
7052 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
7053 m_errorMonitor->VerifyFound();
7054
7055 vkDestroyBuffer(m_device->device(), dyub, NULL);
7056 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7057 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7058}
7059
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007060TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007061 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06007062 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007063 ASSERT_NO_FATAL_FAILURE(InitViewport());
7064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7065
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007066 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007067 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007068 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
7069 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7070 pipeline_layout_ci.pushConstantRangeCount = 1;
7071 pipeline_layout_ci.pPushConstantRanges = &pc_range;
7072
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007073 //
7074 // Check for invalid push constant ranges in pipeline layouts.
7075 //
7076 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007077 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007078 char const *msg;
7079 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007080
Karl Schultzc81037d2016-05-12 08:11:23 -06007081 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
7082 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
7083 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
7084 "vkCreatePipelineLayout() call has push constants index 0 with "
7085 "size 0."},
7086 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
7087 "vkCreatePipelineLayout() call has push constants index 0 with "
7088 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007089 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06007090 "vkCreatePipelineLayout() call has push constants index 0 with "
7091 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007092 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06007093 "vkCreatePipelineLayout() call has push constants index 0 with "
7094 "size 0."},
7095 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
7096 "vkCreatePipelineLayout() call has push constants index 0 with "
7097 "offset 1. Offset must"},
7098 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
7099 "vkCreatePipelineLayout() call has push constants index 0 "
7100 "with offset "},
7101 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
7102 "vkCreatePipelineLayout() call has push constants "
7103 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007104 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007105 "vkCreatePipelineLayout() call has push constants index 0 "
7106 "with offset "},
7107 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
7108 "vkCreatePipelineLayout() call has push "
7109 "constants index 0 with offset "},
7110 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
7111 "vkCreatePipelineLayout() call has push "
7112 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007113 }};
7114
7115 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06007116 for (const auto &iter : range_tests) {
7117 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
7119 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007120 m_errorMonitor->VerifyFound();
7121 if (VK_SUCCESS == err) {
7122 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7123 }
7124 }
7125
7126 // Check for invalid stage flag
7127 pc_range.offset = 0;
7128 pc_range.size = 16;
7129 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007130 m_errorMonitor->SetDesiredFailureMsg(
7131 VK_DEBUG_REPORT_ERROR_BIT_EXT,
7132 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007133 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007134 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007135 if (VK_SUCCESS == err) {
7136 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7137 }
7138
Karl Schultzc59b72d2017-02-24 15:45:05 -07007139 // Check for duplicate stage flags in a list of push constant ranges.
7140 // A shader can only have one push constant block and that block is mapped
7141 // to the push constant range that has that shader's stage flag set.
7142 // The shader's stage flag can only appear once in all the ranges, so the
7143 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06007144 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007145 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06007146 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07007147 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007148 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07007149 // Overlapping ranges are OK, but a stage flag can appear only once.
7150 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
7151 {
7152 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7153 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7154 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7155 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007156 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07007157 {
7158 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
7159 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
7160 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7161 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
7162 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
7163 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
7164 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7165 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7166 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
7167 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
7168 }},
7169 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7170 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
7171 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7172 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7173 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7174 {
7175 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
7176 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
7177 }},
7178 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
7179 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
7180 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7181 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
7182 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
7183 {
7184 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
7185 }},
7186 },
7187 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007188
Karl Schultzc59b72d2017-02-24 15:45:05 -07007189 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007190 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06007191 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07007192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007193 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007194 m_errorMonitor->VerifyFound();
7195 if (VK_SUCCESS == err) {
7196 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7197 }
7198 }
7199
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007200 //
7201 // CmdPushConstants tests
7202 //
7203
Karl Schultzc59b72d2017-02-24 15:45:05 -07007204 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06007205 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07007206 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007207 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007208 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007209 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007210 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007211 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007212
7213 const uint8_t dummy_values[100] = {};
7214
7215 m_commandBuffer->BeginCommandBuffer();
7216 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007217
7218 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007219 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007221 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007222 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007223
Karl Schultzc59b72d2017-02-24 15:45:05 -07007224 m_errorMonitor->ExpectSuccess();
7225 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7226 m_errorMonitor->VerifyNotFound();
7227 m_errorMonitor->ExpectSuccess();
7228 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7229 m_errorMonitor->VerifyNotFound();
7230 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7231 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7232 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7233 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7234 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7235 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7236 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007237 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007238 for (const auto &iter : cmd_range_tests) {
7239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7240 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7241 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007242 m_errorMonitor->VerifyFound();
7243 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007244
Tony Barbour552f6c02016-12-21 14:34:07 -07007245 m_commandBuffer->EndRenderPass();
7246 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007247 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007248}
7249
Karl Schultz6addd812016-02-02 17:17:23 -07007250TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007251 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007252 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007253
Tony Barbour1fa09702017-03-16 12:09:08 -06007254 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007255 ASSERT_NO_FATAL_FAILURE(InitViewport());
7256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7257
7258 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7259 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007260 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7261 ds_type_count[0].descriptorCount = 10;
7262 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7263 ds_type_count[1].descriptorCount = 2;
7264 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7265 ds_type_count[2].descriptorCount = 2;
7266 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7267 ds_type_count[3].descriptorCount = 5;
7268 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7269 // type
7270 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7271 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7272 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007273
7274 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007275 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7276 ds_pool_ci.pNext = NULL;
7277 ds_pool_ci.maxSets = 5;
7278 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7279 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007280
7281 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007282 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007283 ASSERT_VK_SUCCESS(err);
7284
7285 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7286 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007287 dsl_binding[0].binding = 0;
7288 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7289 dsl_binding[0].descriptorCount = 5;
7290 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7291 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007292
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007293 // Create layout identical to set0 layout but w/ different stageFlags
7294 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007295 dsl_fs_stage_only.binding = 0;
7296 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7297 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007298 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7299 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007300 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007301 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007302 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7303 ds_layout_ci.pNext = NULL;
7304 ds_layout_ci.bindingCount = 1;
7305 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007306 static const uint32_t NUM_LAYOUTS = 4;
7307 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007308 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007309 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7310 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007311 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007312 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007313 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007315 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007316 dsl_binding[0].binding = 0;
7317 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007318 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007319 dsl_binding[1].binding = 1;
7320 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7321 dsl_binding[1].descriptorCount = 2;
7322 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7323 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007324 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007325 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007326 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007327 ASSERT_VK_SUCCESS(err);
7328 dsl_binding[0].binding = 0;
7329 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007330 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007331 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007332 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007333 ASSERT_VK_SUCCESS(err);
7334 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007335 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007336 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007337 ASSERT_VK_SUCCESS(err);
7338
7339 static const uint32_t NUM_SETS = 4;
7340 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7341 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007342 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007343 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007344 alloc_info.descriptorPool = ds_pool;
7345 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007346 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007347 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007348 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007349 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007350 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007351 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007352 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007353
7354 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007355 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7356 pipeline_layout_ci.pNext = NULL;
7357 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7358 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007359
7360 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007361 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007362 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007363 // Create pipelineLayout with only one setLayout
7364 pipeline_layout_ci.setLayoutCount = 1;
7365 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007366 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007367 ASSERT_VK_SUCCESS(err);
7368 // Create pipelineLayout with 2 descriptor setLayout at index 0
7369 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7370 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007371 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007372 ASSERT_VK_SUCCESS(err);
7373 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7374 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7375 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007376 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007377 ASSERT_VK_SUCCESS(err);
7378 // Create pipelineLayout with UB type, but stageFlags for FS only
7379 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7380 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007381 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007382 ASSERT_VK_SUCCESS(err);
7383 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7384 VkDescriptorSetLayout pl_bad_s0[2] = {};
7385 pl_bad_s0[0] = ds_layout_fs_only;
7386 pl_bad_s0[1] = ds_layout[1];
7387 pipeline_layout_ci.setLayoutCount = 2;
7388 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7389 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007390 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007391 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007392
Tobin Ehlis88452832015-12-03 09:40:56 -07007393 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007394 char const *vsSource =
7395 "#version 450\n"
7396 "\n"
7397 "out gl_PerVertex {\n"
7398 " vec4 gl_Position;\n"
7399 "};\n"
7400 "void main(){\n"
7401 " gl_Position = vec4(1);\n"
7402 "}\n";
7403 char const *fsSource =
7404 "#version 450\n"
7405 "\n"
7406 "layout(location=0) out vec4 x;\n"
7407 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7408 "void main(){\n"
7409 " x = vec4(bar.y);\n"
7410 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007411 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7412 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007413 VkPipelineObj pipe(m_device);
7414 pipe.AddShader(&vs);
7415 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007416 pipe.AddColorAttachment();
7417 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007418
Tony Barbour552f6c02016-12-21 14:34:07 -07007419 m_commandBuffer->BeginCommandBuffer();
7420 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007421
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007422 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007423 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7424 // of PSO
7425 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7426 // cmd_pipeline.c
7427 // due to the fact that cmd_alloc_dset_data() has not been called in
7428 // cmd_bind_graphics_pipeline()
7429 // TODO : Want to cause various binding incompatibility issues here to test
7430 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007431 // First cause various verify_layout_compatibility() fails
7432 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007433 // verify_set_layout_compatibility fail cases:
7434 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007436 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7437 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007438 m_errorMonitor->VerifyFound();
7439
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007440 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7442 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7443 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007444 m_errorMonitor->VerifyFound();
7445
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007446 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007447 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7448 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7450 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7451 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007452 m_errorMonitor->VerifyFound();
7453
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007454 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7455 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007456 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7457 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7458 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007459 m_errorMonitor->VerifyFound();
7460
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007461 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7462 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7464 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7465 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7466 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007467 m_errorMonitor->VerifyFound();
7468
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007469 // Cause INFO messages due to disturbing previously bound Sets
7470 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007471 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7472 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007473 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7475 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7476 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007477 m_errorMonitor->VerifyFound();
7478
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007479 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7480 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007481 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7483 " newly bound as set #0 so set #1 and "
7484 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007485 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7486 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007487 m_errorMonitor->VerifyFound();
7488
Tobin Ehlis10fad692016-07-07 12:00:36 -06007489 // Now that we're done actively using the pipelineLayout that gfx pipeline
7490 // was created with, we should be able to delete it. Do that now to verify
7491 // that validation obeys pipelineLayout lifetime
7492 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7493
Tobin Ehlis88452832015-12-03 09:40:56 -07007494 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007495 // 1. Error due to not binding required set (we actually use same code as
7496 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007497 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7498 &descriptorSet[0], 0, NULL);
7499 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7500 &descriptorSet[1], 0, NULL);
7501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007502
7503 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7504 VkRect2D scissor = {{0, 0}, {16, 16}};
7505 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7506 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7507
Tobin Ehlis88452832015-12-03 09:40:56 -07007508 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007509 m_errorMonitor->VerifyFound();
7510
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007511 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007512 // 2. Error due to bound set not being compatible with PSO's
7513 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007514 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7515 &descriptorSet[0], 0, NULL);
7516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007517 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007518 m_errorMonitor->VerifyFound();
7519
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007520 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007521 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007522 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7523 }
7524 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007525 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7527}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007528
Karl Schultz6addd812016-02-02 17:17:23 -07007529TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7531 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007532
Tony Barbour1fa09702017-03-16 12:09:08 -06007533 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007534 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007535 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007536 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007538 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007539}
7540
Karl Schultz6addd812016-02-02 17:17:23 -07007541TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7542 VkResult err;
7543 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007544
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007546
Tony Barbour1fa09702017-03-16 12:09:08 -06007547 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007548
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007549 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007550 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007551 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007552 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007553 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007554 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007555
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007556 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007557 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007558
7559 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007560 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007561 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7562
7563 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007564 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007565 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007566 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007567 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007568
7569 // The error should be caught by validation of the BeginCommandBuffer call
7570 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7571
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007572 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007573 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007574}
7575
Karl Schultz6addd812016-02-02 17:17:23 -07007576TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007577 // Cause error due to Begin while recording CB
7578 // Then cause 2 errors for attempting to reset CB w/o having
7579 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7580 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007582
Tony Barbour1fa09702017-03-16 12:09:08 -06007583 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007584
7585 // Calls AllocateCommandBuffers
7586 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7587
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007588 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007589 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007590 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7591 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007592 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7593 cmd_buf_info.pNext = NULL;
7594 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007595 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007596
7597 // Begin CB to transition to recording state
7598 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7599 // Can't re-begin. This should trigger error
7600 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007601 m_errorMonitor->VerifyFound();
7602
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007603 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007604 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007605 // Reset attempt will trigger error due to incorrect CommandPool state
7606 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007607 m_errorMonitor->VerifyFound();
7608
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007610 // Transition CB to RECORDED state
7611 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7612 // Now attempting to Begin will implicitly reset, which triggers error
7613 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007614 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007615}
7616
Karl Schultz6addd812016-02-02 17:17:23 -07007617TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007618 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007619 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007620
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7622 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007623
Tony Barbour1fa09702017-03-16 12:09:08 -06007624 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007626
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007627 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007628 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7629 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007630
7631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7633 ds_pool_ci.pNext = NULL;
7634 ds_pool_ci.maxSets = 1;
7635 ds_pool_ci.poolSizeCount = 1;
7636 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007637
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007638 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007639 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007640 ASSERT_VK_SUCCESS(err);
7641
Tony Barboureb254902015-07-15 12:50:33 -06007642 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007643 dsl_binding.binding = 0;
7644 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7645 dsl_binding.descriptorCount = 1;
7646 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7647 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007648
Tony Barboureb254902015-07-15 12:50:33 -06007649 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007650 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7651 ds_layout_ci.pNext = NULL;
7652 ds_layout_ci.bindingCount = 1;
7653 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007654
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007655 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007657 ASSERT_VK_SUCCESS(err);
7658
7659 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007660 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007662 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007663 alloc_info.descriptorPool = ds_pool;
7664 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007666 ASSERT_VK_SUCCESS(err);
7667
Tony Barboureb254902015-07-15 12:50:33 -06007668 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007669 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7670 pipeline_layout_ci.setLayoutCount = 1;
7671 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007672
7673 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007674 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007675 ASSERT_VK_SUCCESS(err);
7676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007677 VkViewport vp = {}; // Just need dummy vp to point to
7678 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007679
7680 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007681 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7682 vp_state_ci.scissorCount = 1;
7683 vp_state_ci.pScissors = &sc;
7684 vp_state_ci.viewportCount = 1;
7685 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007686
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007687 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7688 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7689 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7690 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7691 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7692 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007693 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007694 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007695 rs_state_ci.lineWidth = 1.0f;
7696
7697 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7698 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7699 vi_ci.pNext = nullptr;
7700 vi_ci.vertexBindingDescriptionCount = 0;
7701 vi_ci.pVertexBindingDescriptions = nullptr;
7702 vi_ci.vertexAttributeDescriptionCount = 0;
7703 vi_ci.pVertexAttributeDescriptions = nullptr;
7704
7705 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7706 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7707 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7708
7709 VkPipelineShaderStageCreateInfo shaderStages[2];
7710 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7711
7712 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7713 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007714 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007715 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007716
Tony Barboureb254902015-07-15 12:50:33 -06007717 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007718 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7719 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007720 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007721 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7722 gp_ci.layout = pipeline_layout;
7723 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007724 gp_ci.pVertexInputState = &vi_ci;
7725 gp_ci.pInputAssemblyState = &ia_ci;
7726
7727 gp_ci.stageCount = 1;
7728 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007729
7730 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007731 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7732 pc_ci.initialDataSize = 0;
7733 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007734
7735 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007736 VkPipelineCache pipelineCache;
7737
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007738 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007739 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007740 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007741 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007742
Chia-I Wuf7458c52015-10-26 21:10:41 +08007743 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007747}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007748
Tobin Ehlis912df022015-09-17 08:46:18 -06007749/*// TODO : This test should be good, but needs Tess support in compiler to run
7750TEST_F(VkLayerTest, InvalidPatchControlPoints)
7751{
7752 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007753 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007754
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007756 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7757primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007758
Tony Barbour1fa09702017-03-16 12:09:08 -06007759 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007761
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007762 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007763 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007764 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007765
7766 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7767 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7768 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007769 ds_pool_ci.poolSizeCount = 1;
7770 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007771
7772 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007773 err = vkCreateDescriptorPool(m_device->device(),
7774VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007775 ASSERT_VK_SUCCESS(err);
7776
7777 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007778 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007780 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7782 dsl_binding.pImmutableSamplers = NULL;
7783
7784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007785 ds_layout_ci.sType =
7786VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007787 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007788 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007789 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007790
7791 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007792 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7793&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007794 ASSERT_VK_SUCCESS(err);
7795
7796 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007797 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7798VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007799 ASSERT_VK_SUCCESS(err);
7800
7801 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007802 pipeline_layout_ci.sType =
7803VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007804 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007805 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007806 pipeline_layout_ci.pSetLayouts = &ds_layout;
7807
7808 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7810&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007811 ASSERT_VK_SUCCESS(err);
7812
7813 VkPipelineShaderStageCreateInfo shaderStages[3];
7814 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7815
Karl Schultz6addd812016-02-02 17:17:23 -07007816 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7817this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007818 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007819 VkShaderObj
7820tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7821this);
7822 VkShaderObj
7823te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7824this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007825
Karl Schultz6addd812016-02-02 17:17:23 -07007826 shaderStages[0].sType =
7827VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007828 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007829 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007830 shaderStages[1].sType =
7831VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007832 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007833 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007834 shaderStages[2].sType =
7835VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007836 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007837 shaderStages[2].shader = te.handle();
7838
7839 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007840 iaCI.sType =
7841VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007842 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007843
7844 VkPipelineTessellationStateCreateInfo tsCI = {};
7845 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7846 tsCI.patchControlPoints = 0; // This will cause an error
7847
7848 VkGraphicsPipelineCreateInfo gp_ci = {};
7849 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7850 gp_ci.pNext = NULL;
7851 gp_ci.stageCount = 3;
7852 gp_ci.pStages = shaderStages;
7853 gp_ci.pVertexInputState = NULL;
7854 gp_ci.pInputAssemblyState = &iaCI;
7855 gp_ci.pTessellationState = &tsCI;
7856 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007857 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007858 gp_ci.pMultisampleState = NULL;
7859 gp_ci.pDepthStencilState = NULL;
7860 gp_ci.pColorBlendState = NULL;
7861 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7862 gp_ci.layout = pipeline_layout;
7863 gp_ci.renderPass = renderPass();
7864
7865 VkPipelineCacheCreateInfo pc_ci = {};
7866 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7867 pc_ci.pNext = NULL;
7868 pc_ci.initialSize = 0;
7869 pc_ci.initialData = 0;
7870 pc_ci.maxSize = 0;
7871
7872 VkPipeline pipeline;
7873 VkPipelineCache pipelineCache;
7874
Karl Schultz6addd812016-02-02 17:17:23 -07007875 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7876&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007877 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007878 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7879&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007880
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007881 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007882
Chia-I Wuf7458c52015-10-26 21:10:41 +08007883 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7884 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7885 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7886 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007887}
7888*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007889
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007890TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007891 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007892
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007893 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007894
Tony Barbour1fa09702017-03-16 12:09:08 -06007895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007897
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007898 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007899 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7900 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007901
7902 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007903 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7904 ds_pool_ci.maxSets = 1;
7905 ds_pool_ci.poolSizeCount = 1;
7906 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007907
7908 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007909 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910 ASSERT_VK_SUCCESS(err);
7911
7912 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007913 dsl_binding.binding = 0;
7914 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7915 dsl_binding.descriptorCount = 1;
7916 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007917
7918 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007919 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7920 ds_layout_ci.bindingCount = 1;
7921 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007922
7923 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007924 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007925 ASSERT_VK_SUCCESS(err);
7926
7927 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007928 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007929 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007930 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007931 alloc_info.descriptorPool = ds_pool;
7932 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007933 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934 ASSERT_VK_SUCCESS(err);
7935
7936 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007937 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7938 pipeline_layout_ci.setLayoutCount = 1;
7939 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007940
7941 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007942 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007943 ASSERT_VK_SUCCESS(err);
7944
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007945 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007947 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007948 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007949 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007950 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007951
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007952 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7953 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7954 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7955 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7956 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7957 rs_state_ci.depthClampEnable = VK_FALSE;
7958 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7959 rs_state_ci.depthBiasEnable = VK_FALSE;
7960
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007961 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7962 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7963 vi_ci.pNext = nullptr;
7964 vi_ci.vertexBindingDescriptionCount = 0;
7965 vi_ci.pVertexBindingDescriptions = nullptr;
7966 vi_ci.vertexAttributeDescriptionCount = 0;
7967 vi_ci.pVertexAttributeDescriptions = nullptr;
7968
7969 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7970 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7971 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7972
7973 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7974 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7975 pipe_ms_state_ci.pNext = NULL;
7976 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7977 pipe_ms_state_ci.sampleShadingEnable = 0;
7978 pipe_ms_state_ci.minSampleShading = 1.0;
7979 pipe_ms_state_ci.pSampleMask = NULL;
7980
Cody Northropeb3a6c12015-10-05 14:44:45 -06007981 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007982 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007984 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007985 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007986 shaderStages[0] = vs.GetStageCreateInfo();
7987 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007988
7989 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007990 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7991 gp_ci.stageCount = 2;
7992 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007993 gp_ci.pVertexInputState = &vi_ci;
7994 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007995 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007996 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007997 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007998 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7999 gp_ci.layout = pipeline_layout;
8000 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008001
8002 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008003 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008004
8005 VkPipeline pipeline;
8006 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008007 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008008 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008009
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008010 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008011 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008012
8013 // Check case where multiViewport is disabled and viewport count is not 1
8014 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
8016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
8017 vp_state_ci.scissorCount = 0;
8018 vp_state_ci.viewportCount = 0;
8019 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8020 m_errorMonitor->VerifyFound();
8021 } else {
8022 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008023 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008024 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008025 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008026
8027 // Check is that viewportcount and scissorcount match
8028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
8029 vp_state_ci.scissorCount = 1;
8030 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
8031 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8032 m_errorMonitor->VerifyFound();
8033
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07008034 // Check case where multiViewport is enabled and viewport count is greater than max
8035 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
8036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
8037 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
8038 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
8039 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
8040 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
8041 m_errorMonitor->VerifyFound();
8042 }
8043 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06008044
Chia-I Wuf7458c52015-10-26 21:10:41 +08008045 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8046 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8047 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8048 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008049}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008050
8051// 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
8052// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07008053TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07008054 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008055
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008056 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
8057
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008059
Tony Barbour1fa09702017-03-16 12:09:08 -06008060 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008062
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008063 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008064 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8065 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008066
8067 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008068 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8069 ds_pool_ci.maxSets = 1;
8070 ds_pool_ci.poolSizeCount = 1;
8071 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008072
8073 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008074 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008075 ASSERT_VK_SUCCESS(err);
8076
8077 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008078 dsl_binding.binding = 0;
8079 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8080 dsl_binding.descriptorCount = 1;
8081 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008082
8083 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008084 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8085 ds_layout_ci.bindingCount = 1;
8086 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008087
8088 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008089 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008090 ASSERT_VK_SUCCESS(err);
8091
8092 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008093 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008094 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008095 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008096 alloc_info.descriptorPool = ds_pool;
8097 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008098 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099 ASSERT_VK_SUCCESS(err);
8100
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008101 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8102 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8103 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8104
8105 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8106 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8107 vi_ci.pNext = nullptr;
8108 vi_ci.vertexBindingDescriptionCount = 0;
8109 vi_ci.pVertexBindingDescriptions = nullptr;
8110 vi_ci.vertexAttributeDescriptionCount = 0;
8111 vi_ci.pVertexAttributeDescriptions = nullptr;
8112
8113 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8114 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8115 pipe_ms_state_ci.pNext = NULL;
8116 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
8117 pipe_ms_state_ci.sampleShadingEnable = 0;
8118 pipe_ms_state_ci.minSampleShading = 1.0;
8119 pipe_ms_state_ci.pSampleMask = NULL;
8120
Tobin Ehlise68360f2015-10-01 11:15:13 -06008121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8123 pipeline_layout_ci.setLayoutCount = 1;
8124 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008125
8126 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008127 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008128 ASSERT_VK_SUCCESS(err);
8129
8130 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8131 // Set scissor as dynamic to avoid second error
8132 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008133 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8134 dyn_state_ci.dynamicStateCount = 1;
8135 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008136
Cody Northropeb3a6c12015-10-05 14:44:45 -06008137 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008138 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008139
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008140 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008141 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8142 // 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 +08008143 shaderStages[0] = vs.GetStageCreateInfo();
8144 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008145
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008146 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
8147 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8148 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
8149 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
8150 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
8151 rs_state_ci.depthClampEnable = VK_FALSE;
8152 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
8153 rs_state_ci.depthBiasEnable = VK_FALSE;
8154
Tobin Ehlise68360f2015-10-01 11:15:13 -06008155 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008156 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8157 gp_ci.stageCount = 2;
8158 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07008159 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008160 // Not setting VP state w/o dynamic vp state should cause validation error
8161 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07008162 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07008163 gp_ci.pVertexInputState = &vi_ci;
8164 gp_ci.pInputAssemblyState = &ia_ci;
8165 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008166 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8167 gp_ci.layout = pipeline_layout;
8168 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008169
8170 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008171 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008172
8173 VkPipeline pipeline;
8174 VkPipelineCache pipelineCache;
8175
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008176 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008177 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008178 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008179
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008180 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008181
Chia-I Wuf7458c52015-10-26 21:10:41 +08008182 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8183 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8184 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8185 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008186}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008187
8188// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
8189// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07008190TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
8191 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008192
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008194
Tony Barbour1fa09702017-03-16 12:09:08 -06008195 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008196
8197 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008198 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008199 return;
8200 }
8201
Tobin Ehlise68360f2015-10-01 11:15:13 -06008202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06008203
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008204 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008205 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8206 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008207
8208 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008209 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8210 ds_pool_ci.maxSets = 1;
8211 ds_pool_ci.poolSizeCount = 1;
8212 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008213
8214 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008215 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008216 ASSERT_VK_SUCCESS(err);
8217
8218 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008219 dsl_binding.binding = 0;
8220 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8221 dsl_binding.descriptorCount = 1;
8222 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008223
8224 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008225 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8226 ds_layout_ci.bindingCount = 1;
8227 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008228
8229 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008230 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008231 ASSERT_VK_SUCCESS(err);
8232
8233 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008234 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008235 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008236 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008237 alloc_info.descriptorPool = ds_pool;
8238 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008239 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008240 ASSERT_VK_SUCCESS(err);
8241
8242 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008243 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8244 pipeline_layout_ci.setLayoutCount = 1;
8245 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008246
8247 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008248 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008249 ASSERT_VK_SUCCESS(err);
8250
8251 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008252 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8253 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008254 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008255 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008256 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008257
8258 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8259 // Set scissor as dynamic to avoid that error
8260 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008261 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8262 dyn_state_ci.dynamicStateCount = 1;
8263 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008264
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008265 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8266 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8267 pipe_ms_state_ci.pNext = NULL;
8268 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8269 pipe_ms_state_ci.sampleShadingEnable = 0;
8270 pipe_ms_state_ci.minSampleShading = 1.0;
8271 pipe_ms_state_ci.pSampleMask = NULL;
8272
Cody Northropeb3a6c12015-10-05 14:44:45 -06008273 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008274 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008275
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008276 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008277 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8278 // 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 +08008279 shaderStages[0] = vs.GetStageCreateInfo();
8280 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008281
Cody Northropf6622dc2015-10-06 10:33:21 -06008282 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8283 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8284 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008285 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008286 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008287 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008288 vi_ci.pVertexAttributeDescriptions = nullptr;
8289
8290 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8291 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8292 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8293
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008294 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008295 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008296 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008297 rs_ci.pNext = nullptr;
8298
Mark Youngc89c6312016-03-31 16:03:20 -06008299 VkPipelineColorBlendAttachmentState att = {};
8300 att.blendEnable = VK_FALSE;
8301 att.colorWriteMask = 0xf;
8302
Cody Northropf6622dc2015-10-06 10:33:21 -06008303 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8304 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8305 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008306 cb_ci.attachmentCount = 1;
8307 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008308
Tobin Ehlise68360f2015-10-01 11:15:13 -06008309 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008310 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8311 gp_ci.stageCount = 2;
8312 gp_ci.pStages = shaderStages;
8313 gp_ci.pVertexInputState = &vi_ci;
8314 gp_ci.pInputAssemblyState = &ia_ci;
8315 gp_ci.pViewportState = &vp_state_ci;
8316 gp_ci.pRasterizationState = &rs_ci;
8317 gp_ci.pColorBlendState = &cb_ci;
8318 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008319 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008320 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8321 gp_ci.layout = pipeline_layout;
8322 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008323
8324 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008325 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008326
8327 VkPipeline pipeline;
8328 VkPipelineCache pipelineCache;
8329
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008330 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008331 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008332 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008333
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008334 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008335
Tobin Ehlisd332f282015-10-02 11:00:56 -06008336 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008337 // First need to successfully create the PSO from above by setting
8338 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008339 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 -07008340
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008341 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008342 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008343 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008344 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008345 m_commandBuffer->BeginCommandBuffer();
8346 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008347 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008348 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008349 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008350 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008351 Draw(1, 0, 0, 0);
8352
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008353 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008354
8355 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8356 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8357 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8358 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008359 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008360}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008361
8362// 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 -07008363// viewportCount
8364TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8365 VkResult err;
8366
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008368
Tony Barbour1fa09702017-03-16 12:09:08 -06008369 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008370
8371 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008372 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008373 return;
8374 }
8375
Karl Schultz6addd812016-02-02 17:17:23 -07008376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8377
8378 VkDescriptorPoolSize ds_type_count = {};
8379 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8380 ds_type_count.descriptorCount = 1;
8381
8382 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8383 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8384 ds_pool_ci.maxSets = 1;
8385 ds_pool_ci.poolSizeCount = 1;
8386 ds_pool_ci.pPoolSizes = &ds_type_count;
8387
8388 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008389 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008390 ASSERT_VK_SUCCESS(err);
8391
8392 VkDescriptorSetLayoutBinding dsl_binding = {};
8393 dsl_binding.binding = 0;
8394 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8395 dsl_binding.descriptorCount = 1;
8396 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8397
8398 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8399 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8400 ds_layout_ci.bindingCount = 1;
8401 ds_layout_ci.pBindings = &dsl_binding;
8402
8403 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008404 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008405 ASSERT_VK_SUCCESS(err);
8406
8407 VkDescriptorSet descriptorSet;
8408 VkDescriptorSetAllocateInfo alloc_info = {};
8409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8410 alloc_info.descriptorSetCount = 1;
8411 alloc_info.descriptorPool = ds_pool;
8412 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008414 ASSERT_VK_SUCCESS(err);
8415
8416 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8417 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8418 pipeline_layout_ci.setLayoutCount = 1;
8419 pipeline_layout_ci.pSetLayouts = &ds_layout;
8420
8421 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008422 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008423 ASSERT_VK_SUCCESS(err);
8424
8425 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8426 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8427 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008428 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008429 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008430 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008431
8432 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8433 // Set scissor as dynamic to avoid that error
8434 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8435 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8436 dyn_state_ci.dynamicStateCount = 1;
8437 dyn_state_ci.pDynamicStates = &vp_state;
8438
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008439 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8440 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8441 pipe_ms_state_ci.pNext = NULL;
8442 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8443 pipe_ms_state_ci.sampleShadingEnable = 0;
8444 pipe_ms_state_ci.minSampleShading = 1.0;
8445 pipe_ms_state_ci.pSampleMask = NULL;
8446
Karl Schultz6addd812016-02-02 17:17:23 -07008447 VkPipelineShaderStageCreateInfo shaderStages[2];
8448 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8449
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008450 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008451 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8452 // 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 -07008453 shaderStages[0] = vs.GetStageCreateInfo();
8454 shaderStages[1] = fs.GetStageCreateInfo();
8455
8456 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8457 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8458 vi_ci.pNext = nullptr;
8459 vi_ci.vertexBindingDescriptionCount = 0;
8460 vi_ci.pVertexBindingDescriptions = nullptr;
8461 vi_ci.vertexAttributeDescriptionCount = 0;
8462 vi_ci.pVertexAttributeDescriptions = nullptr;
8463
8464 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8465 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8466 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8467
8468 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8469 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008470 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008471 rs_ci.pNext = nullptr;
8472
Mark Youngc89c6312016-03-31 16:03:20 -06008473 VkPipelineColorBlendAttachmentState att = {};
8474 att.blendEnable = VK_FALSE;
8475 att.colorWriteMask = 0xf;
8476
Karl Schultz6addd812016-02-02 17:17:23 -07008477 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8478 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8479 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008480 cb_ci.attachmentCount = 1;
8481 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008482
8483 VkGraphicsPipelineCreateInfo gp_ci = {};
8484 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8485 gp_ci.stageCount = 2;
8486 gp_ci.pStages = shaderStages;
8487 gp_ci.pVertexInputState = &vi_ci;
8488 gp_ci.pInputAssemblyState = &ia_ci;
8489 gp_ci.pViewportState = &vp_state_ci;
8490 gp_ci.pRasterizationState = &rs_ci;
8491 gp_ci.pColorBlendState = &cb_ci;
8492 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008493 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008494 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8495 gp_ci.layout = pipeline_layout;
8496 gp_ci.renderPass = renderPass();
8497
8498 VkPipelineCacheCreateInfo pc_ci = {};
8499 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8500
8501 VkPipeline pipeline;
8502 VkPipelineCache pipelineCache;
8503
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008504 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008505 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008506 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008507
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008508 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008509
8510 // Now hit second fail case where we set scissor w/ different count than PSO
8511 // First need to successfully create the PSO from above by setting
8512 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8514 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008516 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008517 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008519 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008520 m_commandBuffer->BeginCommandBuffer();
8521 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008522 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008523 VkViewport viewports[1] = {};
8524 viewports[0].width = 8;
8525 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008526 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008527 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008528 Draw(1, 0, 0, 0);
8529
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008530 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008531
Chia-I Wuf7458c52015-10-26 21:10:41 +08008532 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8533 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8535 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008536 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008537}
8538
Mark Young7394fdd2016-03-31 14:56:43 -06008539TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8540 VkResult err;
8541
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008543
Tony Barbour1fa09702017-03-16 12:09:08 -06008544 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8546
8547 VkDescriptorPoolSize ds_type_count = {};
8548 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8549 ds_type_count.descriptorCount = 1;
8550
8551 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8552 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8553 ds_pool_ci.maxSets = 1;
8554 ds_pool_ci.poolSizeCount = 1;
8555 ds_pool_ci.pPoolSizes = &ds_type_count;
8556
8557 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008558 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008559 ASSERT_VK_SUCCESS(err);
8560
8561 VkDescriptorSetLayoutBinding dsl_binding = {};
8562 dsl_binding.binding = 0;
8563 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8564 dsl_binding.descriptorCount = 1;
8565 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8566
8567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8569 ds_layout_ci.bindingCount = 1;
8570 ds_layout_ci.pBindings = &dsl_binding;
8571
8572 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008573 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008574 ASSERT_VK_SUCCESS(err);
8575
8576 VkDescriptorSet descriptorSet;
8577 VkDescriptorSetAllocateInfo alloc_info = {};
8578 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8579 alloc_info.descriptorSetCount = 1;
8580 alloc_info.descriptorPool = ds_pool;
8581 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008582 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008583 ASSERT_VK_SUCCESS(err);
8584
8585 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8586 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8587 pipeline_layout_ci.setLayoutCount = 1;
8588 pipeline_layout_ci.pSetLayouts = &ds_layout;
8589
8590 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008591 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008592 ASSERT_VK_SUCCESS(err);
8593
8594 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8595 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8596 vp_state_ci.scissorCount = 1;
8597 vp_state_ci.pScissors = NULL;
8598 vp_state_ci.viewportCount = 1;
8599 vp_state_ci.pViewports = NULL;
8600
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008601 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008602 // Set scissor as dynamic to avoid that error
8603 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8604 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8605 dyn_state_ci.dynamicStateCount = 2;
8606 dyn_state_ci.pDynamicStates = dynamic_states;
8607
8608 VkPipelineShaderStageCreateInfo shaderStages[2];
8609 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8610
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008611 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8612 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008613 this); // TODO - We shouldn't need a fragment shader
8614 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008615 shaderStages[0] = vs.GetStageCreateInfo();
8616 shaderStages[1] = fs.GetStageCreateInfo();
8617
8618 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8619 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8620 vi_ci.pNext = nullptr;
8621 vi_ci.vertexBindingDescriptionCount = 0;
8622 vi_ci.pVertexBindingDescriptions = nullptr;
8623 vi_ci.vertexAttributeDescriptionCount = 0;
8624 vi_ci.pVertexAttributeDescriptions = nullptr;
8625
8626 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8627 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8628 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8629
8630 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8631 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8632 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008633 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008634
Mark Young47107952016-05-02 15:59:55 -06008635 // Check too low (line width of -1.0f).
8636 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008637
8638 VkPipelineColorBlendAttachmentState att = {};
8639 att.blendEnable = VK_FALSE;
8640 att.colorWriteMask = 0xf;
8641
8642 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8643 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8644 cb_ci.pNext = nullptr;
8645 cb_ci.attachmentCount = 1;
8646 cb_ci.pAttachments = &att;
8647
8648 VkGraphicsPipelineCreateInfo gp_ci = {};
8649 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8650 gp_ci.stageCount = 2;
8651 gp_ci.pStages = shaderStages;
8652 gp_ci.pVertexInputState = &vi_ci;
8653 gp_ci.pInputAssemblyState = &ia_ci;
8654 gp_ci.pViewportState = &vp_state_ci;
8655 gp_ci.pRasterizationState = &rs_ci;
8656 gp_ci.pColorBlendState = &cb_ci;
8657 gp_ci.pDynamicState = &dyn_state_ci;
8658 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8659 gp_ci.layout = pipeline_layout;
8660 gp_ci.renderPass = renderPass();
8661
8662 VkPipelineCacheCreateInfo pc_ci = {};
8663 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8664
8665 VkPipeline pipeline;
8666 VkPipelineCache pipelineCache;
8667
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008668 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008669 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008670 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008671
8672 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008673 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008676
8677 // Check too high (line width of 65536.0f).
8678 rs_ci.lineWidth = 65536.0f;
8679
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008680 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008681 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008682 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008683
8684 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008685 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008686
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008688
8689 dyn_state_ci.dynamicStateCount = 3;
8690
8691 rs_ci.lineWidth = 1.0f;
8692
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008693 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008694 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008695 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008696 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008697 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008698
8699 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008700 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008701 m_errorMonitor->VerifyFound();
8702
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008704
8705 // Check too high with dynamic setting.
8706 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8707 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008708 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008709
8710 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8711 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8712 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8713 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008714 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008715}
8716
Karl Schultz6addd812016-02-02 17:17:23 -07008717TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008718 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008720 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008721
Tony Barbour1fa09702017-03-16 12:09:08 -06008722 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008723 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008724
Tony Barbour552f6c02016-12-21 14:34:07 -07008725 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008726 // Don't care about RenderPass handle b/c error should be flagged before
8727 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008728 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008729
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008730 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008731}
8732
Karl Schultz6addd812016-02-02 17:17:23 -07008733TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008734 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8736 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008737
Tony Barbour1fa09702017-03-16 12:09:08 -06008738 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008739 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008740
Tony Barbour552f6c02016-12-21 14:34:07 -07008741 m_commandBuffer->BeginCommandBuffer();
8742 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008743 // Just create a dummy Renderpass that's non-NULL so we can get to the
8744 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008745 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008746
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008747 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008748}
8749
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008750TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008751 TEST_DESCRIPTION(
8752 "Begin a renderPass where clearValueCount is less than"
8753 "the number of renderPass attachments that use loadOp"
8754 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008755
Tony Barbour1fa09702017-03-16 12:09:08 -06008756 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8758
8759 // Create a renderPass with a single attachment that uses loadOp CLEAR
8760 VkAttachmentReference attach = {};
8761 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8762 VkSubpassDescription subpass = {};
8763 subpass.inputAttachmentCount = 1;
8764 subpass.pInputAttachments = &attach;
8765 VkRenderPassCreateInfo rpci = {};
8766 rpci.subpassCount = 1;
8767 rpci.pSubpasses = &subpass;
8768 rpci.attachmentCount = 1;
8769 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008770 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008771 // Set loadOp to CLEAR
8772 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8773 rpci.pAttachments = &attach_desc;
8774 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8775 VkRenderPass rp;
8776 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8777
8778 VkCommandBufferInheritanceInfo hinfo = {};
8779 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8780 hinfo.renderPass = VK_NULL_HANDLE;
8781 hinfo.subpass = 0;
8782 hinfo.framebuffer = VK_NULL_HANDLE;
8783 hinfo.occlusionQueryEnable = VK_FALSE;
8784 hinfo.queryFlags = 0;
8785 hinfo.pipelineStatistics = 0;
8786 VkCommandBufferBeginInfo info = {};
8787 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8788 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8789 info.pInheritanceInfo = &hinfo;
8790
8791 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8792 VkRenderPassBeginInfo rp_begin = {};
8793 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8794 rp_begin.pNext = NULL;
8795 rp_begin.renderPass = renderPass();
8796 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008797 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008798
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008800
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008801 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008802
8803 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008804
8805 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008806}
8807
Slawomir Cygan0808f392016-11-28 17:53:23 +01008808TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008809 TEST_DESCRIPTION(
8810 "Begin a renderPass where clearValueCount is greater than"
8811 "the number of renderPass attachments that use loadOp"
8812 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008813
Tony Barbour1fa09702017-03-16 12:09:08 -06008814 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008815 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8816
8817 // Create a renderPass with a single attachment that uses loadOp CLEAR
8818 VkAttachmentReference attach = {};
8819 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8820 VkSubpassDescription subpass = {};
8821 subpass.inputAttachmentCount = 1;
8822 subpass.pInputAttachments = &attach;
8823 VkRenderPassCreateInfo rpci = {};
8824 rpci.subpassCount = 1;
8825 rpci.pSubpasses = &subpass;
8826 rpci.attachmentCount = 1;
8827 VkAttachmentDescription attach_desc = {};
8828 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8829 // Set loadOp to CLEAR
8830 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8831 rpci.pAttachments = &attach_desc;
8832 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8833 VkRenderPass rp;
8834 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8835
8836 VkCommandBufferBeginInfo info = {};
8837 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8838 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8839
8840 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8841 VkRenderPassBeginInfo rp_begin = {};
8842 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8843 rp_begin.pNext = NULL;
8844 rp_begin.renderPass = renderPass();
8845 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008846 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008847
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8849 " has a clearValueCount of"
8850 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008851
8852 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8853
8854 m_errorMonitor->VerifyFound();
8855
8856 vkDestroyRenderPass(m_device->device(), rp, NULL);
8857}
8858
Cody Northrop3bb4d962016-05-09 16:15:57 -06008859TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008860 TEST_DESCRIPTION("End a command buffer with an active render pass");
8861
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8863 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008864
Tony Barbour1fa09702017-03-16 12:09:08 -06008865 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8867
Tony Barbour552f6c02016-12-21 14:34:07 -07008868 m_commandBuffer->BeginCommandBuffer();
8869 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8870 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008871
8872 m_errorMonitor->VerifyFound();
8873
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008874 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8875 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008876}
8877
Karl Schultz6addd812016-02-02 17:17:23 -07008878TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008879 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8881 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008882
Tony Barbour1fa09702017-03-16 12:09:08 -06008883 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008885
Tony Barbour552f6c02016-12-21 14:34:07 -07008886 m_commandBuffer->BeginCommandBuffer();
8887 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008888
8889 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008890 vk_testing::Buffer dstBuffer;
8891 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008892
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008893 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008894
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008895 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008896}
8897
Karl Schultz6addd812016-02-02 17:17:23 -07008898TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008899 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8901 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008902
Tony Barbour1fa09702017-03-16 12:09:08 -06008903 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008904 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008905
Tony Barbour552f6c02016-12-21 14:34:07 -07008906 m_commandBuffer->BeginCommandBuffer();
8907 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008908
8909 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008910 vk_testing::Buffer dstBuffer;
8911 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008912
Karl Schultz6addd812016-02-02 17:17:23 -07008913 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008914 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8915 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8916 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008917
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008918 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008919}
8920
Karl Schultz6addd812016-02-02 17:17:23 -07008921TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008922 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8924 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008925
Tony Barbour1fa09702017-03-16 12:09:08 -06008926 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008928
Tony Barbour552f6c02016-12-21 14:34:07 -07008929 m_commandBuffer->BeginCommandBuffer();
8930 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008931
Michael Lentine0a369f62016-02-03 16:51:46 -06008932 VkClearColorValue clear_color;
8933 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008934 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8935 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8936 const int32_t tex_width = 32;
8937 const int32_t tex_height = 32;
8938 VkImageCreateInfo image_create_info = {};
8939 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8940 image_create_info.pNext = NULL;
8941 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8942 image_create_info.format = tex_format;
8943 image_create_info.extent.width = tex_width;
8944 image_create_info.extent.height = tex_height;
8945 image_create_info.extent.depth = 1;
8946 image_create_info.mipLevels = 1;
8947 image_create_info.arrayLayers = 1;
8948 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8949 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008950 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008951
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008952 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008953 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008954
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008955 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008956
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008957 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008958
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008959 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008960}
8961
Karl Schultz6addd812016-02-02 17:17:23 -07008962TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008963 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8965 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008966
Tony Barbour1fa09702017-03-16 12:09:08 -06008967 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008969
Dave Houlton1d2022c2017-03-29 11:43:58 -06008970 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008971 if (!depth_format) {
8972 printf(" No Depth + Stencil format found. Skipped.\n");
8973 return;
8974 }
8975
Tony Barbour552f6c02016-12-21 14:34:07 -07008976 m_commandBuffer->BeginCommandBuffer();
8977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008978
8979 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008980 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008981 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8982 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008983 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008984 image_create_info.extent.width = 64;
8985 image_create_info.extent.height = 64;
8986 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8987 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008988
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008989 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008990 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008991
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008992 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008993
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008994 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8995 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008996
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008997 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008998}
8999
Karl Schultz6addd812016-02-02 17:17:23 -07009000TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009001 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009002 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009003
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9005 "vkCmdClearAttachments(): This call "
9006 "must be issued inside an active "
9007 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009008
Tony Barbour1fa09702017-03-16 12:09:08 -06009009 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009010 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009011
9012 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08009013 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009014 ASSERT_VK_SUCCESS(err);
9015
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06009016 VkClearAttachment color_attachment;
9017 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9018 color_attachment.clearValue.color.float32[0] = 0;
9019 color_attachment.clearValue.color.float32[1] = 0;
9020 color_attachment.clearValue.color.float32[2] = 0;
9021 color_attachment.clearValue.color.float32[3] = 0;
9022 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07009023 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009024 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009025
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009026 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06009027}
9028
Chris Forbes3b97e932016-09-07 11:29:24 +12009029TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009030 TEST_DESCRIPTION(
9031 "Test that an error is produced when CmdNextSubpass is "
9032 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12009033
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9035 "vkCmdNextSubpass(): Attempted to advance "
9036 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12009037
Tony Barbour1fa09702017-03-16 12:09:08 -06009038 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12009039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9040
Tony Barbour552f6c02016-12-21 14:34:07 -07009041 m_commandBuffer->BeginCommandBuffer();
9042 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12009043
9044 // error here.
9045 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
9046 m_errorMonitor->VerifyFound();
9047
Tony Barbour552f6c02016-12-21 14:34:07 -07009048 m_commandBuffer->EndRenderPass();
9049 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12009050}
9051
Chris Forbes6d624702016-09-07 13:57:05 +12009052TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009053 TEST_DESCRIPTION(
9054 "Test that an error is produced when CmdEndRenderPass is "
9055 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12009056
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9058 "vkCmdEndRenderPass(): Called before reaching "
9059 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12009060
Tony Barbour1fa09702017-03-16 12:09:08 -06009061 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009062 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
9063 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12009064
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009065 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12009066
9067 VkRenderPass rp;
9068 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
9069 ASSERT_VK_SUCCESS(err);
9070
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009071 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12009072
9073 VkFramebuffer fb;
9074 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
9075 ASSERT_VK_SUCCESS(err);
9076
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009077 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12009078
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009079 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 +12009080
9081 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
9082
9083 // Error here.
9084 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9085 m_errorMonitor->VerifyFound();
9086
9087 // Clean up.
9088 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
9089 vkDestroyRenderPass(m_device->device(), rp, nullptr);
9090}
9091
Karl Schultz9e66a292016-04-21 15:57:51 -06009092TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
9093 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9095 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06009096
Tony Barbour1fa09702017-03-16 12:09:08 -06009097 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07009098 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06009099
9100 VkBufferMemoryBarrier buf_barrier = {};
9101 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9102 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9103 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9104 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9105 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9106 buf_barrier.buffer = VK_NULL_HANDLE;
9107 buf_barrier.offset = 0;
9108 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009109 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9110 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06009111
9112 m_errorMonitor->VerifyFound();
9113}
9114
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009115TEST_F(VkLayerTest, InvalidBarriers) {
9116 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
9117
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009119
Tony Barbour1fa09702017-03-16 12:09:08 -06009120 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -06009121 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009122 if (!depth_format) {
9123 printf(" No Depth + Stencil format found. Skipped.\n");
9124 return;
9125 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9127
9128 VkMemoryBarrier mem_barrier = {};
9129 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
9130 mem_barrier.pNext = NULL;
9131 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9132 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07009133 m_commandBuffer->BeginCommandBuffer();
9134 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009135 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009136 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009137 &mem_barrier, 0, nullptr, 0, nullptr);
9138 m_errorMonitor->VerifyFound();
9139
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009141 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009142 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 -06009143 ASSERT_TRUE(image.initialized());
9144 VkImageMemoryBarrier img_barrier = {};
9145 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9146 img_barrier.pNext = NULL;
9147 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9148 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9149 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9150 // New layout can't be UNDEFINED
9151 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
9152 img_barrier.image = image.handle();
9153 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9154 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9155 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9156 img_barrier.subresourceRange.baseArrayLayer = 0;
9157 img_barrier.subresourceRange.baseMipLevel = 0;
9158 img_barrier.subresourceRange.layerCount = 1;
9159 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009160 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9161 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009162 m_errorMonitor->VerifyFound();
9163 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9164
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9166 "Subresource must have the sum of the "
9167 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009168 // baseArrayLayer + layerCount must be <= image's arrayLayers
9169 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009170 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9171 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009172 m_errorMonitor->VerifyFound();
9173 img_barrier.subresourceRange.baseArrayLayer = 0;
9174
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009176 // baseMipLevel + levelCount must be <= image's mipLevels
9177 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009178 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9179 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009180 m_errorMonitor->VerifyFound();
9181 img_barrier.subresourceRange.baseMipLevel = 0;
9182
Mike Weiblen7053aa32017-01-25 15:21:10 -07009183 // levelCount must be non-zero.
9184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
9185 img_barrier.subresourceRange.levelCount = 0;
9186 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9187 nullptr, 0, nullptr, 1, &img_barrier);
9188 m_errorMonitor->VerifyFound();
9189 img_barrier.subresourceRange.levelCount = 1;
9190
9191 // layerCount must be non-zero.
9192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
9193 img_barrier.subresourceRange.layerCount = 0;
9194 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9195 nullptr, 0, nullptr, 1, &img_barrier);
9196 m_errorMonitor->VerifyFound();
9197 img_barrier.subresourceRange.layerCount = 1;
9198
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009199 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 -06009200 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009201 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
9202 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009203 VkBufferMemoryBarrier buf_barrier = {};
9204 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
9205 buf_barrier.pNext = NULL;
9206 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
9207 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
9208 buf_barrier.buffer = buffer.handle();
9209 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9210 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9211 buf_barrier.offset = 0;
9212 buf_barrier.size = VK_WHOLE_SIZE;
9213 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009214 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9215 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009216 m_errorMonitor->VerifyFound();
9217 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9218
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009220 buf_barrier.offset = 257;
9221 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009222 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9223 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009224 m_errorMonitor->VerifyFound();
9225 buf_barrier.offset = 0;
9226
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009228 buf_barrier.size = 257;
9229 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009230 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9231 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009232 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009233
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009234 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009235 m_errorMonitor->SetDesiredFailureMsg(
9236 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009237 "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 -06009238 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009239 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009240 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009241 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9242 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009243 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009244
9245 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009246 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009247 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9248 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009249 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009250
9251 // Having anything other than DEPTH or STENCIL is an error
9252 m_errorMonitor->SetDesiredFailureMsg(
9253 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9254 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9255 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9256 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9257 nullptr, 0, nullptr, 1, &img_barrier);
9258 m_errorMonitor->VerifyFound();
9259
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009260 // Now test depth-only
9261 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009262 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9263 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009264 VkDepthStencilObj d_image(m_device);
9265 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9266 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009267 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009268 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009269 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009270
9271 // DEPTH bit must be set
9272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9273 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009274 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009275 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9276 0, nullptr, 0, nullptr, 1, &img_barrier);
9277 m_errorMonitor->VerifyFound();
9278
9279 // No bits other than DEPTH may be set
9280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9281 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9282 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009283 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9284 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009285 m_errorMonitor->VerifyFound();
9286 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009287
9288 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009289 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9290 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009291 VkDepthStencilObj s_image(m_device);
9292 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9293 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009294 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009295 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009296 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009297 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9299 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009300 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009301 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9302 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009303 m_errorMonitor->VerifyFound();
9304 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009305
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009306 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009307 VkImageObj c_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009308 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 -06009309 ASSERT_TRUE(c_image.initialized());
9310 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9311 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9312 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009313
9314 // COLOR bit must be set
9315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9316 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009317 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009318 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9319 nullptr, 0, nullptr, 1, &img_barrier);
9320 m_errorMonitor->VerifyFound();
9321
9322 // No bits other than COLOR may be set
9323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9324 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9325 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009326 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9327 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009328 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009329
Mike Weiblene6e01172017-03-07 22:18:40 -07009330 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9331 {
9332 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009333 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 -07009334 ASSERT_TRUE(img_color.initialized());
9335
9336 VkImageObj img_ds(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009337 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 -07009338 ASSERT_TRUE(img_ds.initialized());
9339
9340 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009341 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 -07009342 ASSERT_TRUE(img_xfer_src.initialized());
9343
9344 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009345 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 -07009346 ASSERT_TRUE(img_xfer_dst.initialized());
9347
9348 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009349 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 -07009350 ASSERT_TRUE(img_sampled.initialized());
9351
9352 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009353 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 -07009354 ASSERT_TRUE(img_input.initialized());
9355
9356 const struct {
9357 VkImageObj &image_obj;
9358 VkImageLayout bad_layout;
9359 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9360 } bad_buffer_layouts[] = {
9361 // clang-format off
9362 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9363 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9364 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9365 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9366 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9367 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9368 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9369 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9370 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9371 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9372 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9373 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9374 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9375 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9376 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9377 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9378 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9379 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9380 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9381 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9382 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9383 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9384 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9385 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9386 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9387 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9388 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9389 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9390 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9391 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9392 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9393 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9394 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9395 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9396 // clang-format on
9397 };
9398 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9399
9400 for (uint32_t i = 0; i < layout_count; ++i) {
9401 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9402 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9403 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9404 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9405 : VK_IMAGE_ASPECT_COLOR_BIT;
9406
9407 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9408 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9410 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9411 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9412 m_errorMonitor->VerifyFound();
9413
9414 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9415 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9417 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9418 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9419 m_errorMonitor->VerifyFound();
9420 }
9421
9422 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9423 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9424 }
9425
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009426 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9427
9428 // Create command pool with incompatible queueflags
9429 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009430 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009431 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009432 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009433 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009434 }
9435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9436
9437 VkCommandPool command_pool;
9438 VkCommandPoolCreateInfo pool_create_info{};
9439 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9440 pool_create_info.queueFamilyIndex = queue_family_index;
9441 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9442 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9443
9444 // Allocate a command buffer
9445 VkCommandBuffer bad_command_buffer;
9446 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9447 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9448 command_buffer_allocate_info.commandPool = command_pool;
9449 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9450 command_buffer_allocate_info.commandBufferCount = 1;
9451 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9452
9453 VkCommandBufferBeginInfo cbbi = {};
9454 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9455 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9456 buf_barrier.offset = 0;
9457 buf_barrier.size = VK_WHOLE_SIZE;
9458 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9459 &buf_barrier, 0, nullptr);
9460 m_errorMonitor->VerifyFound();
9461
9462 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9463 vkEndCommandBuffer(bad_command_buffer);
9464 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009465 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009466 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009467 }
9468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9469 VkEvent event;
9470 VkEventCreateInfo event_create_info{};
9471 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9472 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9473 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9474 nullptr, 0, nullptr);
9475 m_errorMonitor->VerifyFound();
9476
9477 vkEndCommandBuffer(bad_command_buffer);
9478 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009479}
9480
Tony Barbour18ba25c2016-09-29 13:42:40 -06009481TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9482 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9483
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009485 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009486 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -06009487 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 -07009488 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009489 ASSERT_TRUE(image.initialized());
9490
9491 VkImageMemoryBarrier barrier = {};
9492 VkImageSubresourceRange range;
9493 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9494 barrier.srcAccessMask = 0;
9495 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9496 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9497 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9498 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9499 barrier.image = image.handle();
9500 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9501 range.baseMipLevel = 0;
9502 range.levelCount = 1;
9503 range.baseArrayLayer = 0;
9504 range.layerCount = 1;
9505 barrier.subresourceRange = range;
9506 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9507 cmdbuf.BeginCommandBuffer();
9508 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9509 &barrier);
9510 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9511 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9512 barrier.srcAccessMask = 0;
9513 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9514 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9515 &barrier);
9516
9517 m_errorMonitor->VerifyFound();
9518}
9519
Karl Schultz6addd812016-02-02 17:17:23 -07009520TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009521 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009522 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009523 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009524
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009525 uint32_t const indices[] = {0};
9526 VkBufferCreateInfo buf_info = {};
9527 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9528 buf_info.size = 1024;
9529 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9530 buf_info.queueFamilyIndexCount = 1;
9531 buf_info.pQueueFamilyIndices = indices;
9532
9533 VkBuffer buffer;
9534 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9535 ASSERT_VK_SUCCESS(err);
9536
9537 VkMemoryRequirements requirements;
9538 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9539
9540 VkMemoryAllocateInfo alloc_info{};
9541 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9542 alloc_info.pNext = NULL;
9543 alloc_info.memoryTypeIndex = 0;
9544 alloc_info.allocationSize = requirements.size;
9545 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9546 ASSERT_TRUE(pass);
9547
9548 VkDeviceMemory memory;
9549 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9550 ASSERT_VK_SUCCESS(err);
9551
9552 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009553 ASSERT_VK_SUCCESS(err);
9554
Tony Barbour552f6c02016-12-21 14:34:07 -07009555 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009556 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009557
Karl Schultz6addd812016-02-02 17:17:23 -07009558 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9559 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009560 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9562 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009563 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009564
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009565 vkFreeMemory(m_device->device(), memory, NULL);
9566 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009567}
9568
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009569TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9570 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009571 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009572 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9573 VkBufferCreateInfo buffCI = {};
9574 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9575 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009576 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009577 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009578 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009579 uint32_t qfi[2];
9580 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009581 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009582
9583 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009584 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009585
9586 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9588 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9589 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009590 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009591 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009592
9593 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009594 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9596
9597 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9598 buffCI.queueFamilyIndexCount = 2;
9599 qfi[0] = 1;
9600 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009601 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009602 VkDeviceMemory mem;
9603 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009604 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009605
9606 VkMemoryAllocateInfo alloc_info = {};
9607 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9608 alloc_info.allocationSize = 1024;
9609 bool pass = false;
9610 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9611 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009612 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009613 return;
9614 }
9615 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009616 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009617
9618 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009619 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009620 m_commandBuffer->end();
9621 QueueCommandBuffer(false);
9622 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009623 vkDestroyBuffer(m_device->device(), ib2, NULL);
9624 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009625 }
9626
Tony Barbourdf4c0042016-06-01 15:55:43 -06009627 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009628}
9629
Karl Schultz6addd812016-02-02 17:17:23 -07009630TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009631 TEST_DESCRIPTION(
9632 "Attempt vkCmdExecuteCommands with a primary command buffer"
9633 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009634
Tony Barbour1fa09702017-03-16 12:09:08 -06009635 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009636 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009637
Chris Forbesf29a84f2016-10-06 18:39:28 +13009638 // An empty primary command buffer
9639 VkCommandBufferObj cb(m_device, m_commandPool);
9640 cb.BeginCommandBuffer();
9641 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009642
Chris Forbesf29a84f2016-10-06 18:39:28 +13009643 m_commandBuffer->BeginCommandBuffer();
9644 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9645 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009646
Chris Forbesf29a84f2016-10-06 18:39:28 +13009647 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9648 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009649 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009650
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -06009651 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009652}
9653
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009654TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009655 TEST_DESCRIPTION(
9656 "Attempt to update descriptor sets for images and buffers "
9657 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009658 VkResult err;
9659
Tony Barbour1fa09702017-03-16 12:09:08 -06009660 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009661 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9662 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9663 ds_type_count[i].type = VkDescriptorType(i);
9664 ds_type_count[i].descriptorCount = 1;
9665 }
9666 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9667 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9668 ds_pool_ci.pNext = NULL;
9669 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9670 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9671 ds_pool_ci.pPoolSizes = ds_type_count;
9672
9673 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009674 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009675 ASSERT_VK_SUCCESS(err);
9676
9677 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009678 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009679 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9680 dsl_binding[i].binding = 0;
9681 dsl_binding[i].descriptorType = VkDescriptorType(i);
9682 dsl_binding[i].descriptorCount = 1;
9683 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9684 dsl_binding[i].pImmutableSamplers = NULL;
9685 }
9686
9687 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9688 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9689 ds_layout_ci.pNext = NULL;
9690 ds_layout_ci.bindingCount = 1;
9691 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9692 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9693 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009694 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009695 ASSERT_VK_SUCCESS(err);
9696 }
9697 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9698 VkDescriptorSetAllocateInfo alloc_info = {};
9699 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9700 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9701 alloc_info.descriptorPool = ds_pool;
9702 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009703 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009704 ASSERT_VK_SUCCESS(err);
9705
9706 // Create a buffer & bufferView to be used for invalid updates
9707 VkBufferCreateInfo buff_ci = {};
9708 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009709 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009710 buff_ci.size = 256;
9711 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009712 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009713 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9714 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009715
9716 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9717 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9718 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9719 ASSERT_VK_SUCCESS(err);
9720
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009721 VkMemoryRequirements mem_reqs;
9722 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9723 VkMemoryAllocateInfo mem_alloc_info = {};
9724 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9725 mem_alloc_info.pNext = NULL;
9726 mem_alloc_info.memoryTypeIndex = 0;
9727 mem_alloc_info.allocationSize = mem_reqs.size;
9728 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9729 if (!pass) {
9730 vkDestroyBuffer(m_device->device(), buffer, NULL);
9731 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9732 return;
9733 }
9734 VkDeviceMemory mem;
9735 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9736 ASSERT_VK_SUCCESS(err);
9737 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9738 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009739
9740 VkBufferViewCreateInfo buff_view_ci = {};
9741 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9742 buff_view_ci.buffer = buffer;
9743 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9744 buff_view_ci.range = VK_WHOLE_SIZE;
9745 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009746 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009747 ASSERT_VK_SUCCESS(err);
9748
Tony Barbour415497c2017-01-24 10:06:09 -07009749 // Now get resources / view for storage_texel_buffer
9750 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9751 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9752 if (!pass) {
9753 vkDestroyBuffer(m_device->device(), buffer, NULL);
9754 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9755 vkFreeMemory(m_device->device(), mem, NULL);
9756 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9758 return;
9759 }
9760 VkDeviceMemory storage_texel_buffer_mem;
9761 VkBufferView storage_texel_buffer_view;
9762 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9763 ASSERT_VK_SUCCESS(err);
9764 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9765 ASSERT_VK_SUCCESS(err);
9766 buff_view_ci.buffer = storage_texel_buffer;
9767 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9768 ASSERT_VK_SUCCESS(err);
9769
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009770 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009771 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009772 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009773 image_ci.format = VK_FORMAT_UNDEFINED;
9774 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9775 VkFormat format = static_cast<VkFormat>(f);
9776 VkFormatProperties fProps = m_device->format_properties(format);
9777 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9778 image_ci.format = format;
9779 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9780 break;
9781 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9782 image_ci.format = format;
9783 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9784 break;
9785 }
9786 }
9787 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9788 return;
9789 }
9790
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009791 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9792 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009793 image_ci.extent.width = 64;
9794 image_ci.extent.height = 64;
9795 image_ci.extent.depth = 1;
9796 image_ci.mipLevels = 1;
9797 image_ci.arrayLayers = 1;
9798 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009799 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009800 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009801 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9802 VkImage image;
9803 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9804 ASSERT_VK_SUCCESS(err);
9805 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009806 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009807
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009808 VkMemoryAllocateInfo mem_alloc = {};
9809 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9810 mem_alloc.pNext = NULL;
9811 mem_alloc.allocationSize = 0;
9812 mem_alloc.memoryTypeIndex = 0;
9813 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9814 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009815 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009816 ASSERT_TRUE(pass);
9817 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9818 ASSERT_VK_SUCCESS(err);
9819 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9820 ASSERT_VK_SUCCESS(err);
9821 // Now create view for image
9822 VkImageViewCreateInfo image_view_ci = {};
9823 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9824 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009825 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009826 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9827 image_view_ci.subresourceRange.layerCount = 1;
9828 image_view_ci.subresourceRange.baseArrayLayer = 0;
9829 image_view_ci.subresourceRange.levelCount = 1;
9830 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9831 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009832 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009833 ASSERT_VK_SUCCESS(err);
9834
9835 VkDescriptorBufferInfo buff_info = {};
9836 buff_info.buffer = buffer;
9837 VkDescriptorImageInfo img_info = {};
9838 img_info.imageView = image_view;
9839 VkWriteDescriptorSet descriptor_write = {};
9840 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9841 descriptor_write.dstBinding = 0;
9842 descriptor_write.descriptorCount = 1;
9843 descriptor_write.pTexelBufferView = &buff_view;
9844 descriptor_write.pBufferInfo = &buff_info;
9845 descriptor_write.pImageInfo = &img_info;
9846
9847 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009848 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009849 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9850 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9851 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9852 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9853 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9854 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9855 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9856 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9857 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9858 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9859 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009860 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009861 // Start loop at 1 as SAMPLER desc type has no usage bit error
9862 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009863 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9864 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9865 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9866 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009867 descriptor_write.descriptorType = VkDescriptorType(i);
9868 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009870
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009871 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009872
9873 m_errorMonitor->VerifyFound();
9874 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009875 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9876 descriptor_write.pTexelBufferView = &buff_view;
9877 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009878 }
Tony Barbour415497c2017-01-24 10:06:09 -07009879
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009880 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9881 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009882 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009883 vkDestroyImageView(m_device->device(), image_view, NULL);
9884 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009885 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009886 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009887 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009888 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009889 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009890 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9891}
9892
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009893TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009894 TEST_DESCRIPTION(
9895 "Attempt to update buffer descriptor set that has incorrect "
9896 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009897 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009898 "2. range value of 0\n"
9899 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009900 VkResult err;
9901
Tony Barbour1fa09702017-03-16 12:09:08 -06009902 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009903 VkDescriptorPoolSize ds_type_count = {};
9904 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9905 ds_type_count.descriptorCount = 1;
9906
9907 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9908 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9909 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009910 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009911 ds_pool_ci.maxSets = 1;
9912 ds_pool_ci.poolSizeCount = 1;
9913 ds_pool_ci.pPoolSizes = &ds_type_count;
9914
9915 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009916 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009917 ASSERT_VK_SUCCESS(err);
9918
9919 // Create layout with single uniform buffer descriptor
9920 VkDescriptorSetLayoutBinding dsl_binding = {};
9921 dsl_binding.binding = 0;
9922 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9923 dsl_binding.descriptorCount = 1;
9924 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9925 dsl_binding.pImmutableSamplers = NULL;
9926
9927 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9928 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9929 ds_layout_ci.pNext = NULL;
9930 ds_layout_ci.bindingCount = 1;
9931 ds_layout_ci.pBindings = &dsl_binding;
9932 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009933 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009934 ASSERT_VK_SUCCESS(err);
9935
9936 VkDescriptorSet descriptor_set = {};
9937 VkDescriptorSetAllocateInfo alloc_info = {};
9938 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9939 alloc_info.descriptorSetCount = 1;
9940 alloc_info.descriptorPool = ds_pool;
9941 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009942 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009943 ASSERT_VK_SUCCESS(err);
9944
9945 // Create a buffer to be used for invalid updates
9946 VkBufferCreateInfo buff_ci = {};
9947 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9948 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009949 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009950 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9951 VkBuffer buffer;
9952 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9953 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009954
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009955 // Have to bind memory to buffer before descriptor update
9956 VkMemoryAllocateInfo mem_alloc = {};
9957 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9958 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009959 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009960 mem_alloc.memoryTypeIndex = 0;
9961
9962 VkMemoryRequirements mem_reqs;
9963 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009964 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009965 if (!pass) {
9966 vkDestroyBuffer(m_device->device(), buffer, NULL);
9967 return;
9968 }
9969
9970 VkDeviceMemory mem;
9971 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9972 ASSERT_VK_SUCCESS(err);
9973 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9974 ASSERT_VK_SUCCESS(err);
9975
9976 VkDescriptorBufferInfo buff_info = {};
9977 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009978 // Cause error due to offset out of range
9979 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009980 buff_info.range = VK_WHOLE_SIZE;
9981 VkWriteDescriptorSet descriptor_write = {};
9982 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9983 descriptor_write.dstBinding = 0;
9984 descriptor_write.descriptorCount = 1;
9985 descriptor_write.pTexelBufferView = nullptr;
9986 descriptor_write.pBufferInfo = &buff_info;
9987 descriptor_write.pImageInfo = nullptr;
9988
9989 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9990 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009992
9993 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9994
9995 m_errorMonitor->VerifyFound();
9996 // Now cause error due to range of 0
9997 buff_info.offset = 0;
9998 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010000
10001 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10002
10003 m_errorMonitor->VerifyFound();
10004 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -070010005 buff_info.offset = 0;
10006 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010008
10009 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10010
10011 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -060010012 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -060010013 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10014 vkDestroyBuffer(m_device->device(), buffer, NULL);
10015 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10017}
10018
Tobin Ehlis845887e2017-02-02 19:01:44 -070010019TEST_F(VkLayerTest, DSBufferLimitErrors) {
10020 TEST_DESCRIPTION(
10021 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
10022 "Test cases include:\n"
10023 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
10024 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
10025 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
10026 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
10027 VkResult err;
10028
Tony Barbour1fa09702017-03-16 12:09:08 -060010029 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -070010030 VkDescriptorPoolSize ds_type_count[2] = {};
10031 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10032 ds_type_count[0].descriptorCount = 1;
10033 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10034 ds_type_count[1].descriptorCount = 1;
10035
10036 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10037 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10038 ds_pool_ci.pNext = NULL;
10039 ds_pool_ci.maxSets = 1;
10040 ds_pool_ci.poolSizeCount = 2;
10041 ds_pool_ci.pPoolSizes = ds_type_count;
10042
10043 VkDescriptorPool ds_pool;
10044 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10045 ASSERT_VK_SUCCESS(err);
10046
10047 // Create layout with single uniform buffer & single storage buffer descriptor
10048 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
10049 dsl_binding[0].binding = 0;
10050 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10051 dsl_binding[0].descriptorCount = 1;
10052 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10053 dsl_binding[0].pImmutableSamplers = NULL;
10054 dsl_binding[1].binding = 1;
10055 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10056 dsl_binding[1].descriptorCount = 1;
10057 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10058 dsl_binding[1].pImmutableSamplers = NULL;
10059
10060 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10061 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10062 ds_layout_ci.pNext = NULL;
10063 ds_layout_ci.bindingCount = 2;
10064 ds_layout_ci.pBindings = dsl_binding;
10065 VkDescriptorSetLayout ds_layout;
10066 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10067 ASSERT_VK_SUCCESS(err);
10068
10069 VkDescriptorSet descriptor_set = {};
10070 VkDescriptorSetAllocateInfo alloc_info = {};
10071 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10072 alloc_info.descriptorSetCount = 1;
10073 alloc_info.descriptorPool = ds_pool;
10074 alloc_info.pSetLayouts = &ds_layout;
10075 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10076 ASSERT_VK_SUCCESS(err);
10077
10078 // Create a buffer to be used for invalid updates
10079 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
10080 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
10081 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
10082 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
10083 VkBufferCreateInfo ub_ci = {};
10084 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10085 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
10086 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
10087 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10088 VkBuffer uniform_buffer;
10089 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
10090 ASSERT_VK_SUCCESS(err);
10091 VkBufferCreateInfo sb_ci = {};
10092 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
10093 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
10094 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
10095 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10096 VkBuffer storage_buffer;
10097 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
10098 ASSERT_VK_SUCCESS(err);
10099 // Have to bind memory to buffer before descriptor update
10100 VkMemoryAllocateInfo mem_alloc = {};
10101 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10102 mem_alloc.pNext = NULL;
10103 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
10104 mem_alloc.memoryTypeIndex = 0;
10105
Cort Stratton77a0d592017-02-17 13:14:13 -080010106 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
10107 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
10108 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
10109 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
10110 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010111 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -070010112 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010113 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010114 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010116 return;
10117 }
10118
10119 VkDeviceMemory mem;
10120 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -070010121 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070010122 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -070010123 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10124 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10125 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10126 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10127 return;
10128 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010129 ASSERT_VK_SUCCESS(err);
10130 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
10131 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -080010132 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -070010133 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
10134 ASSERT_VK_SUCCESS(err);
10135
10136 VkDescriptorBufferInfo buff_info = {};
10137 buff_info.buffer = uniform_buffer;
10138 buff_info.range = ub_ci.size; // This will exceed limit
10139 VkWriteDescriptorSet descriptor_write = {};
10140 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10141 descriptor_write.dstBinding = 0;
10142 descriptor_write.descriptorCount = 1;
10143 descriptor_write.pTexelBufferView = nullptr;
10144 descriptor_write.pBufferInfo = &buff_info;
10145 descriptor_write.pImageInfo = nullptr;
10146
10147 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10148 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -060010149 if (max_ub_range != UINT32_MAX) {
10150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
10151 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10152 m_errorMonitor->VerifyFound();
10153 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010154 // Reduce size of range to acceptable limit & cause offset error
10155 buff_info.range = max_ub_range;
10156 buff_info.offset = min_ub_align - 1;
10157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
10158 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10159 m_errorMonitor->VerifyFound();
10160
10161 // Now break storage updates
10162 buff_info.buffer = storage_buffer;
10163 buff_info.range = sb_ci.size; // This will exceed limit
10164 buff_info.offset = 0; // Reset offset for this update
10165
10166 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
10167 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -060010168 if (max_ub_range != UINT32_MAX) {
10169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
10170 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10171 m_errorMonitor->VerifyFound();
10172 }
Tobin Ehlis845887e2017-02-02 19:01:44 -070010173
10174 // Reduce size of range to acceptable limit & cause offset error
10175 buff_info.range = max_sb_range;
10176 buff_info.offset = min_sb_align - 1;
10177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
10178 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10179 m_errorMonitor->VerifyFound();
10180
10181 vkFreeMemory(m_device->device(), mem, NULL);
10182 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10183 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
10184 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
10185 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10186}
10187
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010188TEST_F(VkLayerTest, DSAspectBitsErrors) {
10189 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
10190 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010191 TEST_DESCRIPTION(
10192 "Attempt to update descriptor sets for images "
10193 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010194 VkResult err;
10195
Tony Barbour1fa09702017-03-16 12:09:08 -060010196 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060010197 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070010198 if (!depth_format) {
10199 printf(" No Depth + Stencil format found. Skipped.\n");
10200 return;
10201 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010202 VkDescriptorPoolSize ds_type_count = {};
10203 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10204 ds_type_count.descriptorCount = 1;
10205
10206 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10207 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10208 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010209 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010210 ds_pool_ci.maxSets = 5;
10211 ds_pool_ci.poolSizeCount = 1;
10212 ds_pool_ci.pPoolSizes = &ds_type_count;
10213
10214 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010215 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010216 ASSERT_VK_SUCCESS(err);
10217
10218 VkDescriptorSetLayoutBinding dsl_binding = {};
10219 dsl_binding.binding = 0;
10220 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10221 dsl_binding.descriptorCount = 1;
10222 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10223 dsl_binding.pImmutableSamplers = NULL;
10224
10225 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10226 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10227 ds_layout_ci.pNext = NULL;
10228 ds_layout_ci.bindingCount = 1;
10229 ds_layout_ci.pBindings = &dsl_binding;
10230 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010231 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010232 ASSERT_VK_SUCCESS(err);
10233
10234 VkDescriptorSet descriptor_set = {};
10235 VkDescriptorSetAllocateInfo alloc_info = {};
10236 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10237 alloc_info.descriptorSetCount = 1;
10238 alloc_info.descriptorPool = ds_pool;
10239 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010240 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010241 ASSERT_VK_SUCCESS(err);
10242
10243 // Create an image to be used for invalid updates
10244 VkImageCreateInfo image_ci = {};
10245 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10246 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010247 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010248 image_ci.extent.width = 64;
10249 image_ci.extent.height = 64;
10250 image_ci.extent.depth = 1;
10251 image_ci.mipLevels = 1;
10252 image_ci.arrayLayers = 1;
10253 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010254 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010255 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10256 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10257 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10258 VkImage image;
10259 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10260 ASSERT_VK_SUCCESS(err);
10261 // Bind memory to image
10262 VkMemoryRequirements mem_reqs;
10263 VkDeviceMemory image_mem;
10264 bool pass;
10265 VkMemoryAllocateInfo mem_alloc = {};
10266 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10267 mem_alloc.pNext = NULL;
10268 mem_alloc.allocationSize = 0;
10269 mem_alloc.memoryTypeIndex = 0;
10270 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10271 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010272 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010273 ASSERT_TRUE(pass);
10274 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10275 ASSERT_VK_SUCCESS(err);
10276 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10277 ASSERT_VK_SUCCESS(err);
10278 // Now create view for image
10279 VkImageViewCreateInfo image_view_ci = {};
10280 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10281 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010282 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010283 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10284 image_view_ci.subresourceRange.layerCount = 1;
10285 image_view_ci.subresourceRange.baseArrayLayer = 0;
10286 image_view_ci.subresourceRange.levelCount = 1;
10287 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010288 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010289
10290 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010291 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010292 ASSERT_VK_SUCCESS(err);
10293
10294 VkDescriptorImageInfo img_info = {};
10295 img_info.imageView = image_view;
10296 VkWriteDescriptorSet descriptor_write = {};
10297 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10298 descriptor_write.dstBinding = 0;
10299 descriptor_write.descriptorCount = 1;
10300 descriptor_write.pTexelBufferView = NULL;
10301 descriptor_write.pBufferInfo = NULL;
10302 descriptor_write.pImageInfo = &img_info;
10303 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10304 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010305 const char *error_msg =
10306 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10307 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010309
10310 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10311
10312 m_errorMonitor->VerifyFound();
10313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10314 vkDestroyImage(m_device->device(), image, NULL);
10315 vkFreeMemory(m_device->device(), image_mem, NULL);
10316 vkDestroyImageView(m_device->device(), image_view, NULL);
10317 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10318 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10319}
10320
Karl Schultz6addd812016-02-02 17:17:23 -070010321TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010322 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010323 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010324
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10326 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10327 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010328
Tony Barbour1fa09702017-03-16 12:09:08 -060010329 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010330 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010331 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010332 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10333 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010334
10335 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010336 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10337 ds_pool_ci.pNext = NULL;
10338 ds_pool_ci.maxSets = 1;
10339 ds_pool_ci.poolSizeCount = 1;
10340 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010341
Tobin Ehlis3b780662015-05-28 12:11:26 -060010342 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010343 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010344 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010345 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010346 dsl_binding.binding = 0;
10347 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10348 dsl_binding.descriptorCount = 1;
10349 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10350 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010351
Tony Barboureb254902015-07-15 12:50:33 -060010352 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010353 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10354 ds_layout_ci.pNext = NULL;
10355 ds_layout_ci.bindingCount = 1;
10356 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010357
Tobin Ehlis3b780662015-05-28 12:11:26 -060010358 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010359 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010360 ASSERT_VK_SUCCESS(err);
10361
10362 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010363 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010364 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010365 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010366 alloc_info.descriptorPool = ds_pool;
10367 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010368 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010369 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010370
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010371 VkSamplerCreateInfo sampler_ci = {};
10372 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10373 sampler_ci.pNext = NULL;
10374 sampler_ci.magFilter = VK_FILTER_NEAREST;
10375 sampler_ci.minFilter = VK_FILTER_NEAREST;
10376 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10377 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10378 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10379 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10380 sampler_ci.mipLodBias = 1.0;
10381 sampler_ci.anisotropyEnable = VK_FALSE;
10382 sampler_ci.maxAnisotropy = 1;
10383 sampler_ci.compareEnable = VK_FALSE;
10384 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10385 sampler_ci.minLod = 1.0;
10386 sampler_ci.maxLod = 1.0;
10387 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10388 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10389 VkSampler sampler;
10390 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10391 ASSERT_VK_SUCCESS(err);
10392
10393 VkDescriptorImageInfo info = {};
10394 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010395
10396 VkWriteDescriptorSet descriptor_write;
10397 memset(&descriptor_write, 0, sizeof(descriptor_write));
10398 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010399 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010400 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010401 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010402 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010403 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010404
10405 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10406
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010407 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010408
Chia-I Wuf7458c52015-10-26 21:10:41 +080010409 vkDestroySampler(m_device->device(), sampler, NULL);
10410 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10411 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010412}
10413
Karl Schultz6addd812016-02-02 17:17:23 -070010414TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010415 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010416 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010417
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010419
Tony Barbour1fa09702017-03-16 12:09:08 -060010420 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010421 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010422 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010423 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10424 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010425
10426 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010427 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10428 ds_pool_ci.pNext = NULL;
10429 ds_pool_ci.maxSets = 1;
10430 ds_pool_ci.poolSizeCount = 1;
10431 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010432
Tobin Ehlis3b780662015-05-28 12:11:26 -060010433 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010434 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010435 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010436
Tony Barboureb254902015-07-15 12:50:33 -060010437 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010438 dsl_binding.binding = 0;
10439 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10440 dsl_binding.descriptorCount = 1;
10441 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10442 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010443
10444 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010445 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10446 ds_layout_ci.pNext = NULL;
10447 ds_layout_ci.bindingCount = 1;
10448 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010449
Tobin Ehlis3b780662015-05-28 12:11:26 -060010450 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010451 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010452 ASSERT_VK_SUCCESS(err);
10453
10454 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010455 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010456 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010457 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010458 alloc_info.descriptorPool = ds_pool;
10459 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010460 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010461 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010462
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010463 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10464
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010465 // Correctly update descriptor to avoid "NOT_UPDATED" error
10466 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010467 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010468 buff_info.offset = 0;
10469 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010470
10471 VkWriteDescriptorSet descriptor_write;
10472 memset(&descriptor_write, 0, sizeof(descriptor_write));
10473 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010474 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010475 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010476 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010477 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10478 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010479
10480 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10481
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010482 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010483
Chia-I Wuf7458c52015-10-26 21:10:41 +080010484 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10485 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010486}
10487
Karl Schultz6addd812016-02-02 17:17:23 -070010488TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010489 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010490 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010491
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010493
Tony Barbour1fa09702017-03-16 12:09:08 -060010494 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010495 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010496 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010497 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10498 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010499
10500 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010501 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10502 ds_pool_ci.pNext = NULL;
10503 ds_pool_ci.maxSets = 1;
10504 ds_pool_ci.poolSizeCount = 1;
10505 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010506
Tobin Ehlis3b780662015-05-28 12:11:26 -060010507 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010508 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010509 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010510
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;
Tony Barboureb254902015-07-15 12:50:33 -060010517
10518 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;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010523 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010524 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010525 ASSERT_VK_SUCCESS(err);
10526
10527 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010528 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010529 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010530 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010531 alloc_info.descriptorPool = ds_pool;
10532 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010533 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010534 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010535
Tony Barboureb254902015-07-15 12:50:33 -060010536 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010537 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10538 sampler_ci.pNext = NULL;
10539 sampler_ci.magFilter = VK_FILTER_NEAREST;
10540 sampler_ci.minFilter = VK_FILTER_NEAREST;
10541 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10542 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10543 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10544 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10545 sampler_ci.mipLodBias = 1.0;
10546 sampler_ci.anisotropyEnable = VK_FALSE;
10547 sampler_ci.maxAnisotropy = 1;
10548 sampler_ci.compareEnable = VK_FALSE;
10549 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10550 sampler_ci.minLod = 1.0;
10551 sampler_ci.maxLod = 1.0;
10552 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10553 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010554
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));
10564 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010565 descriptor_write.dstSet = descriptorSet;
10566 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010567 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010568 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010569 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010570 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010571
10572 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10573
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010574 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010575
Chia-I Wuf7458c52015-10-26 21:10:41 +080010576 vkDestroySampler(m_device->device(), sampler, NULL);
10577 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10578 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010579}
10580
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010581TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10582 // Create layout w/ empty binding and attempt to update it
10583 VkResult err;
10584
Tony Barbour1fa09702017-03-16 12:09:08 -060010585 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010586
10587 VkDescriptorPoolSize ds_type_count = {};
10588 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10589 ds_type_count.descriptorCount = 1;
10590
10591 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10592 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10593 ds_pool_ci.pNext = NULL;
10594 ds_pool_ci.maxSets = 1;
10595 ds_pool_ci.poolSizeCount = 1;
10596 ds_pool_ci.pPoolSizes = &ds_type_count;
10597
10598 VkDescriptorPool ds_pool;
10599 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10600 ASSERT_VK_SUCCESS(err);
10601
10602 VkDescriptorSetLayoutBinding dsl_binding = {};
10603 dsl_binding.binding = 0;
10604 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10605 dsl_binding.descriptorCount = 0;
10606 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10607 dsl_binding.pImmutableSamplers = NULL;
10608
10609 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10610 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10611 ds_layout_ci.pNext = NULL;
10612 ds_layout_ci.bindingCount = 1;
10613 ds_layout_ci.pBindings = &dsl_binding;
10614 VkDescriptorSetLayout ds_layout;
10615 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10616 ASSERT_VK_SUCCESS(err);
10617
10618 VkDescriptorSet descriptor_set;
10619 VkDescriptorSetAllocateInfo alloc_info = {};
10620 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10621 alloc_info.descriptorSetCount = 1;
10622 alloc_info.descriptorPool = ds_pool;
10623 alloc_info.pSetLayouts = &ds_layout;
10624 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10625 ASSERT_VK_SUCCESS(err);
10626
10627 VkSamplerCreateInfo sampler_ci = {};
10628 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10629 sampler_ci.magFilter = VK_FILTER_NEAREST;
10630 sampler_ci.minFilter = VK_FILTER_NEAREST;
10631 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10632 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10633 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10634 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10635 sampler_ci.mipLodBias = 1.0;
10636 sampler_ci.maxAnisotropy = 1;
10637 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10638 sampler_ci.minLod = 1.0;
10639 sampler_ci.maxLod = 1.0;
10640 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10641
10642 VkSampler sampler;
10643 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10644 ASSERT_VK_SUCCESS(err);
10645
10646 VkDescriptorImageInfo info = {};
10647 info.sampler = sampler;
10648
10649 VkWriteDescriptorSet descriptor_write;
10650 memset(&descriptor_write, 0, sizeof(descriptor_write));
10651 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10652 descriptor_write.dstSet = descriptor_set;
10653 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010654 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010655 // This is the wrong type, but empty binding error will be flagged first
10656 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10657 descriptor_write.pImageInfo = &info;
10658
10659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10660 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10661 m_errorMonitor->VerifyFound();
10662
10663 vkDestroySampler(m_device->device(), sampler, NULL);
10664 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10665 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10666}
10667
Karl Schultz6addd812016-02-02 17:17:23 -070010668TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10669 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10670 // types
10671 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010672
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010673 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 -060010674
Tony Barbour1fa09702017-03-16 12:09:08 -060010675 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010676
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010677 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010678 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10679 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010680
10681 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010682 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10683 ds_pool_ci.pNext = NULL;
10684 ds_pool_ci.maxSets = 1;
10685 ds_pool_ci.poolSizeCount = 1;
10686 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010687
Tobin Ehlis3b780662015-05-28 12:11:26 -060010688 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010689 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010690 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010691 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010692 dsl_binding.binding = 0;
10693 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10694 dsl_binding.descriptorCount = 1;
10695 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10696 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010697
Tony Barboureb254902015-07-15 12:50:33 -060010698 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010699 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10700 ds_layout_ci.pNext = NULL;
10701 ds_layout_ci.bindingCount = 1;
10702 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010703
Tobin Ehlis3b780662015-05-28 12:11:26 -060010704 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010705 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010706 ASSERT_VK_SUCCESS(err);
10707
10708 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010709 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010710 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010711 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010712 alloc_info.descriptorPool = ds_pool;
10713 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010714 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010715 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010716
Tony Barboureb254902015-07-15 12:50:33 -060010717 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010718 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10719 sampler_ci.pNext = NULL;
10720 sampler_ci.magFilter = VK_FILTER_NEAREST;
10721 sampler_ci.minFilter = VK_FILTER_NEAREST;
10722 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10723 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10724 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10725 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10726 sampler_ci.mipLodBias = 1.0;
10727 sampler_ci.anisotropyEnable = VK_FALSE;
10728 sampler_ci.maxAnisotropy = 1;
10729 sampler_ci.compareEnable = VK_FALSE;
10730 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10731 sampler_ci.minLod = 1.0;
10732 sampler_ci.maxLod = 1.0;
10733 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10734 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010735 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010736 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010737 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010738
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010739 VkDescriptorImageInfo info = {};
10740 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010741
10742 VkWriteDescriptorSet descriptor_write;
10743 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010744 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010745 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010746 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010747 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010748 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010749 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010750
10751 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10752
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010753 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010754
Chia-I Wuf7458c52015-10-26 21:10:41 +080010755 vkDestroySampler(m_device->device(), sampler, NULL);
10756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010758}
10759
Karl Schultz6addd812016-02-02 17:17:23 -070010760TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010761 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010762 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010763
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010765
Tony Barbour1fa09702017-03-16 12:09:08 -060010766 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010767 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10768 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010769 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010770 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10771 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010772
10773 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010774 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10775 ds_pool_ci.pNext = NULL;
10776 ds_pool_ci.maxSets = 1;
10777 ds_pool_ci.poolSizeCount = 1;
10778 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010779
10780 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010781 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010782 ASSERT_VK_SUCCESS(err);
10783
10784 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010785 dsl_binding.binding = 0;
10786 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10787 dsl_binding.descriptorCount = 1;
10788 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10789 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010790
10791 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010792 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10793 ds_layout_ci.pNext = NULL;
10794 ds_layout_ci.bindingCount = 1;
10795 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010796 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010797 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010798 ASSERT_VK_SUCCESS(err);
10799
10800 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010801 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010802 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010803 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010804 alloc_info.descriptorPool = ds_pool;
10805 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010806 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010807 ASSERT_VK_SUCCESS(err);
10808
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010809 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010810
10811 VkDescriptorImageInfo descriptor_info;
10812 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10813 descriptor_info.sampler = sampler;
10814
10815 VkWriteDescriptorSet descriptor_write;
10816 memset(&descriptor_write, 0, sizeof(descriptor_write));
10817 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010818 descriptor_write.dstSet = descriptorSet;
10819 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010820 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010821 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10822 descriptor_write.pImageInfo = &descriptor_info;
10823
10824 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10825
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010826 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010827
Chia-I Wuf7458c52015-10-26 21:10:41 +080010828 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10829 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010830}
10831
Karl Schultz6addd812016-02-02 17:17:23 -070010832TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10833 // Create a single combined Image/Sampler descriptor and send it an invalid
10834 // imageView
10835 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010836
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010838
Tony Barbour1fa09702017-03-16 12:09:08 -060010839 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010840 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010841 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10842 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010843
10844 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010845 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10846 ds_pool_ci.pNext = NULL;
10847 ds_pool_ci.maxSets = 1;
10848 ds_pool_ci.poolSizeCount = 1;
10849 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010850
10851 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010852 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010853 ASSERT_VK_SUCCESS(err);
10854
10855 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010856 dsl_binding.binding = 0;
10857 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10858 dsl_binding.descriptorCount = 1;
10859 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10860 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010861
10862 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010863 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10864 ds_layout_ci.pNext = NULL;
10865 ds_layout_ci.bindingCount = 1;
10866 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010867 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010868 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010869 ASSERT_VK_SUCCESS(err);
10870
10871 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010872 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010873 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010874 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010875 alloc_info.descriptorPool = ds_pool;
10876 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010877 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010878 ASSERT_VK_SUCCESS(err);
10879
10880 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010881 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10882 sampler_ci.pNext = NULL;
10883 sampler_ci.magFilter = VK_FILTER_NEAREST;
10884 sampler_ci.minFilter = VK_FILTER_NEAREST;
10885 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10886 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10887 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10888 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10889 sampler_ci.mipLodBias = 1.0;
10890 sampler_ci.anisotropyEnable = VK_FALSE;
10891 sampler_ci.maxAnisotropy = 1;
10892 sampler_ci.compareEnable = VK_FALSE;
10893 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10894 sampler_ci.minLod = 1.0;
10895 sampler_ci.maxLod = 1.0;
10896 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10897 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010898
10899 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010900 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010901 ASSERT_VK_SUCCESS(err);
10902
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010903 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010904
10905 VkDescriptorImageInfo descriptor_info;
10906 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10907 descriptor_info.sampler = sampler;
10908 descriptor_info.imageView = view;
10909
10910 VkWriteDescriptorSet descriptor_write;
10911 memset(&descriptor_write, 0, sizeof(descriptor_write));
10912 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010913 descriptor_write.dstSet = descriptorSet;
10914 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010915 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010916 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10917 descriptor_write.pImageInfo = &descriptor_info;
10918
10919 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10920
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010921 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010922
Chia-I Wuf7458c52015-10-26 21:10:41 +080010923 vkDestroySampler(m_device->device(), sampler, NULL);
10924 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10925 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010926}
10927
Karl Schultz6addd812016-02-02 17:17:23 -070010928TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10929 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10930 // into the other
10931 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010932
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10934 " binding #1 with type "
10935 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10936 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010937
Tony Barbour1fa09702017-03-16 12:09:08 -060010938 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010939 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010940 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010941 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10942 ds_type_count[0].descriptorCount = 1;
10943 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10944 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010945
10946 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010947 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10948 ds_pool_ci.pNext = NULL;
10949 ds_pool_ci.maxSets = 1;
10950 ds_pool_ci.poolSizeCount = 2;
10951 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010952
10953 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010954 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010955 ASSERT_VK_SUCCESS(err);
10956 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010957 dsl_binding[0].binding = 0;
10958 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10959 dsl_binding[0].descriptorCount = 1;
10960 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10961 dsl_binding[0].pImmutableSamplers = NULL;
10962 dsl_binding[1].binding = 1;
10963 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10964 dsl_binding[1].descriptorCount = 1;
10965 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10966 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010967
10968 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010969 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10970 ds_layout_ci.pNext = NULL;
10971 ds_layout_ci.bindingCount = 2;
10972 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010973
10974 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010975 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010976 ASSERT_VK_SUCCESS(err);
10977
10978 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010979 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010980 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010981 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010982 alloc_info.descriptorPool = ds_pool;
10983 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010984 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010985 ASSERT_VK_SUCCESS(err);
10986
10987 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010988 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10989 sampler_ci.pNext = NULL;
10990 sampler_ci.magFilter = VK_FILTER_NEAREST;
10991 sampler_ci.minFilter = VK_FILTER_NEAREST;
10992 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10993 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10994 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10995 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10996 sampler_ci.mipLodBias = 1.0;
10997 sampler_ci.anisotropyEnable = VK_FALSE;
10998 sampler_ci.maxAnisotropy = 1;
10999 sampler_ci.compareEnable = VK_FALSE;
11000 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
11001 sampler_ci.minLod = 1.0;
11002 sampler_ci.maxLod = 1.0;
11003 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
11004 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011005
11006 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080011007 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011008 ASSERT_VK_SUCCESS(err);
11009
11010 VkDescriptorImageInfo info = {};
11011 info.sampler = sampler;
11012
11013 VkWriteDescriptorSet descriptor_write;
11014 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
11015 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011016 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011017 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080011018 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060011019 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
11020 descriptor_write.pImageInfo = &info;
11021 // This write update should succeed
11022 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
11023 // Now perform a copy update that fails due to type mismatch
11024 VkCopyDescriptorSet copy_ds_update;
11025 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11026 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11027 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011028 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011029 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011030 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
11031 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011032 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11033
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011034 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011035 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011036 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 -060011037 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11038 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11039 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011040 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011041 copy_ds_update.dstSet = descriptorSet;
11042 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011043 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060011044 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11045
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011046 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011047
Tobin Ehlis04356f92015-10-27 16:35:27 -060011048 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11050 " binding#1 with offset index of 1 plus "
11051 "update array offset of 0 and update of "
11052 "5 descriptors oversteps total number "
11053 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011054
Tobin Ehlis04356f92015-10-27 16:35:27 -060011055 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
11056 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
11057 copy_ds_update.srcSet = descriptorSet;
11058 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011059 copy_ds_update.dstSet = descriptorSet;
11060 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011061 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060011062 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
11063
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011064 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060011065
Chia-I Wuf7458c52015-10-26 21:10:41 +080011066 vkDestroySampler(m_device->device(), sampler, NULL);
11067 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11068 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060011069}
11070
Karl Schultz6addd812016-02-02 17:17:23 -070011071TEST_F(VkLayerTest, NumSamplesMismatch) {
11072 // Create CommandBuffer where MSAA samples doesn't match RenderPass
11073 // sampleCount
11074 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011075
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011076 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011077
Tony Barbour1fa09702017-03-16 12:09:08 -060011078 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011080 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060011081 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011082 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011083
11084 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011085 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11086 ds_pool_ci.pNext = NULL;
11087 ds_pool_ci.maxSets = 1;
11088 ds_pool_ci.poolSizeCount = 1;
11089 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011090
Tobin Ehlis3b780662015-05-28 12:11:26 -060011091 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011092 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011093 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011094
Tony Barboureb254902015-07-15 12:50:33 -060011095 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080011096 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060011097 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080011098 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011099 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11100 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011101
Tony Barboureb254902015-07-15 12:50:33 -060011102 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11103 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11104 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080011105 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070011106 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011107
Tobin Ehlis3b780662015-05-28 12:11:26 -060011108 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011109 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011110 ASSERT_VK_SUCCESS(err);
11111
11112 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011113 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011114 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011115 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011116 alloc_info.descriptorPool = ds_pool;
11117 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011119 ASSERT_VK_SUCCESS(err);
11120
Tony Barboureb254902015-07-15 12:50:33 -060011121 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011122 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011123 pipe_ms_state_ci.pNext = NULL;
11124 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11125 pipe_ms_state_ci.sampleShadingEnable = 0;
11126 pipe_ms_state_ci.minSampleShading = 1.0;
11127 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011128
Tony Barboureb254902015-07-15 12:50:33 -060011129 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011130 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11131 pipeline_layout_ci.pNext = NULL;
11132 pipeline_layout_ci.setLayoutCount = 1;
11133 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060011134
11135 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011136 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060011137 ASSERT_VK_SUCCESS(err);
11138
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011139 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011140 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 -060011141 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011142 VkPipelineObj pipe(m_device);
11143 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011144 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011145 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011146 pipe.SetMSAA(&pipe_ms_state_ci);
11147 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011148
Tony Barbour552f6c02016-12-21 14:34:07 -070011149 m_commandBuffer->BeginCommandBuffer();
11150 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011151 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060011152
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070011153 VkViewport viewport = {0, 0, 16, 16, 0, 1};
11154 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
11155 VkRect2D scissor = {{0, 0}, {16, 16}};
11156 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
11157
Mark Young29927482016-05-04 14:38:51 -060011158 // Render triangle (the error should trigger on the attempt to draw).
11159 Draw(3, 1, 0, 0);
11160
11161 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011162 m_commandBuffer->EndRenderPass();
11163 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060011164
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011165 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011166
Chia-I Wuf7458c52015-10-26 21:10:41 +080011167 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11168 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11169 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060011170}
Mark Young29927482016-05-04 14:38:51 -060011171
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011172TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011173 TEST_DESCRIPTION(
11174 "Hit RenderPass incompatible cases. "
11175 "Initial case is drawing with an active renderpass that's "
11176 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011177 VkResult err;
11178
Tony Barbour1fa09702017-03-16 12:09:08 -060011179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011180 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11181
11182 VkDescriptorSetLayoutBinding dsl_binding = {};
11183 dsl_binding.binding = 0;
11184 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11185 dsl_binding.descriptorCount = 1;
11186 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11187 dsl_binding.pImmutableSamplers = NULL;
11188
11189 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11190 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11191 ds_layout_ci.pNext = NULL;
11192 ds_layout_ci.bindingCount = 1;
11193 ds_layout_ci.pBindings = &dsl_binding;
11194
11195 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011196 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011197 ASSERT_VK_SUCCESS(err);
11198
11199 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11200 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11201 pipeline_layout_ci.pNext = NULL;
11202 pipeline_layout_ci.setLayoutCount = 1;
11203 pipeline_layout_ci.pSetLayouts = &ds_layout;
11204
11205 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011206 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011207 ASSERT_VK_SUCCESS(err);
11208
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011209 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011210 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 -060011211 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011212 // Create a renderpass that will be incompatible with default renderpass
11213 VkAttachmentReference attach = {};
11214 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11215 VkAttachmentReference color_att = {};
11216 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11217 VkSubpassDescription subpass = {};
11218 subpass.inputAttachmentCount = 1;
11219 subpass.pInputAttachments = &attach;
11220 subpass.colorAttachmentCount = 1;
11221 subpass.pColorAttachments = &color_att;
11222 VkRenderPassCreateInfo rpci = {};
11223 rpci.subpassCount = 1;
11224 rpci.pSubpasses = &subpass;
11225 rpci.attachmentCount = 1;
11226 VkAttachmentDescription attach_desc = {};
11227 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011228 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11229 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011230 rpci.pAttachments = &attach_desc;
11231 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11232 VkRenderPass rp;
11233 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11234 VkPipelineObj pipe(m_device);
11235 pipe.AddShader(&vs);
11236 pipe.AddShader(&fs);
11237 pipe.AddColorAttachment();
11238 VkViewport view_port = {};
11239 m_viewports.push_back(view_port);
11240 pipe.SetViewport(m_viewports);
11241 VkRect2D rect = {};
11242 m_scissors.push_back(rect);
11243 pipe.SetScissor(m_scissors);
11244 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11245
11246 VkCommandBufferInheritanceInfo cbii = {};
11247 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11248 cbii.renderPass = rp;
11249 cbii.subpass = 0;
11250 VkCommandBufferBeginInfo cbbi = {};
11251 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11252 cbbi.pInheritanceInfo = &cbii;
11253 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11254 VkRenderPassBeginInfo rpbi = {};
11255 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11256 rpbi.framebuffer = m_framebuffer;
11257 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011258 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11259 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011260
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011262 // Render triangle (the error should trigger on the attempt to draw).
11263 Draw(3, 1, 0, 0);
11264
11265 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011266 m_commandBuffer->EndRenderPass();
11267 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011268
11269 m_errorMonitor->VerifyFound();
11270
11271 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11272 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11273 vkDestroyRenderPass(m_device->device(), rp, NULL);
11274}
11275
Mark Youngc89c6312016-03-31 16:03:20 -060011276TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11277 // Create Pipeline where the number of blend attachments doesn't match the
11278 // number of color attachments. In this case, we don't add any color
11279 // blend attachments even though we have a color attachment.
11280 VkResult err;
11281
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011283
Tony Barbour1fa09702017-03-16 12:09:08 -060011284 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11286 VkDescriptorPoolSize ds_type_count = {};
11287 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11288 ds_type_count.descriptorCount = 1;
11289
11290 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11291 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11292 ds_pool_ci.pNext = NULL;
11293 ds_pool_ci.maxSets = 1;
11294 ds_pool_ci.poolSizeCount = 1;
11295 ds_pool_ci.pPoolSizes = &ds_type_count;
11296
11297 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011298 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011299 ASSERT_VK_SUCCESS(err);
11300
11301 VkDescriptorSetLayoutBinding dsl_binding = {};
11302 dsl_binding.binding = 0;
11303 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11304 dsl_binding.descriptorCount = 1;
11305 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11306 dsl_binding.pImmutableSamplers = NULL;
11307
11308 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11309 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11310 ds_layout_ci.pNext = NULL;
11311 ds_layout_ci.bindingCount = 1;
11312 ds_layout_ci.pBindings = &dsl_binding;
11313
11314 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011315 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011316 ASSERT_VK_SUCCESS(err);
11317
11318 VkDescriptorSet descriptorSet;
11319 VkDescriptorSetAllocateInfo alloc_info = {};
11320 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11321 alloc_info.descriptorSetCount = 1;
11322 alloc_info.descriptorPool = ds_pool;
11323 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011324 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011325 ASSERT_VK_SUCCESS(err);
11326
11327 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011328 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011329 pipe_ms_state_ci.pNext = NULL;
11330 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11331 pipe_ms_state_ci.sampleShadingEnable = 0;
11332 pipe_ms_state_ci.minSampleShading = 1.0;
11333 pipe_ms_state_ci.pSampleMask = NULL;
11334
11335 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11336 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11337 pipeline_layout_ci.pNext = NULL;
11338 pipeline_layout_ci.setLayoutCount = 1;
11339 pipeline_layout_ci.pSetLayouts = &ds_layout;
11340
11341 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011342 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011343 ASSERT_VK_SUCCESS(err);
11344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011345 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011346 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 -060011347 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011348 VkPipelineObj pipe(m_device);
11349 pipe.AddShader(&vs);
11350 pipe.AddShader(&fs);
11351 pipe.SetMSAA(&pipe_ms_state_ci);
11352 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011353 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011354
11355 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11356 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11357 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11358}
Mark Young29927482016-05-04 14:38:51 -060011359
Mark Muellerd4914412016-06-13 17:52:06 -060011360TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011361 TEST_DESCRIPTION(
11362 "Points to a wrong colorAttachment index in a VkClearAttachment "
11363 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011364 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011366
11367 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11368 m_errorMonitor->VerifyFound();
11369}
11370
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011371TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011372 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11373 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011374
Tony Barbour1fa09702017-03-16 12:09:08 -060011375 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011377
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011378 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011379 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11380 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011381
11382 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011383 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11384 ds_pool_ci.pNext = NULL;
11385 ds_pool_ci.maxSets = 1;
11386 ds_pool_ci.poolSizeCount = 1;
11387 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011388
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011389 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011390 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011391 ASSERT_VK_SUCCESS(err);
11392
Tony Barboureb254902015-07-15 12:50:33 -060011393 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011394 dsl_binding.binding = 0;
11395 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11396 dsl_binding.descriptorCount = 1;
11397 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11398 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011399
Tony Barboureb254902015-07-15 12:50:33 -060011400 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011401 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11402 ds_layout_ci.pNext = NULL;
11403 ds_layout_ci.bindingCount = 1;
11404 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011405
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011406 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011407 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011408 ASSERT_VK_SUCCESS(err);
11409
11410 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011411 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011412 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011413 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011414 alloc_info.descriptorPool = ds_pool;
11415 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011416 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011417 ASSERT_VK_SUCCESS(err);
11418
Tony Barboureb254902015-07-15 12:50:33 -060011419 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011420 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011421 pipe_ms_state_ci.pNext = NULL;
11422 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11423 pipe_ms_state_ci.sampleShadingEnable = 0;
11424 pipe_ms_state_ci.minSampleShading = 1.0;
11425 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011426
Tony Barboureb254902015-07-15 12:50:33 -060011427 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011428 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11429 pipeline_layout_ci.pNext = NULL;
11430 pipeline_layout_ci.setLayoutCount = 1;
11431 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011432
11433 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011435 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011436
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011437 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011438 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011439 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011440 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011441
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011442 VkPipelineObj pipe(m_device);
11443 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011444 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011445 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011446 pipe.SetMSAA(&pipe_ms_state_ci);
11447 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011448
Tony Barbour552f6c02016-12-21 14:34:07 -070011449 m_commandBuffer->BeginCommandBuffer();
11450 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011451
Karl Schultz6addd812016-02-02 17:17:23 -070011452 // Main thing we care about for this test is that the VkImage obj we're
11453 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011454 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011455 VkClearAttachment color_attachment;
11456 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11457 color_attachment.clearValue.color.float32[0] = 1.0;
11458 color_attachment.clearValue.color.float32[1] = 1.0;
11459 color_attachment.clearValue.color.float32[2] = 1.0;
11460 color_attachment.clearValue.color.float32[3] = 1.0;
11461 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011462 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011463
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011464 // Call for full-sized FB Color attachment prior to issuing a Draw
11465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011466 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011467 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011468 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011469
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011470 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11471 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11473 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11474 m_errorMonitor->VerifyFound();
11475
11476 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11477 clear_rect.layerCount = 2;
11478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11479 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011480 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011481
Chia-I Wuf7458c52015-10-26 21:10:41 +080011482 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11483 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11484 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011485}
11486
Karl Schultz6addd812016-02-02 17:17:23 -070011487TEST_F(VkLayerTest, VtxBufferBadIndex) {
11488 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011489
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11491 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011492
Tony Barbour1fa09702017-03-16 12:09:08 -060011493 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011494 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011496
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011497 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011498 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11499 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011500
11501 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011502 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11503 ds_pool_ci.pNext = NULL;
11504 ds_pool_ci.maxSets = 1;
11505 ds_pool_ci.poolSizeCount = 1;
11506 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011507
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011508 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011509 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011510 ASSERT_VK_SUCCESS(err);
11511
Tony Barboureb254902015-07-15 12:50:33 -060011512 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011513 dsl_binding.binding = 0;
11514 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11515 dsl_binding.descriptorCount = 1;
11516 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11517 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011518
Tony Barboureb254902015-07-15 12:50:33 -060011519 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011520 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11521 ds_layout_ci.pNext = NULL;
11522 ds_layout_ci.bindingCount = 1;
11523 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011524
Tobin Ehlis502480b2015-06-24 15:53:07 -060011525 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011526 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011527 ASSERT_VK_SUCCESS(err);
11528
11529 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011530 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011531 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011532 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011533 alloc_info.descriptorPool = ds_pool;
11534 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011535 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011536 ASSERT_VK_SUCCESS(err);
11537
Tony Barboureb254902015-07-15 12:50:33 -060011538 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011539 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011540 pipe_ms_state_ci.pNext = NULL;
11541 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11542 pipe_ms_state_ci.sampleShadingEnable = 0;
11543 pipe_ms_state_ci.minSampleShading = 1.0;
11544 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011545
Tony Barboureb254902015-07-15 12:50:33 -060011546 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011547 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11548 pipeline_layout_ci.pNext = NULL;
11549 pipeline_layout_ci.setLayoutCount = 1;
11550 pipeline_layout_ci.pSetLayouts = &ds_layout;
11551 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011552
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011553 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011554 ASSERT_VK_SUCCESS(err);
11555
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011556 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011557 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 -060011558 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011559 VkPipelineObj pipe(m_device);
11560 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011561 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011562 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011563 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011564 pipe.SetViewport(m_viewports);
11565 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011566 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011567
Tony Barbour552f6c02016-12-21 14:34:07 -070011568 m_commandBuffer->BeginCommandBuffer();
11569 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011570 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011571 // Don't care about actual data, just need to get to draw to flag error
11572 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011573 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011574 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011575 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011576
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011577 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011578
Chia-I Wuf7458c52015-10-26 21:10:41 +080011579 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11580 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11581 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011582}
Mark Muellerdfe37552016-07-07 14:47:42 -060011583
Mark Mueller2ee294f2016-08-04 12:59:48 -060011584TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011585 TEST_DESCRIPTION(
11586 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11587 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011588 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011589
Mark Mueller880fce52016-08-17 15:23:23 -060011590 // The following test fails with recent NVidia drivers.
11591 // By the time core_validation is reached, the NVidia
11592 // driver has sanitized the invalid condition and core_validation
11593 // is not introduced to the failure condition. This is not the case
11594 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011595 // uint32_t count = static_cast<uint32_t>(~0);
11596 // VkPhysicalDevice physical_device;
11597 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11598 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011599
Mark Mueller2ee294f2016-08-04 12:59:48 -060011600 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011601 VkDeviceQueueCreateInfo queue_create_info = {};
11602 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11603 queue_create_info.queueCount = 1;
11604 queue_create_info.pQueuePriorities = &queue_priority;
11605 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11606
11607 VkPhysicalDeviceFeatures features = m_device->phy().features();
11608 VkDevice testDevice;
11609 VkDeviceCreateInfo device_create_info = {};
11610 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11611 device_create_info.queueCreateInfoCount = 1;
11612 device_create_info.pQueueCreateInfos = &queue_create_info;
11613 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011614
11615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11616 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011617 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11618 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11619 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011620 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11621 m_errorMonitor->VerifyFound();
11622
11623 queue_create_info.queueFamilyIndex = 1;
11624
11625 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11626 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11627 for (unsigned i = 0; i < feature_count; i++) {
11628 if (VK_FALSE == feature_array[i]) {
11629 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011630 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011631 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11632 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011633 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11634 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11635 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11637 "You requested features that are unavailable on this device. You should first "
11638 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011639 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11640 m_errorMonitor->VerifyFound();
11641 break;
11642 }
11643 }
11644}
11645
Tobin Ehlis16edf082016-11-21 12:33:49 -070011646TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11647 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11648
Tony Barbour1fa09702017-03-16 12:09:08 -060011649 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011650
11651 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11652 std::vector<VkDeviceQueueCreateInfo> queue_info;
11653 queue_info.reserve(queue_props.size());
11654 std::vector<std::vector<float>> queue_priorities;
11655 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11656 VkDeviceQueueCreateInfo qi{};
11657 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11658 qi.queueFamilyIndex = i;
11659 qi.queueCount = queue_props[i].queueCount;
11660 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11661 qi.pQueuePriorities = queue_priorities[i].data();
11662 queue_info.push_back(qi);
11663 }
11664
11665 std::vector<const char *> device_extension_names;
11666
11667 VkDevice local_device;
11668 VkDeviceCreateInfo device_create_info = {};
11669 auto features = m_device->phy().features();
11670 // Intentionally disable pipeline stats
11671 features.pipelineStatisticsQuery = VK_FALSE;
11672 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11673 device_create_info.pNext = NULL;
11674 device_create_info.queueCreateInfoCount = queue_info.size();
11675 device_create_info.pQueueCreateInfos = queue_info.data();
11676 device_create_info.enabledLayerCount = 0;
11677 device_create_info.ppEnabledLayerNames = NULL;
11678 device_create_info.pEnabledFeatures = &features;
11679 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11680 ASSERT_VK_SUCCESS(err);
11681
11682 VkQueryPoolCreateInfo qpci{};
11683 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11684 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11685 qpci.queryCount = 1;
11686 VkQueryPool query_pool;
11687
11688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11689 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11690 m_errorMonitor->VerifyFound();
11691
11692 vkDestroyDevice(local_device, nullptr);
11693}
11694
Mark Mueller2ee294f2016-08-04 12:59:48 -060011695TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011696 TEST_DESCRIPTION(
11697 "Use an invalid queue index in a vkCmdWaitEvents call."
11698 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011699
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011700 const char *invalid_queue_index =
11701 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11702 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11703 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011704
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011705 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011706
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011708
Tony Barbour1fa09702017-03-16 12:09:08 -060011709 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011710
11711 VkEvent event;
11712 VkEventCreateInfo event_create_info{};
11713 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11714 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11715
Mark Mueller2ee294f2016-08-04 12:59:48 -060011716 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011717 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011718
Tony Barbour552f6c02016-12-21 14:34:07 -070011719 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011720
11721 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060011722 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 -060011723 ASSERT_TRUE(image.initialized());
11724 VkImageMemoryBarrier img_barrier = {};
11725 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11726 img_barrier.pNext = NULL;
11727 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11728 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11729 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11730 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11731 img_barrier.image = image.handle();
11732 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011733
11734 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11735 // that layer validation catches the case when it is not.
11736 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011737 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11738 img_barrier.subresourceRange.baseArrayLayer = 0;
11739 img_barrier.subresourceRange.baseMipLevel = 0;
11740 img_barrier.subresourceRange.layerCount = 1;
11741 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011742 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11743 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011744 m_errorMonitor->VerifyFound();
11745
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011747
11748 VkQueryPool query_pool;
11749 VkQueryPoolCreateInfo query_pool_create_info = {};
11750 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11751 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11752 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011753 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011754
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011755 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011756 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11757
11758 vkEndCommandBuffer(m_commandBuffer->handle());
11759 m_errorMonitor->VerifyFound();
11760
11761 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11762 vkDestroyEvent(m_device->device(), event, nullptr);
11763}
11764
Mark Muellerdfe37552016-07-07 14:47:42 -060011765TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011766 TEST_DESCRIPTION(
11767 "Submit a command buffer using deleted vertex buffer, "
11768 "delete a buffer twice, use an invalid offset for each "
11769 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011770
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011771 const char *deleted_buffer_in_command_buffer =
11772 "Cannot submit cmd buffer "
11773 "using deleted buffer ";
11774 const char *invalid_offset_message =
11775 "vkBindBufferMemory(): "
11776 "memoryOffset is 0x";
11777 const char *invalid_storage_buffer_offset_message =
11778 "vkBindBufferMemory(): "
11779 "storage memoryOffset "
11780 "is 0x";
11781 const char *invalid_texel_buffer_offset_message =
11782 "vkBindBufferMemory(): "
11783 "texel memoryOffset "
11784 "is 0x";
11785 const char *invalid_uniform_buffer_offset_message =
11786 "vkBindBufferMemory(): "
11787 "uniform memoryOffset "
11788 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011789
Tony Barbour1fa09702017-03-16 12:09:08 -060011790 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011791 ASSERT_NO_FATAL_FAILURE(InitViewport());
11792 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11793
11794 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011795 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011796 pipe_ms_state_ci.pNext = NULL;
11797 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11798 pipe_ms_state_ci.sampleShadingEnable = 0;
11799 pipe_ms_state_ci.minSampleShading = 1.0;
11800 pipe_ms_state_ci.pSampleMask = nullptr;
11801
11802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11804 VkPipelineLayout pipeline_layout;
11805
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011806 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011807 ASSERT_VK_SUCCESS(err);
11808
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011809 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11810 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011811 VkPipelineObj pipe(m_device);
11812 pipe.AddShader(&vs);
11813 pipe.AddShader(&fs);
11814 pipe.AddColorAttachment();
11815 pipe.SetMSAA(&pipe_ms_state_ci);
11816 pipe.SetViewport(m_viewports);
11817 pipe.SetScissor(m_scissors);
11818 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11819
Tony Barbour552f6c02016-12-21 14:34:07 -070011820 m_commandBuffer->BeginCommandBuffer();
11821 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011822 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011823
11824 {
11825 // Create and bind a vertex buffer in a reduced scope, which will cause
11826 // it to be deleted upon leaving this scope
11827 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011828 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011829 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11830 draw_verticies.AddVertexInputToPipe(pipe);
11831 }
11832
11833 Draw(1, 0, 0, 0);
11834
Tony Barbour552f6c02016-12-21 14:34:07 -070011835 m_commandBuffer->EndRenderPass();
11836 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011837
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011839 QueueCommandBuffer(false);
11840 m_errorMonitor->VerifyFound();
11841
11842 {
11843 // Create and bind a vertex buffer in a reduced scope, and delete it
11844 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011845 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011847 buffer_test.TestDoubleDestroy();
11848 }
11849 m_errorMonitor->VerifyFound();
11850
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011851 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011852 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011853 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011855 m_errorMonitor->SetUnexpectedError(
11856 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11857 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011858 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11859 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011860 m_errorMonitor->VerifyFound();
11861 }
11862
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011863 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11864 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011865 // Create and bind a memory buffer with an invalid offset again,
11866 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011868 m_errorMonitor->SetUnexpectedError(
11869 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11870 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011871 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11872 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011873 m_errorMonitor->VerifyFound();
11874 }
11875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011876 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011877 // Create and bind a memory buffer with an invalid offset again, but
11878 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011880 m_errorMonitor->SetUnexpectedError(
11881 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11882 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011883 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11884 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011885 m_errorMonitor->VerifyFound();
11886 }
11887
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011888 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011889 // Create and bind a memory buffer with an invalid offset again, but
11890 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011892 m_errorMonitor->SetUnexpectedError(
11893 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11894 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011895 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11896 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011897 m_errorMonitor->VerifyFound();
11898 }
11899
11900 {
11901 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011903 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11904 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011905 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11906 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011907 m_errorMonitor->VerifyFound();
11908 }
11909
11910 {
11911 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011913 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11914 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011915 }
11916 m_errorMonitor->VerifyFound();
11917
11918 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11919}
11920
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011921// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11922TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011923 TEST_DESCRIPTION(
11924 "Hit all possible validation checks associated with the "
11925 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11926 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011927 // 3 in ValidateCmdBufImageLayouts
11928 // * -1 Attempt to submit cmd buf w/ deleted image
11929 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11930 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011931
Tony Barbour1fa09702017-03-16 12:09:08 -060011932 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060011933 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011934 if (!depth_format) {
11935 printf(" No Depth + Stencil format found. Skipped.\n");
11936 return;
11937 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011938 // Create src & dst images to use for copy operations
11939 VkImage src_image;
11940 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011941 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011942
11943 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11944 const int32_t tex_width = 32;
11945 const int32_t tex_height = 32;
11946
11947 VkImageCreateInfo image_create_info = {};
11948 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11949 image_create_info.pNext = NULL;
11950 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11951 image_create_info.format = tex_format;
11952 image_create_info.extent.width = tex_width;
11953 image_create_info.extent.height = tex_height;
11954 image_create_info.extent.depth = 1;
11955 image_create_info.mipLevels = 1;
11956 image_create_info.arrayLayers = 4;
11957 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11958 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11959 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011960 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011961 image_create_info.flags = 0;
11962
11963 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11964 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011965 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011966 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11967 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011968 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11969 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11970 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11971 ASSERT_VK_SUCCESS(err);
11972
11973 // Allocate memory
11974 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011975 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011976 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011977 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11978 mem_alloc.pNext = NULL;
11979 mem_alloc.allocationSize = 0;
11980 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011981
11982 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011983 mem_alloc.allocationSize = img_mem_reqs.size;
11984 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011985 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011986 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011987 ASSERT_VK_SUCCESS(err);
11988
11989 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011990 mem_alloc.allocationSize = img_mem_reqs.size;
11991 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011992 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011993 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011994 ASSERT_VK_SUCCESS(err);
11995
11996 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011997 mem_alloc.allocationSize = img_mem_reqs.size;
11998 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011999 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080012000 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080012001 ASSERT_VK_SUCCESS(err);
12002
12003 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
12004 ASSERT_VK_SUCCESS(err);
12005 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
12006 ASSERT_VK_SUCCESS(err);
12007 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
12008 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012009
Tony Barbour552f6c02016-12-21 14:34:07 -070012010 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080012011 VkImageCopy copy_region;
12012 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12013 copy_region.srcSubresource.mipLevel = 0;
12014 copy_region.srcSubresource.baseArrayLayer = 0;
12015 copy_region.srcSubresource.layerCount = 1;
12016 copy_region.srcOffset.x = 0;
12017 copy_region.srcOffset.y = 0;
12018 copy_region.srcOffset.z = 0;
12019 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12020 copy_region.dstSubresource.mipLevel = 0;
12021 copy_region.dstSubresource.baseArrayLayer = 0;
12022 copy_region.dstSubresource.layerCount = 1;
12023 copy_region.dstOffset.x = 0;
12024 copy_region.dstOffset.y = 0;
12025 copy_region.dstOffset.z = 0;
12026 copy_region.extent.width = 1;
12027 copy_region.extent.height = 1;
12028 copy_region.extent.depth = 1;
12029
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12031 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12032 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012033
Cort530cf382016-12-08 09:59:47 -080012034 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 -060012035 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012036 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
12037 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012038 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
12039 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060012040 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 -060012041 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012043 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
12044 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012045 m_errorMonitor->SetUnexpectedError("srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080012046 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 -060012047 m_errorMonitor->VerifyFound();
12048 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012050 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012051 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012052 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012053 "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 -080012054 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 -060012055 m_errorMonitor->VerifyFound();
12056 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12058 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
12059 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080012060 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 -060012061 m_errorMonitor->VerifyFound();
12062 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012064 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012065 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012066 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012067 "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 -080012068 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 -060012069 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060012070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012071 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
12072 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012073 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012074 "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 -080012075 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 -060012076 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012077
Cort3b021012016-12-07 12:00:57 -080012078 // Convert dst and depth images to TRANSFER_DST for subsequent tests
12079 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
12080 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
12081 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
12082 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
12083 transfer_dst_image_barrier[0].srcAccessMask = 0;
12084 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
12085 transfer_dst_image_barrier[0].image = dst_image;
12086 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12087 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
12088 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12089 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12090 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12091 transfer_dst_image_barrier[0].image = depth_image;
12092 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
12093 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12094 NULL, 0, NULL, 1, transfer_dst_image_barrier);
12095
12096 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080012097 VkClearColorValue color_clear_value = {};
12098 VkImageSubresourceRange clear_range;
12099 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12100 clear_range.baseMipLevel = 0;
12101 clear_range.baseArrayLayer = 0;
12102 clear_range.layerCount = 1;
12103 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012104
Cort3b021012016-12-07 12:00:57 -080012105 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
12106 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
12108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012109 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012110 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012111 // Fail due to provided layout not matching actual current layout for color clear.
12112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080012113 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012114 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080012115
Cort530cf382016-12-08 09:59:47 -080012116 VkClearDepthStencilValue depth_clear_value = {};
12117 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080012118
12119 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
12120 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
12121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
12122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012123 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012124 m_errorMonitor->VerifyFound();
12125 // Fail due to provided layout not matching actual current layout for depth clear.
12126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080012127 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080012128 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010012129
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012130 // Now cause error due to bad image layout transition in PipelineBarrier
12131 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080012132 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012133 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080012134 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012135 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080012136 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
12137 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012138 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012140 "you cannot transition the layout of aspect 1 from "
12141 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
12142 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070012143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012144 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
12145 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012146 m_errorMonitor->VerifyFound();
12147
12148 // Finally some layout errors at RenderPass create time
12149 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
12150 VkAttachmentReference attach = {};
12151 // perf warning for GENERAL layout w/ non-DS input attachment
12152 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12153 VkSubpassDescription subpass = {};
12154 subpass.inputAttachmentCount = 1;
12155 subpass.pInputAttachments = &attach;
12156 VkRenderPassCreateInfo rpci = {};
12157 rpci.subpassCount = 1;
12158 rpci.pSubpasses = &subpass;
12159 rpci.attachmentCount = 1;
12160 VkAttachmentDescription attach_desc = {};
12161 attach_desc.format = VK_FORMAT_UNDEFINED;
12162 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012163 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012164 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12166 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012167 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12168 m_errorMonitor->VerifyFound();
12169 // error w/ non-general layout
12170 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12171
12172 m_errorMonitor->SetDesiredFailureMsg(
12173 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12174 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
12175 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12176 m_errorMonitor->VerifyFound();
12177 subpass.inputAttachmentCount = 0;
12178 subpass.colorAttachmentCount = 1;
12179 subpass.pColorAttachments = &attach;
12180 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12181 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12183 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012184 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12185 m_errorMonitor->VerifyFound();
12186 // error w/ non-color opt or GENERAL layout for color attachment
12187 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
12188 m_errorMonitor->SetDesiredFailureMsg(
12189 VK_DEBUG_REPORT_ERROR_BIT_EXT,
12190 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
12191 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12192 m_errorMonitor->VerifyFound();
12193 subpass.colorAttachmentCount = 0;
12194 subpass.pDepthStencilAttachment = &attach;
12195 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
12196 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12198 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012199 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12200 m_errorMonitor->VerifyFound();
12201 // error w/ non-ds opt or GENERAL layout for color attachment
12202 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12204 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12205 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012206 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12207 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012208 // For this error we need a valid renderpass so create default one
12209 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12210 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012211 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012212 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12213 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12214 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12215 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12216 // Can't do a CLEAR load on READ_ONLY initialLayout
12217 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12218 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12219 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012221 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012222 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12223 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012224
Cort3b021012016-12-07 12:00:57 -080012225 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12226 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12227 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012228 vkDestroyImage(m_device->device(), src_image, NULL);
12229 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012230 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012231}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012232
Tobin Ehlise0936662016-10-11 08:10:51 -060012233TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12234 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12235 VkResult err;
12236
Tony Barbour1fa09702017-03-16 12:09:08 -060012237 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012238
12239 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12240 VkImageTiling tiling;
12241 VkFormatProperties format_properties;
12242 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12243 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12244 tiling = VK_IMAGE_TILING_LINEAR;
12245 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12246 tiling = VK_IMAGE_TILING_OPTIMAL;
12247 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012248 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012249 return;
12250 }
12251
12252 VkDescriptorPoolSize ds_type = {};
12253 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12254 ds_type.descriptorCount = 1;
12255
12256 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12257 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12258 ds_pool_ci.maxSets = 1;
12259 ds_pool_ci.poolSizeCount = 1;
12260 ds_pool_ci.pPoolSizes = &ds_type;
12261 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12262
12263 VkDescriptorPool ds_pool;
12264 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12265 ASSERT_VK_SUCCESS(err);
12266
12267 VkDescriptorSetLayoutBinding dsl_binding = {};
12268 dsl_binding.binding = 0;
12269 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12270 dsl_binding.descriptorCount = 1;
12271 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12272 dsl_binding.pImmutableSamplers = NULL;
12273
12274 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12275 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12276 ds_layout_ci.pNext = NULL;
12277 ds_layout_ci.bindingCount = 1;
12278 ds_layout_ci.pBindings = &dsl_binding;
12279
12280 VkDescriptorSetLayout ds_layout;
12281 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12282 ASSERT_VK_SUCCESS(err);
12283
12284 VkDescriptorSetAllocateInfo alloc_info = {};
12285 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12286 alloc_info.descriptorSetCount = 1;
12287 alloc_info.descriptorPool = ds_pool;
12288 alloc_info.pSetLayouts = &ds_layout;
12289 VkDescriptorSet descriptor_set;
12290 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12291 ASSERT_VK_SUCCESS(err);
12292
12293 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12294 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12295 pipeline_layout_ci.pNext = NULL;
12296 pipeline_layout_ci.setLayoutCount = 1;
12297 pipeline_layout_ci.pSetLayouts = &ds_layout;
12298 VkPipelineLayout pipeline_layout;
12299 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12300 ASSERT_VK_SUCCESS(err);
12301
12302 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012303 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
Tobin Ehlise0936662016-10-11 08:10:51 -060012304 ASSERT_TRUE(image.initialized());
12305 VkImageView view = image.targetView(tex_format);
12306
12307 VkDescriptorImageInfo image_info = {};
12308 image_info.imageView = view;
12309 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12310
12311 VkWriteDescriptorSet descriptor_write = {};
12312 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12313 descriptor_write.dstSet = descriptor_set;
12314 descriptor_write.dstBinding = 0;
12315 descriptor_write.descriptorCount = 1;
12316 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12317 descriptor_write.pImageInfo = &image_info;
12318
12319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12320 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12321 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12322 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12323 m_errorMonitor->VerifyFound();
12324
12325 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12326 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12327 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12328 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12329}
12330
Mark Mueller93b938f2016-08-18 10:27:40 -060012331TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012332 TEST_DESCRIPTION(
12333 "Use vkCmdExecuteCommands with invalid state "
12334 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012335
Tony Barbour1fa09702017-03-16 12:09:08 -060012336 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12338
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012339 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012340 const char *simultaneous_use_message2 =
12341 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12342 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012343
12344 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012345 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012346 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012347 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12348 command_buffer_allocate_info.commandBufferCount = 1;
12349
12350 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012351 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012352 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12353 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012354 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012355 command_buffer_inheritance_info.renderPass = m_renderPass;
12356 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012357
Mark Mueller93b938f2016-08-18 10:27:40 -060012358 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012359 command_buffer_begin_info.flags =
12360 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012361 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12362
12363 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12364 vkEndCommandBuffer(secondary_command_buffer);
12365
Mark Mueller93b938f2016-08-18 10:27:40 -060012366 VkSubmitInfo submit_info = {};
12367 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12368 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012369 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012370
Mark Mueller4042b652016-09-05 22:52:21 -060012371 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012372 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12374 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012375 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012376 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012377 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12378 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012379
Dave Houltonfbf52152017-01-06 12:55:29 -070012380 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012381 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012382 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012383
Mark Mueller4042b652016-09-05 22:52:21 -060012384 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012385 m_errorMonitor->SetUnexpectedError("commandBuffer must not be in the recording or pending state.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012386 m_errorMonitor->SetUnexpectedError(
12387 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12388 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012389 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012390 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012391
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12393 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012394 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012395 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12396 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012397
12398 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012399
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060012400 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012401}
12402
Tony Barbour626994c2017-02-08 15:29:37 -070012403TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12404 TEST_DESCRIPTION(
12405 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12406 "errors");
12407 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12408 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 -060012409 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012410
12411 VkCommandBuffer cmd_bufs[2];
12412 VkCommandBufferAllocateInfo alloc_info;
12413 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12414 alloc_info.pNext = NULL;
12415 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012416 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012417 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12418 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12419
12420 VkCommandBufferBeginInfo cb_binfo;
12421 cb_binfo.pNext = NULL;
12422 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12423 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12424 cb_binfo.flags = 0;
12425 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12426 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12427 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12428 vkEndCommandBuffer(cmd_bufs[0]);
12429 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12430
12431 VkSubmitInfo submit_info = {};
12432 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12433 submit_info.commandBufferCount = 2;
12434 submit_info.pCommandBuffers = duplicates;
12435 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12436 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12437 m_errorMonitor->VerifyFound();
12438 vkQueueWaitIdle(m_device->m_queue);
12439
12440 // Set one time use and now look for one time submit
12441 duplicates[0] = duplicates[1] = cmd_bufs[1];
12442 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12443 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12444 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12445 vkEndCommandBuffer(cmd_bufs[1]);
12446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12447 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12448 m_errorMonitor->VerifyFound();
12449 vkQueueWaitIdle(m_device->m_queue);
12450}
12451
Tobin Ehlisb093da82017-01-19 12:05:27 -070012452TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012453 TEST_DESCRIPTION(
12454 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12455 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012456
Tony Barbour1fa09702017-03-16 12:09:08 -060012457 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012458 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12459
12460 std::vector<const char *> device_extension_names;
12461 auto features = m_device->phy().features();
12462 // Make sure gs & ts are disabled
12463 features.geometryShader = false;
12464 features.tessellationShader = false;
12465 // The sacrificial device object
12466 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12467
12468 VkCommandPoolCreateInfo pool_create_info{};
12469 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12470 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12471
12472 VkCommandPool command_pool;
12473 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12474
12475 VkCommandBufferAllocateInfo cmd = {};
12476 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12477 cmd.pNext = NULL;
12478 cmd.commandPool = command_pool;
12479 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12480 cmd.commandBufferCount = 1;
12481
12482 VkCommandBuffer cmd_buffer;
12483 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12484 ASSERT_VK_SUCCESS(err);
12485
12486 VkEvent event;
12487 VkEventCreateInfo evci = {};
12488 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12489 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12490 ASSERT_VK_SUCCESS(result);
12491
12492 VkCommandBufferBeginInfo cbbi = {};
12493 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12494 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12495 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12496 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12497 m_errorMonitor->VerifyFound();
12498
12499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12500 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12501 m_errorMonitor->VerifyFound();
12502
12503 vkDestroyEvent(test_device.handle(), event, NULL);
12504 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12505}
12506
Chris Forbesd70103a2017-04-13 11:34:09 -070012507TEST_F(VkLayerTest, EventInUseDestroyedSignaled) {
Tony Barbour1fa09702017-03-16 12:09:08 -060012508 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12510
Tony Barbour552f6c02016-12-21 14:34:07 -070012511 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012512
12513 VkEvent event;
12514 VkEventCreateInfo event_create_info = {};
12515 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12516 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012517 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012518
Tony Barbour552f6c02016-12-21 14:34:07 -070012519 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012520 vkDestroyEvent(m_device->device(), event, nullptr);
12521
12522 VkSubmitInfo submit_info = {};
12523 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12524 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012525 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012527 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12528 m_errorMonitor->VerifyFound();
Chris Forbesd70103a2017-04-13 11:34:09 -070012529}
Mark Muellerc8d441e2016-08-23 17:36:00 -060012530
Chris Forbesd70103a2017-04-13 11:34:09 -070012531TEST_F(VkLayerTest, InUseDestroyedSignaled) {
12532 TEST_DESCRIPTION(
12533 "Use vkCmdExecuteCommands with invalid state "
12534 "in primary and secondary command buffers. "
12535 "Delete objects that are inuse. Call VkQueueSubmit "
12536 "with an event that has been deleted.");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012537
Chris Forbesd70103a2017-04-13 11:34:09 -070012538 ASSERT_NO_FATAL_FAILURE(Init());
12539 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12540
12541 m_errorMonitor->ExpectSuccess();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012542
Mark Mueller917f6bc2016-08-30 10:57:19 -060012543 VkSemaphoreCreateInfo semaphore_create_info = {};
12544 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12545 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012546 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012547 VkFenceCreateInfo fence_create_info = {};
12548 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12549 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012550 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012551
12552 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012553 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012554 descriptor_pool_type_count.descriptorCount = 1;
12555
12556 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12557 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12558 descriptor_pool_create_info.maxSets = 1;
12559 descriptor_pool_create_info.poolSizeCount = 1;
12560 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012561 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012562
12563 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012564 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012565
12566 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012567 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012568 descriptorset_layout_binding.descriptorCount = 1;
12569 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12570
12571 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012572 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012573 descriptorset_layout_create_info.bindingCount = 1;
12574 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12575
12576 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012577 ASSERT_VK_SUCCESS(
12578 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012579
12580 VkDescriptorSet descriptorset;
12581 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012582 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012583 descriptorset_allocate_info.descriptorSetCount = 1;
12584 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12585 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012586 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012587
Mark Mueller4042b652016-09-05 22:52:21 -060012588 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12589
12590 VkDescriptorBufferInfo buffer_info = {};
12591 buffer_info.buffer = buffer_test.GetBuffer();
12592 buffer_info.offset = 0;
12593 buffer_info.range = 1024;
12594
12595 VkWriteDescriptorSet write_descriptor_set = {};
12596 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12597 write_descriptor_set.dstSet = descriptorset;
12598 write_descriptor_set.descriptorCount = 1;
12599 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12600 write_descriptor_set.pBufferInfo = &buffer_info;
12601
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012602 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012603
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012604 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12605 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012606
12607 VkPipelineObj pipe(m_device);
12608 pipe.AddColorAttachment();
12609 pipe.AddShader(&vs);
12610 pipe.AddShader(&fs);
12611
12612 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012613 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012614 pipeline_layout_create_info.setLayoutCount = 1;
12615 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12616
12617 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012618 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012619
12620 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12621
Chris Forbesd70103a2017-04-13 11:34:09 -070012622 VkEvent event;
12623 VkEventCreateInfo event_create_info = {};
12624 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12625 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12626
Tony Barbour552f6c02016-12-21 14:34:07 -070012627 m_commandBuffer->BeginCommandBuffer();
Chris Forbesd70103a2017-04-13 11:34:09 -070012628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012629 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012630
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012631 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12632 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12633 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012634
Tony Barbour552f6c02016-12-21 14:34:07 -070012635 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012636
Chris Forbesd70103a2017-04-13 11:34:09 -070012637 VkSubmitInfo submit_info = {};
12638 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12639 submit_info.commandBufferCount = 1;
12640 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012641 submit_info.signalSemaphoreCount = 1;
12642 submit_info.pSignalSemaphores = &semaphore;
12643 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012644 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012645
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012647 vkDestroyEvent(m_device->device(), event, nullptr);
12648 m_errorMonitor->VerifyFound();
12649
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012651 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12652 m_errorMonitor->VerifyFound();
12653
Jeremy Hayes08369882017-02-02 10:31:06 -070012654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012655 vkDestroyFence(m_device->device(), fence, nullptr);
12656 m_errorMonitor->VerifyFound();
12657
Tobin Ehlis122207b2016-09-01 08:50:06 -070012658 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012659 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12660 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012661 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012662 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12663 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012664 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012665 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12666 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012667 vkDestroyEvent(m_device->device(), event, nullptr);
12668 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012669 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012670 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12671}
12672
Tobin Ehlis2adda372016-09-01 08:51:06 -070012673TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12674 TEST_DESCRIPTION("Delete in-use query pool.");
12675
Tony Barbour1fa09702017-03-16 12:09:08 -060012676 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12678
12679 VkQueryPool query_pool;
12680 VkQueryPoolCreateInfo query_pool_ci{};
12681 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12682 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12683 query_pool_ci.queryCount = 1;
12684 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012685 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012686 // Reset query pool to create binding with cmd buffer
12687 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12688
Tony Barbour552f6c02016-12-21 14:34:07 -070012689 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012690
12691 VkSubmitInfo submit_info = {};
12692 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12693 submit_info.commandBufferCount = 1;
12694 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12695 // Submit cmd buffer and then destroy query pool while in-flight
12696 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12697
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012699 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12700 m_errorMonitor->VerifyFound();
12701
12702 vkQueueWaitIdle(m_device->m_queue);
12703 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012704 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012705 m_errorMonitor->SetUnexpectedError("Unable to remove QueryPool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012706 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12707}
12708
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012709TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12710 TEST_DESCRIPTION("Delete in-use pipeline.");
12711
Tony Barbour1fa09702017-03-16 12:09:08 -060012712 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012713 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12714
12715 // Empty pipeline layout used for binding PSO
12716 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12717 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12718 pipeline_layout_ci.setLayoutCount = 0;
12719 pipeline_layout_ci.pSetLayouts = NULL;
12720
12721 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012722 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012723 ASSERT_VK_SUCCESS(err);
12724
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012726 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012727 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12728 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012729 // Store pipeline handle so we can actually delete it before test finishes
12730 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012731 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012732 VkPipelineObj pipe(m_device);
12733 pipe.AddShader(&vs);
12734 pipe.AddShader(&fs);
12735 pipe.AddColorAttachment();
12736 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12737 delete_this_pipeline = pipe.handle();
12738
Tony Barbour552f6c02016-12-21 14:34:07 -070012739 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012740 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012741 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012742
Tony Barbour552f6c02016-12-21 14:34:07 -070012743 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012744
12745 VkSubmitInfo submit_info = {};
12746 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12747 submit_info.commandBufferCount = 1;
12748 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12749 // Submit cmd buffer and then pipeline destroyed while in-flight
12750 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012751 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012752 m_errorMonitor->VerifyFound();
12753 // Make sure queue finished and then actually delete pipeline
12754 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012755 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12756 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012757 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12758 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12759}
12760
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012761TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12762 TEST_DESCRIPTION("Delete in-use imageView.");
12763
Tony Barbour1fa09702017-03-16 12:09:08 -060012764 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012765 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12766
12767 VkDescriptorPoolSize ds_type_count;
12768 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12769 ds_type_count.descriptorCount = 1;
12770
12771 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12772 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12773 ds_pool_ci.maxSets = 1;
12774 ds_pool_ci.poolSizeCount = 1;
12775 ds_pool_ci.pPoolSizes = &ds_type_count;
12776
12777 VkDescriptorPool ds_pool;
12778 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12779 ASSERT_VK_SUCCESS(err);
12780
12781 VkSamplerCreateInfo sampler_ci = {};
12782 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12783 sampler_ci.pNext = NULL;
12784 sampler_ci.magFilter = VK_FILTER_NEAREST;
12785 sampler_ci.minFilter = VK_FILTER_NEAREST;
12786 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12787 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12788 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12789 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12790 sampler_ci.mipLodBias = 1.0;
12791 sampler_ci.anisotropyEnable = VK_FALSE;
12792 sampler_ci.maxAnisotropy = 1;
12793 sampler_ci.compareEnable = VK_FALSE;
12794 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12795 sampler_ci.minLod = 1.0;
12796 sampler_ci.maxLod = 1.0;
12797 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12798 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12799 VkSampler sampler;
12800
12801 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12802 ASSERT_VK_SUCCESS(err);
12803
12804 VkDescriptorSetLayoutBinding layout_binding;
12805 layout_binding.binding = 0;
12806 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12807 layout_binding.descriptorCount = 1;
12808 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12809 layout_binding.pImmutableSamplers = NULL;
12810
12811 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12812 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12813 ds_layout_ci.bindingCount = 1;
12814 ds_layout_ci.pBindings = &layout_binding;
12815 VkDescriptorSetLayout ds_layout;
12816 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12817 ASSERT_VK_SUCCESS(err);
12818
12819 VkDescriptorSetAllocateInfo alloc_info = {};
12820 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12821 alloc_info.descriptorSetCount = 1;
12822 alloc_info.descriptorPool = ds_pool;
12823 alloc_info.pSetLayouts = &ds_layout;
12824 VkDescriptorSet descriptor_set;
12825 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12826 ASSERT_VK_SUCCESS(err);
12827
12828 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12829 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12830 pipeline_layout_ci.pNext = NULL;
12831 pipeline_layout_ci.setLayoutCount = 1;
12832 pipeline_layout_ci.pSetLayouts = &ds_layout;
12833
12834 VkPipelineLayout pipeline_layout;
12835 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12836 ASSERT_VK_SUCCESS(err);
12837
12838 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060012839 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 -060012840 ASSERT_TRUE(image.initialized());
12841
12842 VkImageView view;
12843 VkImageViewCreateInfo ivci = {};
12844 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12845 ivci.image = image.handle();
12846 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12847 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12848 ivci.subresourceRange.layerCount = 1;
12849 ivci.subresourceRange.baseMipLevel = 0;
12850 ivci.subresourceRange.levelCount = 1;
12851 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12852
12853 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12854 ASSERT_VK_SUCCESS(err);
12855
12856 VkDescriptorImageInfo image_info{};
12857 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12858 image_info.imageView = view;
12859 image_info.sampler = sampler;
12860
12861 VkWriteDescriptorSet descriptor_write = {};
12862 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12863 descriptor_write.dstSet = descriptor_set;
12864 descriptor_write.dstBinding = 0;
12865 descriptor_write.descriptorCount = 1;
12866 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12867 descriptor_write.pImageInfo = &image_info;
12868
12869 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12870
12871 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012872 char const *vsSource =
12873 "#version 450\n"
12874 "\n"
12875 "out gl_PerVertex { \n"
12876 " vec4 gl_Position;\n"
12877 "};\n"
12878 "void main(){\n"
12879 " gl_Position = vec4(1);\n"
12880 "}\n";
12881 char const *fsSource =
12882 "#version 450\n"
12883 "\n"
12884 "layout(set=0, binding=0) uniform sampler2D s;\n"
12885 "layout(location=0) out vec4 x;\n"
12886 "void main(){\n"
12887 " x = texture(s, vec2(1));\n"
12888 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012889 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12890 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12891 VkPipelineObj pipe(m_device);
12892 pipe.AddShader(&vs);
12893 pipe.AddShader(&fs);
12894 pipe.AddColorAttachment();
12895 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12896
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012898
Tony Barbour552f6c02016-12-21 14:34:07 -070012899 m_commandBuffer->BeginCommandBuffer();
12900 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012901 // Bind pipeline to cmd buffer
12902 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12903 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12904 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012905
12906 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12907 VkRect2D scissor = {{0, 0}, {16, 16}};
12908 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12909 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12910
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012911 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012912 m_commandBuffer->EndRenderPass();
12913 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012914 // Submit cmd buffer then destroy sampler
12915 VkSubmitInfo submit_info = {};
12916 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12917 submit_info.commandBufferCount = 1;
12918 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12919 // Submit cmd buffer and then destroy imageView while in-flight
12920 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12921
12922 vkDestroyImageView(m_device->device(), view, nullptr);
12923 m_errorMonitor->VerifyFound();
12924 vkQueueWaitIdle(m_device->m_queue);
12925 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012926 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060012927 m_errorMonitor->SetUnexpectedError("Unable to remove ImageView obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012928 vkDestroyImageView(m_device->device(), view, NULL);
12929 vkDestroySampler(m_device->device(), sampler, nullptr);
12930 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12931 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12932 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12933}
12934
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012935TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12936 TEST_DESCRIPTION("Delete in-use bufferView.");
12937
Tony Barbour1fa09702017-03-16 12:09:08 -060012938 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12940
12941 VkDescriptorPoolSize ds_type_count;
12942 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12943 ds_type_count.descriptorCount = 1;
12944
12945 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12946 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12947 ds_pool_ci.maxSets = 1;
12948 ds_pool_ci.poolSizeCount = 1;
12949 ds_pool_ci.pPoolSizes = &ds_type_count;
12950
12951 VkDescriptorPool ds_pool;
12952 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12953 ASSERT_VK_SUCCESS(err);
12954
12955 VkDescriptorSetLayoutBinding layout_binding;
12956 layout_binding.binding = 0;
12957 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12958 layout_binding.descriptorCount = 1;
12959 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12960 layout_binding.pImmutableSamplers = NULL;
12961
12962 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12963 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12964 ds_layout_ci.bindingCount = 1;
12965 ds_layout_ci.pBindings = &layout_binding;
12966 VkDescriptorSetLayout ds_layout;
12967 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12968 ASSERT_VK_SUCCESS(err);
12969
12970 VkDescriptorSetAllocateInfo alloc_info = {};
12971 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12972 alloc_info.descriptorSetCount = 1;
12973 alloc_info.descriptorPool = ds_pool;
12974 alloc_info.pSetLayouts = &ds_layout;
12975 VkDescriptorSet descriptor_set;
12976 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12977 ASSERT_VK_SUCCESS(err);
12978
12979 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12980 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12981 pipeline_layout_ci.pNext = NULL;
12982 pipeline_layout_ci.setLayoutCount = 1;
12983 pipeline_layout_ci.pSetLayouts = &ds_layout;
12984
12985 VkPipelineLayout pipeline_layout;
12986 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12987 ASSERT_VK_SUCCESS(err);
12988
12989 VkBuffer buffer;
12990 uint32_t queue_family_index = 0;
12991 VkBufferCreateInfo buffer_create_info = {};
12992 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12993 buffer_create_info.size = 1024;
12994 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12995 buffer_create_info.queueFamilyIndexCount = 1;
12996 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12997
12998 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12999 ASSERT_VK_SUCCESS(err);
13000
13001 VkMemoryRequirements memory_reqs;
13002 VkDeviceMemory buffer_memory;
13003
13004 VkMemoryAllocateInfo memory_info = {};
13005 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
13006 memory_info.allocationSize = 0;
13007 memory_info.memoryTypeIndex = 0;
13008
13009 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
13010 memory_info.allocationSize = memory_reqs.size;
13011 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
13012 ASSERT_TRUE(pass);
13013
13014 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
13015 ASSERT_VK_SUCCESS(err);
13016 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
13017 ASSERT_VK_SUCCESS(err);
13018
13019 VkBufferView view;
13020 VkBufferViewCreateInfo bvci = {};
13021 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
13022 bvci.buffer = buffer;
13023 bvci.format = VK_FORMAT_R8_UNORM;
13024 bvci.range = VK_WHOLE_SIZE;
13025
13026 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
13027 ASSERT_VK_SUCCESS(err);
13028
13029 VkWriteDescriptorSet descriptor_write = {};
13030 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13031 descriptor_write.dstSet = descriptor_set;
13032 descriptor_write.dstBinding = 0;
13033 descriptor_write.descriptorCount = 1;
13034 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
13035 descriptor_write.pTexelBufferView = &view;
13036
13037 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13038
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013039 char const *vsSource =
13040 "#version 450\n"
13041 "\n"
13042 "out gl_PerVertex { \n"
13043 " vec4 gl_Position;\n"
13044 "};\n"
13045 "void main(){\n"
13046 " gl_Position = vec4(1);\n"
13047 "}\n";
13048 char const *fsSource =
13049 "#version 450\n"
13050 "\n"
13051 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
13052 "layout(location=0) out vec4 x;\n"
13053 "void main(){\n"
13054 " x = imageLoad(s, 0);\n"
13055 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13058 VkPipelineObj pipe(m_device);
13059 pipe.AddShader(&vs);
13060 pipe.AddShader(&fs);
13061 pipe.AddColorAttachment();
13062 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13063
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013065
Tony Barbour552f6c02016-12-21 14:34:07 -070013066 m_commandBuffer->BeginCommandBuffer();
13067 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013068 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13069 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13070 VkRect2D scissor = {{0, 0}, {16, 16}};
13071 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13072 // Bind pipeline to cmd buffer
13073 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13074 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13075 &descriptor_set, 0, nullptr);
13076 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013077 m_commandBuffer->EndRenderPass();
13078 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013079
13080 VkSubmitInfo submit_info = {};
13081 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13082 submit_info.commandBufferCount = 1;
13083 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13084 // Submit cmd buffer and then destroy bufferView while in-flight
13085 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13086
13087 vkDestroyBufferView(m_device->device(), view, nullptr);
13088 m_errorMonitor->VerifyFound();
13089 vkQueueWaitIdle(m_device->m_queue);
13090 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013091 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
Mark Lobodzinski74597792017-04-11 15:43:49 -060013092 m_errorMonitor->SetUnexpectedError("Unable to remove BufferView obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060013093 vkDestroyBufferView(m_device->device(), view, NULL);
13094 vkDestroyBuffer(m_device->device(), buffer, NULL);
13095 vkFreeMemory(m_device->device(), buffer_memory, NULL);
13096 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13097 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13098 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13099}
13100
Tobin Ehlis209532e2016-09-07 13:52:18 -060013101TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
13102 TEST_DESCRIPTION("Delete in-use sampler.");
13103
Tony Barbour1fa09702017-03-16 12:09:08 -060013104 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060013105 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13106
13107 VkDescriptorPoolSize ds_type_count;
13108 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13109 ds_type_count.descriptorCount = 1;
13110
13111 VkDescriptorPoolCreateInfo ds_pool_ci = {};
13112 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13113 ds_pool_ci.maxSets = 1;
13114 ds_pool_ci.poolSizeCount = 1;
13115 ds_pool_ci.pPoolSizes = &ds_type_count;
13116
13117 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013118 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013119 ASSERT_VK_SUCCESS(err);
13120
13121 VkSamplerCreateInfo sampler_ci = {};
13122 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
13123 sampler_ci.pNext = NULL;
13124 sampler_ci.magFilter = VK_FILTER_NEAREST;
13125 sampler_ci.minFilter = VK_FILTER_NEAREST;
13126 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
13127 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13128 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13129 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
13130 sampler_ci.mipLodBias = 1.0;
13131 sampler_ci.anisotropyEnable = VK_FALSE;
13132 sampler_ci.maxAnisotropy = 1;
13133 sampler_ci.compareEnable = VK_FALSE;
13134 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
13135 sampler_ci.minLod = 1.0;
13136 sampler_ci.maxLod = 1.0;
13137 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
13138 sampler_ci.unnormalizedCoordinates = VK_FALSE;
13139 VkSampler sampler;
13140
13141 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
13142 ASSERT_VK_SUCCESS(err);
13143
13144 VkDescriptorSetLayoutBinding layout_binding;
13145 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060013146 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060013147 layout_binding.descriptorCount = 1;
13148 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13149 layout_binding.pImmutableSamplers = NULL;
13150
13151 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
13152 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13153 ds_layout_ci.bindingCount = 1;
13154 ds_layout_ci.pBindings = &layout_binding;
13155 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013156 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013157 ASSERT_VK_SUCCESS(err);
13158
13159 VkDescriptorSetAllocateInfo alloc_info = {};
13160 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13161 alloc_info.descriptorSetCount = 1;
13162 alloc_info.descriptorPool = ds_pool;
13163 alloc_info.pSetLayouts = &ds_layout;
13164 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013165 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013166 ASSERT_VK_SUCCESS(err);
13167
13168 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13169 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13170 pipeline_layout_ci.pNext = NULL;
13171 pipeline_layout_ci.setLayoutCount = 1;
13172 pipeline_layout_ci.pSetLayouts = &ds_layout;
13173
13174 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013175 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013176 ASSERT_VK_SUCCESS(err);
13177
13178 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013179 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 -060013180 ASSERT_TRUE(image.initialized());
13181
13182 VkImageView view;
13183 VkImageViewCreateInfo ivci = {};
13184 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
13185 ivci.image = image.handle();
13186 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
13187 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
13188 ivci.subresourceRange.layerCount = 1;
13189 ivci.subresourceRange.baseMipLevel = 0;
13190 ivci.subresourceRange.levelCount = 1;
13191 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
13192
13193 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
13194 ASSERT_VK_SUCCESS(err);
13195
13196 VkDescriptorImageInfo image_info{};
13197 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
13198 image_info.imageView = view;
13199 image_info.sampler = sampler;
13200
13201 VkWriteDescriptorSet descriptor_write = {};
13202 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
13203 descriptor_write.dstSet = descriptor_set;
13204 descriptor_write.dstBinding = 0;
13205 descriptor_write.descriptorCount = 1;
13206 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
13207 descriptor_write.pImageInfo = &image_info;
13208
13209 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13210
13211 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013212 char const *vsSource =
13213 "#version 450\n"
13214 "\n"
13215 "out gl_PerVertex { \n"
13216 " vec4 gl_Position;\n"
13217 "};\n"
13218 "void main(){\n"
13219 " gl_Position = vec4(1);\n"
13220 "}\n";
13221 char const *fsSource =
13222 "#version 450\n"
13223 "\n"
13224 "layout(set=0, binding=0) uniform sampler2D s;\n"
13225 "layout(location=0) out vec4 x;\n"
13226 "void main(){\n"
13227 " x = texture(s, vec2(1));\n"
13228 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013229 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13230 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13231 VkPipelineObj pipe(m_device);
13232 pipe.AddShader(&vs);
13233 pipe.AddShader(&fs);
13234 pipe.AddColorAttachment();
13235 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13236
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013238
Tony Barbour552f6c02016-12-21 14:34:07 -070013239 m_commandBuffer->BeginCommandBuffer();
13240 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013241 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013242 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13243 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13244 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013245
13246 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13247 VkRect2D scissor = {{0, 0}, {16, 16}};
13248 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13249 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13250
Tobin Ehlis209532e2016-09-07 13:52:18 -060013251 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013252 m_commandBuffer->EndRenderPass();
13253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013254 // Submit cmd buffer then destroy sampler
13255 VkSubmitInfo submit_info = {};
13256 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13257 submit_info.commandBufferCount = 1;
13258 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13259 // Submit cmd buffer and then destroy sampler while in-flight
13260 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13261
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013262 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013263 m_errorMonitor->VerifyFound();
13264 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013265
Tobin Ehlis209532e2016-09-07 13:52:18 -060013266 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013267 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13268 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013269 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013270 vkDestroyImageView(m_device->device(), view, NULL);
13271 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13272 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13273 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13274}
13275
Mark Mueller1cd9f412016-08-25 13:23:52 -060013276TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013277 TEST_DESCRIPTION(
13278 "Call VkQueueSubmit with a semaphore that is already "
13279 "signaled but not waited on by the queue. Wait on a "
13280 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013281
Tony Barbour1fa09702017-03-16 12:09:08 -060013282 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13284
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013285 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 -070013286 const char *invalid_fence_wait_message =
13287 " which has not been submitted on a Queue or during "
13288 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013289
Tony Barbour552f6c02016-12-21 14:34:07 -070013290 m_commandBuffer->BeginCommandBuffer();
13291 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013292
13293 VkSemaphoreCreateInfo semaphore_create_info = {};
13294 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13295 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013296 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013297 VkSubmitInfo submit_info = {};
13298 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13299 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013300 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013301 submit_info.signalSemaphoreCount = 1;
13302 submit_info.pSignalSemaphores = &semaphore;
13303 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013304 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013305 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013306 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013307 m_commandBuffer->BeginCommandBuffer();
13308 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013310 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13311 m_errorMonitor->VerifyFound();
13312
Mark Mueller1cd9f412016-08-25 13:23:52 -060013313 VkFenceCreateInfo fence_create_info = {};
13314 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13315 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013316 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013317
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013319 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13320 m_errorMonitor->VerifyFound();
13321
Mark Mueller4042b652016-09-05 22:52:21 -060013322 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013323 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013324 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13325}
13326
Tobin Ehlis4af23302016-07-19 10:50:30 -060013327TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013328 TEST_DESCRIPTION(
13329 "Bind a secondary command buffer with with a framebuffer "
13330 "that does not match the framebuffer for the active "
13331 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013332 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013333 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13334
13335 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013336 VkAttachmentDescription attachment = {0,
13337 VK_FORMAT_B8G8R8A8_UNORM,
13338 VK_SAMPLE_COUNT_1_BIT,
13339 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13340 VK_ATTACHMENT_STORE_OP_STORE,
13341 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13342 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13343 VK_IMAGE_LAYOUT_UNDEFINED,
13344 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013346 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013348 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013349
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013350 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013351
13352 VkRenderPass rp;
13353 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13354 ASSERT_VK_SUCCESS(err);
13355
13356 // A compatible framebuffer.
13357 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060013358 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 -060013359 ASSERT_TRUE(image.initialized());
13360
13361 VkImageViewCreateInfo ivci = {
13362 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13363 nullptr,
13364 0,
13365 image.handle(),
13366 VK_IMAGE_VIEW_TYPE_2D,
13367 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013368 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13369 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013370 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13371 };
13372 VkImageView view;
13373 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13374 ASSERT_VK_SUCCESS(err);
13375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013376 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013377 VkFramebuffer fb;
13378 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13379 ASSERT_VK_SUCCESS(err);
13380
13381 VkCommandBufferAllocateInfo cbai = {};
13382 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013383 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013384 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13385 cbai.commandBufferCount = 1;
13386
13387 VkCommandBuffer sec_cb;
13388 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13389 ASSERT_VK_SUCCESS(err);
13390 VkCommandBufferBeginInfo cbbi = {};
13391 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013392 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013393 cbii.renderPass = renderPass();
13394 cbii.framebuffer = fb;
13395 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13396 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013397 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 -060013398 cbbi.pInheritanceInfo = &cbii;
13399 vkBeginCommandBuffer(sec_cb, &cbbi);
13400 vkEndCommandBuffer(sec_cb);
13401
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013402 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013403 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13404 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013405
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013407 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013408 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13409 m_errorMonitor->VerifyFound();
13410 // Cleanup
13411 vkDestroyImageView(m_device->device(), view, NULL);
13412 vkDestroyRenderPass(m_device->device(), rp, NULL);
13413 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13414}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013415
13416TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013417 TEST_DESCRIPTION(
13418 "If logicOp is available on the device, set it to an "
13419 "invalid value. If logicOp is not available, attempt to "
13420 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013421 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13423
13424 auto features = m_device->phy().features();
13425 // Set the expected error depending on whether or not logicOp available
13426 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13428 "If logic operations feature not "
13429 "enabled, logicOpEnable must be "
13430 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013431 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013433 }
13434 // Create a pipeline using logicOp
13435 VkResult err;
13436
13437 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13438 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13439
13440 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013441 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013442 ASSERT_VK_SUCCESS(err);
13443
13444 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13445 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13446 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013447 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013448 vp_state_ci.pViewports = &vp;
13449 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013450 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013451 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013452
13453 VkPipelineShaderStageCreateInfo shaderStages[2];
13454 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13455
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013456 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13457 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013458 shaderStages[0] = vs.GetStageCreateInfo();
13459 shaderStages[1] = fs.GetStageCreateInfo();
13460
13461 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13462 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13463
13464 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13465 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13466 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13467
13468 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13469 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013470 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013471
13472 VkPipelineColorBlendAttachmentState att = {};
13473 att.blendEnable = VK_FALSE;
13474 att.colorWriteMask = 0xf;
13475
13476 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13477 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13478 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13479 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013480 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013481 cb_ci.attachmentCount = 1;
13482 cb_ci.pAttachments = &att;
13483
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013484 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13485 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13486 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13487
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013488 VkGraphicsPipelineCreateInfo gp_ci = {};
13489 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13490 gp_ci.stageCount = 2;
13491 gp_ci.pStages = shaderStages;
13492 gp_ci.pVertexInputState = &vi_ci;
13493 gp_ci.pInputAssemblyState = &ia_ci;
13494 gp_ci.pViewportState = &vp_state_ci;
13495 gp_ci.pRasterizationState = &rs_ci;
13496 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013497 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013498 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13499 gp_ci.layout = pipeline_layout;
13500 gp_ci.renderPass = renderPass();
13501
13502 VkPipelineCacheCreateInfo pc_ci = {};
13503 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13504
13505 VkPipeline pipeline;
13506 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013507 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013508 ASSERT_VK_SUCCESS(err);
13509
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013510 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013511 m_errorMonitor->VerifyFound();
13512 if (VK_SUCCESS == err) {
13513 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13514 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013515 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13516 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13517}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013518
Mike Stroyanaccf7692015-05-12 16:00:45 -060013519#if GTEST_IS_THREADSAFE
13520struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013521 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013522 VkEvent event;
13523 bool bailout;
13524};
13525
Karl Schultz6addd812016-02-02 17:17:23 -070013526extern "C" void *AddToCommandBuffer(void *arg) {
13527 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013528
Mike Stroyana6d14942016-07-13 15:10:05 -060013529 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013530 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013531 if (data->bailout) {
13532 break;
13533 }
13534 }
13535 return NULL;
13536}
13537
Karl Schultz6addd812016-02-02 17:17:23 -070013538TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013539 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013540
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013542
Tony Barbour1fa09702017-03-16 12:09:08 -060013543 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013544 ASSERT_NO_FATAL_FAILURE(InitViewport());
13545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13546
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013547 // Calls AllocateCommandBuffers
13548 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013549
13550 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013551 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013552
13553 VkEventCreateInfo event_info;
13554 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013555 VkResult err;
13556
13557 memset(&event_info, 0, sizeof(event_info));
13558 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13559
Chia-I Wuf7458c52015-10-26 21:10:41 +080013560 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013561 ASSERT_VK_SUCCESS(err);
13562
Mike Stroyanaccf7692015-05-12 16:00:45 -060013563 err = vkResetEvent(device(), event);
13564 ASSERT_VK_SUCCESS(err);
13565
13566 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013567 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013568 data.event = event;
13569 data.bailout = false;
13570 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013571
13572 // First do some correct operations using multiple threads.
13573 // Add many entries to command buffer from another thread.
13574 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13575 // Make non-conflicting calls from this thread at the same time.
13576 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013577 uint32_t count;
13578 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013579 }
13580 test_platform_thread_join(thread, NULL);
13581
13582 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013583 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013584 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013585 // Add many entries to command buffer from this thread at the same time.
13586 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013587
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013588 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013589 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013590
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013591 m_errorMonitor->SetBailout(NULL);
13592
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013593 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013594
Chia-I Wuf7458c52015-10-26 21:10:41 +080013595 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013596}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013597#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013598
Karl Schultz6addd812016-02-02 17:17:23 -070013599TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013600 TEST_DESCRIPTION(
13601 "Test that an error is produced for a spirv module "
13602 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013603
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013605
Tony Barbour1fa09702017-03-16 12:09:08 -060013606 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013607 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13608
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013609 VkShaderModule module;
13610 VkShaderModuleCreateInfo moduleCreateInfo;
13611 struct icd_spv_header spv;
13612
13613 spv.magic = ICD_SPV_MAGIC;
13614 spv.version = ICD_SPV_VERSION;
13615 spv.gen_magic = 0;
13616
13617 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13618 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013619 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013620 moduleCreateInfo.codeSize = 4;
13621 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013622 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013623
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013624 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013625}
13626
Karl Schultz6addd812016-02-02 17:17:23 -070013627TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013628 TEST_DESCRIPTION(
13629 "Test that an error is produced for a spirv module "
13630 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013631
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013633
Tony Barbour1fa09702017-03-16 12:09:08 -060013634 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13636
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013637 VkShaderModule module;
13638 VkShaderModuleCreateInfo moduleCreateInfo;
13639 struct icd_spv_header spv;
13640
13641 spv.magic = ~ICD_SPV_MAGIC;
13642 spv.version = ICD_SPV_VERSION;
13643 spv.gen_magic = 0;
13644
13645 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13646 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013647 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013648 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13649 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013650 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013651
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013652 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013653}
13654
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013655#if 0
13656// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013657TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013659 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013660
Tony Barbour1fa09702017-03-16 12:09:08 -060013661 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013662 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13663
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013664 VkShaderModule module;
13665 VkShaderModuleCreateInfo moduleCreateInfo;
13666 struct icd_spv_header spv;
13667
13668 spv.magic = ICD_SPV_MAGIC;
13669 spv.version = ~ICD_SPV_VERSION;
13670 spv.gen_magic = 0;
13671
13672 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13673 moduleCreateInfo.pNext = NULL;
13674
Karl Schultz6addd812016-02-02 17:17:23 -070013675 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013676 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13677 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013678 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013679
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013680 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013681}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013682#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013683
Karl Schultz6addd812016-02-02 17:17:23 -070013684TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013685 TEST_DESCRIPTION(
13686 "Test that a warning is produced for a vertex output that "
13687 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013689
Tony Barbour1fa09702017-03-16 12:09:08 -060013690 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013691 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013692
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013693 char const *vsSource =
13694 "#version 450\n"
13695 "\n"
13696 "layout(location=0) out float x;\n"
13697 "out gl_PerVertex {\n"
13698 " vec4 gl_Position;\n"
13699 "};\n"
13700 "void main(){\n"
13701 " gl_Position = vec4(1);\n"
13702 " x = 0;\n"
13703 "}\n";
13704 char const *fsSource =
13705 "#version 450\n"
13706 "\n"
13707 "layout(location=0) out vec4 color;\n"
13708 "void main(){\n"
13709 " color = vec4(1);\n"
13710 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013711
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013712 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13713 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013714
13715 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013716 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013717 pipe.AddShader(&vs);
13718 pipe.AddShader(&fs);
13719
Chris Forbes9f7ff632015-05-25 11:13:08 +120013720 VkDescriptorSetObj descriptorSet(m_device);
13721 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013722 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013723
Tony Barbour5781e8f2015-08-04 16:23:11 -060013724 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013725
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013726 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013727}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013728
Mark Mueller098c9cb2016-09-08 09:01:57 -060013729TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13730 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13731
Tony Barbour1fa09702017-03-16 12:09:08 -060013732 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013733 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13734
13735 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013736 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013737
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013738 char const *vsSource =
13739 "#version 450\n"
13740 "\n"
13741 "out gl_PerVertex {\n"
13742 " vec4 gl_Position;\n"
13743 "};\n"
13744 "void main(){\n"
13745 " gl_Position = vec4(1);\n"
13746 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013747
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013748 char const *fsSource =
13749 "#version 450\n"
13750 "\n"
13751 "layout (constant_id = 0) const float r = 0.0f;\n"
13752 "layout(location = 0) out vec4 uFragColor;\n"
13753 "void main(){\n"
13754 " uFragColor = vec4(r,1,0,1);\n"
13755 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013756
13757 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13758 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13759
13760 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13761 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13762
13763 VkPipelineLayout pipeline_layout;
13764 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13765
13766 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13767 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13768 vp_state_create_info.viewportCount = 1;
13769 VkViewport viewport = {};
13770 vp_state_create_info.pViewports = &viewport;
13771 vp_state_create_info.scissorCount = 1;
13772 VkRect2D scissors = {};
13773 vp_state_create_info.pScissors = &scissors;
13774
13775 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13776
13777 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13778 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13779 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13780 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13781
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013782 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013783
13784 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13785 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13786
13787 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13788 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13789 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13790
13791 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13792 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13793 rasterization_state_create_info.pNext = nullptr;
13794 rasterization_state_create_info.lineWidth = 1.0f;
13795 rasterization_state_create_info.rasterizerDiscardEnable = true;
13796
13797 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13798 color_blend_attachment_state.blendEnable = VK_FALSE;
13799 color_blend_attachment_state.colorWriteMask = 0xf;
13800
13801 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13802 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13803 color_blend_state_create_info.attachmentCount = 1;
13804 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13805
13806 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13807 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13808 graphicspipe_create_info.stageCount = 2;
13809 graphicspipe_create_info.pStages = shader_stage_create_info;
13810 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13811 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13812 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13813 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13814 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13815 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13816 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13817 graphicspipe_create_info.layout = pipeline_layout;
13818 graphicspipe_create_info.renderPass = renderPass();
13819
13820 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13821 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13822
13823 VkPipelineCache pipelineCache;
13824 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13825
13826 // This structure maps constant ids to data locations.
13827 const VkSpecializationMapEntry entry =
13828 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013829 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013830
13831 uint32_t data = 1;
13832
13833 // Set up the info describing spec map and data
13834 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013835 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013836 };
13837 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13838
13839 VkPipeline pipeline;
13840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13841 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13842 m_errorMonitor->VerifyFound();
13843
13844 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13845 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13846}
13847
13848TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13849 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13850
Tony Barbour1fa09702017-03-16 12:09:08 -060013851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13853
13854 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13855
13856 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13857 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13858 descriptor_pool_type_count[0].descriptorCount = 1;
13859 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13860 descriptor_pool_type_count[1].descriptorCount = 1;
13861
13862 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13863 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13864 descriptor_pool_create_info.maxSets = 1;
13865 descriptor_pool_create_info.poolSizeCount = 2;
13866 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13867 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13868
13869 VkDescriptorPool descriptorset_pool;
13870 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13871
13872 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13873 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13874 descriptorset_layout_binding.descriptorCount = 1;
13875 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013876 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013877
13878 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13879 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13880 descriptorset_layout_create_info.bindingCount = 1;
13881 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13882
13883 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013884 ASSERT_VK_SUCCESS(
13885 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013886
13887 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13888 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13889 descriptorset_allocate_info.descriptorSetCount = 1;
13890 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13891 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13892 VkDescriptorSet descriptorset;
13893 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13894
13895 // Challenge core_validation with a non uniform buffer type.
13896 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13897
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013898 char const *vsSource =
13899 "#version 450\n"
13900 "\n"
13901 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13902 " mat4 mvp;\n"
13903 "} ubuf;\n"
13904 "out gl_PerVertex {\n"
13905 " vec4 gl_Position;\n"
13906 "};\n"
13907 "void main(){\n"
13908 " gl_Position = ubuf.mvp * vec4(1);\n"
13909 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013910
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013911 char const *fsSource =
13912 "#version 450\n"
13913 "\n"
13914 "layout(location = 0) out vec4 uFragColor;\n"
13915 "void main(){\n"
13916 " uFragColor = vec4(0,1,0,1);\n"
13917 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013918
13919 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13920 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13921
13922 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13923 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13924 pipeline_layout_create_info.setLayoutCount = 1;
13925 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13926
13927 VkPipelineLayout pipeline_layout;
13928 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13929
13930 VkPipelineObj pipe(m_device);
13931 pipe.AddColorAttachment();
13932 pipe.AddShader(&vs);
13933 pipe.AddShader(&fs);
13934
13935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13936 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13937 m_errorMonitor->VerifyFound();
13938
13939 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13940 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13941 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13942}
13943
13944TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13945 TEST_DESCRIPTION(
13946 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13947
Tony Barbour1fa09702017-03-16 12:09:08 -060013948 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013949 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13950
13951 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13952
13953 VkDescriptorPoolSize descriptor_pool_type_count = {};
13954 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13955 descriptor_pool_type_count.descriptorCount = 1;
13956
13957 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13958 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13959 descriptor_pool_create_info.maxSets = 1;
13960 descriptor_pool_create_info.poolSizeCount = 1;
13961 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13962 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13963
13964 VkDescriptorPool descriptorset_pool;
13965 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13966
13967 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13968 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13969 descriptorset_layout_binding.descriptorCount = 1;
13970 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13971 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013972 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013973
13974 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13975 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13976 descriptorset_layout_create_info.bindingCount = 1;
13977 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13978
13979 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013980 ASSERT_VK_SUCCESS(
13981 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013982
13983 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13984 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13985 descriptorset_allocate_info.descriptorSetCount = 1;
13986 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13987 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13988 VkDescriptorSet descriptorset;
13989 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13990
13991 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013993 char const *vsSource =
13994 "#version 450\n"
13995 "\n"
13996 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13997 " mat4 mvp;\n"
13998 "} ubuf;\n"
13999 "out gl_PerVertex {\n"
14000 " vec4 gl_Position;\n"
14001 "};\n"
14002 "void main(){\n"
14003 " gl_Position = ubuf.mvp * vec4(1);\n"
14004 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014005
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014006 char const *fsSource =
14007 "#version 450\n"
14008 "\n"
14009 "layout(location = 0) out vec4 uFragColor;\n"
14010 "void main(){\n"
14011 " uFragColor = vec4(0,1,0,1);\n"
14012 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014013
14014 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14015 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14016
14017 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14018 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14019 pipeline_layout_create_info.setLayoutCount = 1;
14020 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
14021
14022 VkPipelineLayout pipeline_layout;
14023 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14024
14025 VkPipelineObj pipe(m_device);
14026 pipe.AddColorAttachment();
14027 pipe.AddShader(&vs);
14028 pipe.AddShader(&fs);
14029
14030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
14031 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14032 m_errorMonitor->VerifyFound();
14033
14034 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14035 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
14036 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
14037}
14038
14039TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014040 TEST_DESCRIPTION(
14041 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
14042 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014043
Tony Barbour1fa09702017-03-16 12:09:08 -060014044 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14046
14047 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014048 "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 -060014049
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014050 char const *vsSource =
14051 "#version 450\n"
14052 "\n"
14053 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14054 "out gl_PerVertex {\n"
14055 " vec4 gl_Position;\n"
14056 "};\n"
14057 "void main(){\n"
14058 " gl_Position = vec4(consts.x);\n"
14059 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014060
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014061 char const *fsSource =
14062 "#version 450\n"
14063 "\n"
14064 "layout(location = 0) out vec4 uFragColor;\n"
14065 "void main(){\n"
14066 " uFragColor = vec4(0,1,0,1);\n"
14067 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014068
14069 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14071
14072 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14073 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14074
14075 // Set up a push constant range
14076 VkPushConstantRange push_constant_ranges = {};
14077 // Set to the wrong stage to challenge core_validation
14078 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
14079 push_constant_ranges.size = 4;
14080
14081 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
14082 pipeline_layout_create_info.pushConstantRangeCount = 1;
14083
14084 VkPipelineLayout pipeline_layout;
14085 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14086
14087 VkPipelineObj pipe(m_device);
14088 pipe.AddColorAttachment();
14089 pipe.AddShader(&vs);
14090 pipe.AddShader(&fs);
14091
14092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
14093 pipe.CreateVKPipeline(pipeline_layout, renderPass());
14094 m_errorMonitor->VerifyFound();
14095
14096 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
14097}
14098
14099TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
14100 TEST_DESCRIPTION(
14101 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
14102
Tony Barbour1fa09702017-03-16 12:09:08 -060014103 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014104 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14105
14106 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014107 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014108
14109 // Some awkward steps are required to test with custom device features.
14110 std::vector<const char *> device_extension_names;
14111 auto features = m_device->phy().features();
14112 // Disable support for 64 bit floats
14113 features.shaderFloat64 = false;
14114 // The sacrificial device object
14115 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
14116
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014117 char const *vsSource =
14118 "#version 450\n"
14119 "\n"
14120 "out gl_PerVertex {\n"
14121 " vec4 gl_Position;\n"
14122 "};\n"
14123 "void main(){\n"
14124 " gl_Position = vec4(1);\n"
14125 "}\n";
14126 char const *fsSource =
14127 "#version 450\n"
14128 "\n"
14129 "layout(location=0) out vec4 color;\n"
14130 "void main(){\n"
14131 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
14132 " color = vec4(green);\n"
14133 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014134
14135 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14136 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14137
14138 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014139
14140 VkPipelineObj pipe(&test_device);
14141 pipe.AddColorAttachment();
14142 pipe.AddShader(&vs);
14143 pipe.AddShader(&fs);
14144
14145 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
14146 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
14147 VkPipelineLayout pipeline_layout;
14148 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
14149
14150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
14151 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
14152 m_errorMonitor->VerifyFound();
14153
14154 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
14155}
14156
Mark Lobodzinski20832822017-03-24 14:49:45 -060014157TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
14158 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
14159 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060014160
Tony Barbour1fa09702017-03-16 12:09:08 -060014161 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060014162 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14163
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014164 char const *vsSource =
14165 "#version 450\n"
14166 "\n"
14167 "out gl_PerVertex {\n"
14168 " vec4 gl_Position;\n"
14169 "};\n"
14170 "layout(xfb_buffer = 1) out;"
14171 "void main(){\n"
14172 " gl_Position = vec4(1);\n"
14173 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060014174
Mark Lobodzinski20832822017-03-24 14:49:45 -060014175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060014176
Mark Lobodzinski20832822017-03-24 14:49:45 -060014177 std::vector<unsigned int> spv;
14178 VkShaderModuleCreateInfo module_create_info;
14179 VkShaderModule shader_module;
14180 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
14181 module_create_info.pNext = NULL;
14182 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
14183 module_create_info.pCode = spv.data();
14184 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
14185 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060014186
Mark Lobodzinski20832822017-03-24 14:49:45 -060014187 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060014188
Mark Lobodzinski20832822017-03-24 14:49:45 -060014189 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060014190}
14191
Karl Schultz6addd812016-02-02 17:17:23 -070014192TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014193 TEST_DESCRIPTION(
14194 "Test that an error is produced for a fragment shader input "
14195 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014196
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014198
Tony Barbour1fa09702017-03-16 12:09:08 -060014199 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014201
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014202 char const *vsSource =
14203 "#version 450\n"
14204 "\n"
14205 "out gl_PerVertex {\n"
14206 " vec4 gl_Position;\n"
14207 "};\n"
14208 "void main(){\n"
14209 " gl_Position = vec4(1);\n"
14210 "}\n";
14211 char const *fsSource =
14212 "#version 450\n"
14213 "\n"
14214 "layout(location=0) in float x;\n"
14215 "layout(location=0) out vec4 color;\n"
14216 "void main(){\n"
14217 " color = vec4(x);\n"
14218 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014219
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014220 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14221 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014222
14223 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014224 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014225 pipe.AddShader(&vs);
14226 pipe.AddShader(&fs);
14227
Chris Forbes59cb88d2015-05-25 11:13:13 +120014228 VkDescriptorSetObj descriptorSet(m_device);
14229 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014230 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014231
Tony Barbour5781e8f2015-08-04 16:23:11 -060014232 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014233
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014234 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014235}
14236
Karl Schultz6addd812016-02-02 17:17:23 -070014237TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014238 TEST_DESCRIPTION(
14239 "Test that an error is produced for a fragment shader input "
14240 "within an interace block, which is not present in the outputs "
14241 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014243
Tony Barbour1fa09702017-03-16 12:09:08 -060014244 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014245 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14246
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014247 char const *vsSource =
14248 "#version 450\n"
14249 "\n"
14250 "out gl_PerVertex {\n"
14251 " vec4 gl_Position;\n"
14252 "};\n"
14253 "void main(){\n"
14254 " gl_Position = vec4(1);\n"
14255 "}\n";
14256 char const *fsSource =
14257 "#version 450\n"
14258 "\n"
14259 "in block { layout(location=0) float x; } ins;\n"
14260 "layout(location=0) out vec4 color;\n"
14261 "void main(){\n"
14262 " color = vec4(ins.x);\n"
14263 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014264
14265 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14266 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14267
14268 VkPipelineObj pipe(m_device);
14269 pipe.AddColorAttachment();
14270 pipe.AddShader(&vs);
14271 pipe.AddShader(&fs);
14272
14273 VkDescriptorSetObj descriptorSet(m_device);
14274 descriptorSet.AppendDummy();
14275 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14276
14277 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14278
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014279 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014280}
14281
Karl Schultz6addd812016-02-02 17:17:23 -070014282TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014283 TEST_DESCRIPTION(
14284 "Test that an error is produced for mismatched array sizes "
14285 "across the vertex->fragment shader interface");
14286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14287 "Type mismatch on location 0.0: 'ptr to "
14288 "output arr[2] of float32' vs 'ptr to "
14289 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014290
Tony Barbour1fa09702017-03-16 12:09:08 -060014291 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014292 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14293
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014294 char const *vsSource =
14295 "#version 450\n"
14296 "\n"
14297 "layout(location=0) out float x[2];\n"
14298 "out gl_PerVertex {\n"
14299 " vec4 gl_Position;\n"
14300 "};\n"
14301 "void main(){\n"
14302 " x[0] = 0; x[1] = 0;\n"
14303 " gl_Position = vec4(1);\n"
14304 "}\n";
14305 char const *fsSource =
14306 "#version 450\n"
14307 "\n"
14308 "layout(location=0) in float x[1];\n"
14309 "layout(location=0) out vec4 color;\n"
14310 "void main(){\n"
14311 " color = vec4(x[0]);\n"
14312 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014313
14314 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14315 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14316
14317 VkPipelineObj pipe(m_device);
14318 pipe.AddColorAttachment();
14319 pipe.AddShader(&vs);
14320 pipe.AddShader(&fs);
14321
14322 VkDescriptorSetObj descriptorSet(m_device);
14323 descriptorSet.AppendDummy();
14324 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14325
14326 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14327
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014328 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014329}
14330
Karl Schultz6addd812016-02-02 17:17:23 -070014331TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014332 TEST_DESCRIPTION(
14333 "Test that an error is produced for mismatched types across "
14334 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014336
Tony Barbour1fa09702017-03-16 12:09:08 -060014337 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014338 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014340 char const *vsSource =
14341 "#version 450\n"
14342 "\n"
14343 "layout(location=0) out int x;\n"
14344 "out gl_PerVertex {\n"
14345 " vec4 gl_Position;\n"
14346 "};\n"
14347 "void main(){\n"
14348 " x = 0;\n"
14349 " gl_Position = vec4(1);\n"
14350 "}\n";
14351 char const *fsSource =
14352 "#version 450\n"
14353 "\n"
14354 "layout(location=0) in float x;\n" /* VS writes int */
14355 "layout(location=0) out vec4 color;\n"
14356 "void main(){\n"
14357 " color = vec4(x);\n"
14358 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014359
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014360 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14361 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014362
14363 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014364 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014365 pipe.AddShader(&vs);
14366 pipe.AddShader(&fs);
14367
Chris Forbesb56af562015-05-25 11:13:17 +120014368 VkDescriptorSetObj descriptorSet(m_device);
14369 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014370 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014371
Tony Barbour5781e8f2015-08-04 16:23:11 -060014372 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014373
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014374 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014375}
14376
Karl Schultz6addd812016-02-02 17:17:23 -070014377TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014378 TEST_DESCRIPTION(
14379 "Test that an error is produced for mismatched types across "
14380 "the vertex->fragment shader interface, when the variable is contained within "
14381 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014383
Tony Barbour1fa09702017-03-16 12:09:08 -060014384 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014385 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14386
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014387 char const *vsSource =
14388 "#version 450\n"
14389 "\n"
14390 "out block { layout(location=0) int x; } outs;\n"
14391 "out gl_PerVertex {\n"
14392 " vec4 gl_Position;\n"
14393 "};\n"
14394 "void main(){\n"
14395 " outs.x = 0;\n"
14396 " gl_Position = vec4(1);\n"
14397 "}\n";
14398 char const *fsSource =
14399 "#version 450\n"
14400 "\n"
14401 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14402 "layout(location=0) out vec4 color;\n"
14403 "void main(){\n"
14404 " color = vec4(ins.x);\n"
14405 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014406
14407 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14408 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14409
14410 VkPipelineObj pipe(m_device);
14411 pipe.AddColorAttachment();
14412 pipe.AddShader(&vs);
14413 pipe.AddShader(&fs);
14414
14415 VkDescriptorSetObj descriptorSet(m_device);
14416 descriptorSet.AppendDummy();
14417 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14418
14419 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14420
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014421 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014422}
14423
14424TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014425 TEST_DESCRIPTION(
14426 "Test that an error is produced for location mismatches across "
14427 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14428 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014429 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 +130014430
Tony Barbour1fa09702017-03-16 12:09:08 -060014431 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014432 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14433
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014434 char const *vsSource =
14435 "#version 450\n"
14436 "\n"
14437 "out block { layout(location=1) float x; } outs;\n"
14438 "out gl_PerVertex {\n"
14439 " vec4 gl_Position;\n"
14440 "};\n"
14441 "void main(){\n"
14442 " outs.x = 0;\n"
14443 " gl_Position = vec4(1);\n"
14444 "}\n";
14445 char const *fsSource =
14446 "#version 450\n"
14447 "\n"
14448 "in block { layout(location=0) float x; } ins;\n"
14449 "layout(location=0) out vec4 color;\n"
14450 "void main(){\n"
14451 " color = vec4(ins.x);\n"
14452 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014453
14454 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14455 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14456
14457 VkPipelineObj pipe(m_device);
14458 pipe.AddColorAttachment();
14459 pipe.AddShader(&vs);
14460 pipe.AddShader(&fs);
14461
14462 VkDescriptorSetObj descriptorSet(m_device);
14463 descriptorSet.AppendDummy();
14464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14465
14466 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14467
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014468 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014469}
14470
14471TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014472 TEST_DESCRIPTION(
14473 "Test that an error is produced for component mismatches across the "
14474 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14475 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014476 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 +130014477
Tony Barbour1fa09702017-03-16 12:09:08 -060014478 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014479 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14480
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014481 char const *vsSource =
14482 "#version 450\n"
14483 "\n"
14484 "out block { layout(location=0, component=0) float x; } outs;\n"
14485 "out gl_PerVertex {\n"
14486 " vec4 gl_Position;\n"
14487 "};\n"
14488 "void main(){\n"
14489 " outs.x = 0;\n"
14490 " gl_Position = vec4(1);\n"
14491 "}\n";
14492 char const *fsSource =
14493 "#version 450\n"
14494 "\n"
14495 "in block { layout(location=0, component=1) float x; } ins;\n"
14496 "layout(location=0) out vec4 color;\n"
14497 "void main(){\n"
14498 " color = vec4(ins.x);\n"
14499 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014500
14501 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14502 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14503
14504 VkPipelineObj pipe(m_device);
14505 pipe.AddColorAttachment();
14506 pipe.AddShader(&vs);
14507 pipe.AddShader(&fs);
14508
14509 VkDescriptorSetObj descriptorSet(m_device);
14510 descriptorSet.AppendDummy();
14511 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14512
14513 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14514
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014515 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014516}
14517
Chris Forbes1f3b0152016-11-30 12:48:40 +130014518TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14519 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14520
Tony Barbour1fa09702017-03-16 12:09:08 -060014521 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14523
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014524 char const *vsSource =
14525 "#version 450\n"
14526 "layout(location=0) out mediump float x;\n"
14527 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14528 char const *fsSource =
14529 "#version 450\n"
14530 "layout(location=0) in highp float x;\n"
14531 "layout(location=0) out vec4 color;\n"
14532 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014533
14534 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14535 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14536
14537 VkPipelineObj pipe(m_device);
14538 pipe.AddColorAttachment();
14539 pipe.AddShader(&vs);
14540 pipe.AddShader(&fs);
14541
14542 VkDescriptorSetObj descriptorSet(m_device);
14543 descriptorSet.AppendDummy();
14544 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14545
14546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14547
14548 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14549
14550 m_errorMonitor->VerifyFound();
14551}
14552
Chris Forbes870a39e2016-11-30 12:55:56 +130014553TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14554 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14555
Tony Barbour1fa09702017-03-16 12:09:08 -060014556 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14558
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014559 char const *vsSource =
14560 "#version 450\n"
14561 "out block { layout(location=0) mediump float x; };\n"
14562 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14563 char const *fsSource =
14564 "#version 450\n"
14565 "in block { layout(location=0) highp float x; };\n"
14566 "layout(location=0) out vec4 color;\n"
14567 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014568
14569 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14570 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14571
14572 VkPipelineObj pipe(m_device);
14573 pipe.AddColorAttachment();
14574 pipe.AddShader(&vs);
14575 pipe.AddShader(&fs);
14576
14577 VkDescriptorSetObj descriptorSet(m_device);
14578 descriptorSet.AppendDummy();
14579 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14580
14581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14582
14583 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14584
14585 m_errorMonitor->VerifyFound();
14586}
14587
Karl Schultz6addd812016-02-02 17:17:23 -070014588TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014589 TEST_DESCRIPTION(
14590 "Test that a warning is produced for a vertex attribute which is "
14591 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014593
Tony Barbour1fa09702017-03-16 12:09:08 -060014594 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014596
14597 VkVertexInputBindingDescription input_binding;
14598 memset(&input_binding, 0, sizeof(input_binding));
14599
14600 VkVertexInputAttributeDescription input_attrib;
14601 memset(&input_attrib, 0, sizeof(input_attrib));
14602 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14603
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014604 char const *vsSource =
14605 "#version 450\n"
14606 "\n"
14607 "out gl_PerVertex {\n"
14608 " vec4 gl_Position;\n"
14609 "};\n"
14610 "void main(){\n"
14611 " gl_Position = vec4(1);\n"
14612 "}\n";
14613 char const *fsSource =
14614 "#version 450\n"
14615 "\n"
14616 "layout(location=0) out vec4 color;\n"
14617 "void main(){\n"
14618 " color = vec4(1);\n"
14619 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014620
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014621 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14622 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014623
14624 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014625 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014626 pipe.AddShader(&vs);
14627 pipe.AddShader(&fs);
14628
14629 pipe.AddVertexInputBindings(&input_binding, 1);
14630 pipe.AddVertexInputAttribs(&input_attrib, 1);
14631
Chris Forbesde136e02015-05-25 11:13:28 +120014632 VkDescriptorSetObj descriptorSet(m_device);
14633 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014634 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014635
Tony Barbour5781e8f2015-08-04 16:23:11 -060014636 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014637
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014638 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014639}
14640
Karl Schultz6addd812016-02-02 17:17:23 -070014641TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014642 TEST_DESCRIPTION(
14643 "Test that a warning is produced for a location mismatch on "
14644 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014646
Tony Barbour1fa09702017-03-16 12:09:08 -060014647 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14649
14650 VkVertexInputBindingDescription input_binding;
14651 memset(&input_binding, 0, sizeof(input_binding));
14652
14653 VkVertexInputAttributeDescription input_attrib;
14654 memset(&input_attrib, 0, sizeof(input_attrib));
14655 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14656
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014657 char const *vsSource =
14658 "#version 450\n"
14659 "\n"
14660 "layout(location=1) in float x;\n"
14661 "out gl_PerVertex {\n"
14662 " vec4 gl_Position;\n"
14663 "};\n"
14664 "void main(){\n"
14665 " gl_Position = vec4(x);\n"
14666 "}\n";
14667 char const *fsSource =
14668 "#version 450\n"
14669 "\n"
14670 "layout(location=0) out vec4 color;\n"
14671 "void main(){\n"
14672 " color = vec4(1);\n"
14673 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014674
14675 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14676 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14677
14678 VkPipelineObj pipe(m_device);
14679 pipe.AddColorAttachment();
14680 pipe.AddShader(&vs);
14681 pipe.AddShader(&fs);
14682
14683 pipe.AddVertexInputBindings(&input_binding, 1);
14684 pipe.AddVertexInputAttribs(&input_attrib, 1);
14685
14686 VkDescriptorSetObj descriptorSet(m_device);
14687 descriptorSet.AppendDummy();
14688 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14689
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014690 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014691 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14692
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014693 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014694}
14695
Karl Schultz6addd812016-02-02 17:17:23 -070014696TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014697 TEST_DESCRIPTION(
14698 "Test that an error is produced for a vertex shader input which is not "
14699 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014700 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14701 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014702
Tony Barbour1fa09702017-03-16 12:09:08 -060014703 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014704 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014706 char const *vsSource =
14707 "#version 450\n"
14708 "\n"
14709 "layout(location=0) in vec4 x;\n" /* not provided */
14710 "out gl_PerVertex {\n"
14711 " vec4 gl_Position;\n"
14712 "};\n"
14713 "void main(){\n"
14714 " gl_Position = x;\n"
14715 "}\n";
14716 char const *fsSource =
14717 "#version 450\n"
14718 "\n"
14719 "layout(location=0) out vec4 color;\n"
14720 "void main(){\n"
14721 " color = vec4(1);\n"
14722 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014723
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014724 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14725 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014726
14727 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014728 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014729 pipe.AddShader(&vs);
14730 pipe.AddShader(&fs);
14731
Chris Forbes62e8e502015-05-25 11:13:29 +120014732 VkDescriptorSetObj descriptorSet(m_device);
14733 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014734 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014735
Tony Barbour5781e8f2015-08-04 16:23:11 -060014736 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014737
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014738 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014739}
14740
Karl Schultz6addd812016-02-02 17:17:23 -070014741TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014742 TEST_DESCRIPTION(
14743 "Test that an error is produced for a mismatch between the "
14744 "fundamental type (float/int/uint) of an attribute and the "
14745 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014746 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 -060014747
Tony Barbour1fa09702017-03-16 12:09:08 -060014748 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014749 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014750
14751 VkVertexInputBindingDescription input_binding;
14752 memset(&input_binding, 0, sizeof(input_binding));
14753
14754 VkVertexInputAttributeDescription input_attrib;
14755 memset(&input_attrib, 0, sizeof(input_attrib));
14756 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14757
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014758 char const *vsSource =
14759 "#version 450\n"
14760 "\n"
14761 "layout(location=0) in int x;\n" /* attrib provided float */
14762 "out gl_PerVertex {\n"
14763 " vec4 gl_Position;\n"
14764 "};\n"
14765 "void main(){\n"
14766 " gl_Position = vec4(x);\n"
14767 "}\n";
14768 char const *fsSource =
14769 "#version 450\n"
14770 "\n"
14771 "layout(location=0) out vec4 color;\n"
14772 "void main(){\n"
14773 " color = vec4(1);\n"
14774 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014775
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014776 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14777 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014778
14779 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014780 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014781 pipe.AddShader(&vs);
14782 pipe.AddShader(&fs);
14783
14784 pipe.AddVertexInputBindings(&input_binding, 1);
14785 pipe.AddVertexInputAttribs(&input_attrib, 1);
14786
Chris Forbesc97d98e2015-05-25 11:13:31 +120014787 VkDescriptorSetObj descriptorSet(m_device);
14788 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014789 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014790
Tony Barbour5781e8f2015-08-04 16:23:11 -060014791 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014792
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014793 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014794}
14795
Chris Forbesc68b43c2016-04-06 11:18:47 +120014796TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014797 TEST_DESCRIPTION(
14798 "Test that an error is produced for a pipeline containing multiple "
14799 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14801 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014802
Tony Barbour1fa09702017-03-16 12:09:08 -060014803 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014804 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14805
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014806 char const *vsSource =
14807 "#version 450\n"
14808 "\n"
14809 "out gl_PerVertex {\n"
14810 " vec4 gl_Position;\n"
14811 "};\n"
14812 "void main(){\n"
14813 " gl_Position = vec4(1);\n"
14814 "}\n";
14815 char const *fsSource =
14816 "#version 450\n"
14817 "\n"
14818 "layout(location=0) out vec4 color;\n"
14819 "void main(){\n"
14820 " color = vec4(1);\n"
14821 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014822
14823 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14824 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14825
14826 VkPipelineObj pipe(m_device);
14827 pipe.AddColorAttachment();
14828 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014829 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014830 pipe.AddShader(&fs);
14831
14832 VkDescriptorSetObj descriptorSet(m_device);
14833 descriptorSet.AppendDummy();
14834 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14835
14836 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14837
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014838 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014839}
14840
Chris Forbes82ff92a2016-09-09 10:50:24 +120014841TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014843
Tony Barbour1fa09702017-03-16 12:09:08 -060014844 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014845 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14846
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014847 char const *vsSource =
14848 "#version 450\n"
14849 "out gl_PerVertex {\n"
14850 " vec4 gl_Position;\n"
14851 "};\n"
14852 "void main(){\n"
14853 " gl_Position = vec4(0);\n"
14854 "}\n";
14855 char const *fsSource =
14856 "#version 450\n"
14857 "\n"
14858 "layout(location=0) out vec4 color;\n"
14859 "void main(){\n"
14860 " color = vec4(1);\n"
14861 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014862
14863 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14864 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14865
14866 VkPipelineObj pipe(m_device);
14867 pipe.AddColorAttachment();
14868 pipe.AddShader(&vs);
14869 pipe.AddShader(&fs);
14870
14871 VkDescriptorSetObj descriptorSet(m_device);
14872 descriptorSet.AppendDummy();
14873 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14874
14875 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14876
14877 m_errorMonitor->VerifyFound();
14878}
14879
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014880TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14882 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14883 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014884
Tony Barbour1fa09702017-03-16 12:09:08 -060014885 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014886 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14887
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014888 char const *vsSource =
14889 "#version 450\n"
14890 "void main(){ gl_Position = vec4(0); }\n";
14891 char const *fsSource =
14892 "#version 450\n"
14893 "\n"
14894 "layout(location=0) out vec4 color;\n"
14895 "void main(){\n"
14896 " color = vec4(1);\n"
14897 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014898
14899 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14900 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14901
14902 VkPipelineObj pipe(m_device);
14903 pipe.AddColorAttachment();
14904 pipe.AddShader(&vs);
14905 pipe.AddShader(&fs);
14906
14907 VkDescriptorSetObj descriptorSet(m_device);
14908 descriptorSet.AppendDummy();
14909 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14910
14911 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014912 {
14913 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14914 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14915 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014916 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014917 {
14918 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14919 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14920 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014921 },
14922 };
14923 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014924 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014925 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014926 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14927 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014928 VkRenderPass rp;
14929 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14930 ASSERT_VK_SUCCESS(err);
14931
14932 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14933
14934 m_errorMonitor->VerifyFound();
14935
14936 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14937}
14938
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014939TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014940 TEST_DESCRIPTION(
14941 "Test that an error is produced for a variable output from "
14942 "the TCS without the patch decoration, but consumed in the TES "
14943 "with the decoration.");
14944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14945 "is per-vertex in tessellation control shader stage "
14946 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014947
Tony Barbour1fa09702017-03-16 12:09:08 -060014948 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014949 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14950
Chris Forbesc1e852d2016-04-04 19:26:42 +120014951 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014952 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014953 return;
14954 }
14955
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014956 char const *vsSource =
14957 "#version 450\n"
14958 "void main(){}\n";
14959 char const *tcsSource =
14960 "#version 450\n"
14961 "layout(location=0) out int x[];\n"
14962 "layout(vertices=3) out;\n"
14963 "void main(){\n"
14964 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14965 " gl_TessLevelInner[0] = 1;\n"
14966 " x[gl_InvocationID] = gl_InvocationID;\n"
14967 "}\n";
14968 char const *tesSource =
14969 "#version 450\n"
14970 "layout(triangles, equal_spacing, cw) in;\n"
14971 "layout(location=0) patch in int x;\n"
14972 "out gl_PerVertex { vec4 gl_Position; };\n"
14973 "void main(){\n"
14974 " gl_Position.xyz = gl_TessCoord;\n"
14975 " gl_Position.w = x;\n"
14976 "}\n";
14977 char const *fsSource =
14978 "#version 450\n"
14979 "layout(location=0) out vec4 color;\n"
14980 "void main(){\n"
14981 " color = vec4(1);\n"
14982 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014983
14984 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14985 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14986 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14987 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14988
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014989 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14990 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014991
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014992 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014993
14994 VkPipelineObj pipe(m_device);
14995 pipe.SetInputAssembly(&iasci);
14996 pipe.SetTessellation(&tsci);
14997 pipe.AddColorAttachment();
14998 pipe.AddShader(&vs);
14999 pipe.AddShader(&tcs);
15000 pipe.AddShader(&tes);
15001 pipe.AddShader(&fs);
15002
15003 VkDescriptorSetObj descriptorSet(m_device);
15004 descriptorSet.AppendDummy();
15005 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15006
15007 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15008
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015009 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120015010}
15011
Karl Schultz6addd812016-02-02 17:17:23 -070015012TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015013 TEST_DESCRIPTION(
15014 "Test that an error is produced for a vertex attribute setup where multiple "
15015 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15017 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015018
Tony Barbour1fa09702017-03-16 12:09:08 -060015019 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060015020 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015021
15022 /* Two binding descriptions for binding 0 */
15023 VkVertexInputBindingDescription input_bindings[2];
15024 memset(input_bindings, 0, sizeof(input_bindings));
15025
15026 VkVertexInputAttributeDescription input_attrib;
15027 memset(&input_attrib, 0, sizeof(input_attrib));
15028 input_attrib.format = VK_FORMAT_R32_SFLOAT;
15029
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015030 char const *vsSource =
15031 "#version 450\n"
15032 "\n"
15033 "layout(location=0) in float x;\n" /* attrib provided float */
15034 "out gl_PerVertex {\n"
15035 " vec4 gl_Position;\n"
15036 "};\n"
15037 "void main(){\n"
15038 " gl_Position = vec4(x);\n"
15039 "}\n";
15040 char const *fsSource =
15041 "#version 450\n"
15042 "\n"
15043 "layout(location=0) out vec4 color;\n"
15044 "void main(){\n"
15045 " color = vec4(1);\n"
15046 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120015047
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015048 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15049 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015050
15051 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080015052 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015053 pipe.AddShader(&vs);
15054 pipe.AddShader(&fs);
15055
15056 pipe.AddVertexInputBindings(input_bindings, 2);
15057 pipe.AddVertexInputAttribs(&input_attrib, 1);
15058
Chris Forbes280ba2c2015-06-12 11:16:41 +120015059 VkDescriptorSetObj descriptorSet(m_device);
15060 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015061 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120015062
Tony Barbour5781e8f2015-08-04 16:23:11 -060015063 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120015064
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015065 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120015066}
Chris Forbes8f68b562015-05-25 11:13:32 +120015067
Karl Schultz6addd812016-02-02 17:17:23 -070015068TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015069 TEST_DESCRIPTION(
15070 "Test that an error is produced for a fragment shader which does not "
15071 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015073
Tony Barbour1fa09702017-03-16 12:09:08 -060015074 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015075
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015076 char const *vsSource =
15077 "#version 450\n"
15078 "\n"
15079 "out gl_PerVertex {\n"
15080 " vec4 gl_Position;\n"
15081 "};\n"
15082 "void main(){\n"
15083 " gl_Position = vec4(1);\n"
15084 "}\n";
15085 char const *fsSource =
15086 "#version 450\n"
15087 "\n"
15088 "void main(){\n"
15089 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015090
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015091 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15092 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015093
15094 VkPipelineObj pipe(m_device);
15095 pipe.AddShader(&vs);
15096 pipe.AddShader(&fs);
15097
Chia-I Wu08accc62015-07-07 11:50:03 +080015098 /* set up CB 0, not written */
15099 pipe.AddColorAttachment();
15100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015101
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015102 VkDescriptorSetObj descriptorSet(m_device);
15103 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015104 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015105
Tony Barbour5781e8f2015-08-04 16:23:11 -060015106 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015107
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015108 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120015109}
15110
Karl Schultz6addd812016-02-02 17:17:23 -070015111TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015112 TEST_DESCRIPTION(
15113 "Test that a warning is produced for a fragment shader which provides a spurious "
15114 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060015116 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015117
Tony Barbour1fa09702017-03-16 12:09:08 -060015118 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015119
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015120 char const *vsSource =
15121 "#version 450\n"
15122 "\n"
15123 "out gl_PerVertex {\n"
15124 " vec4 gl_Position;\n"
15125 "};\n"
15126 "void main(){\n"
15127 " gl_Position = vec4(1);\n"
15128 "}\n";
15129 char const *fsSource =
15130 "#version 450\n"
15131 "\n"
15132 "layout(location=0) out vec4 x;\n"
15133 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
15134 "void main(){\n"
15135 " x = vec4(1);\n"
15136 " y = vec4(1);\n"
15137 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015138
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015139 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15140 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015141
15142 VkPipelineObj pipe(m_device);
15143 pipe.AddShader(&vs);
15144 pipe.AddShader(&fs);
15145
Chia-I Wu08accc62015-07-07 11:50:03 +080015146 /* set up CB 0, not written */
15147 pipe.AddColorAttachment();
15148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015149 /* FS writes CB 1, but we don't configure it */
15150
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015151 VkDescriptorSetObj descriptorSet(m_device);
15152 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015153 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015154
Tony Barbour5781e8f2015-08-04 16:23:11 -060015155 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015156
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015157 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120015158}
15159
Karl Schultz6addd812016-02-02 17:17:23 -070015160TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015161 TEST_DESCRIPTION(
15162 "Test that an error is produced for a mismatch between the fundamental "
15163 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060015164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015165
Tony Barbour1fa09702017-03-16 12:09:08 -060015166 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015167
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015168 char const *vsSource =
15169 "#version 450\n"
15170 "\n"
15171 "out gl_PerVertex {\n"
15172 " vec4 gl_Position;\n"
15173 "};\n"
15174 "void main(){\n"
15175 " gl_Position = vec4(1);\n"
15176 "}\n";
15177 char const *fsSource =
15178 "#version 450\n"
15179 "\n"
15180 "layout(location=0) out ivec4 x;\n" /* not UNORM */
15181 "void main(){\n"
15182 " x = ivec4(1);\n"
15183 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120015184
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015185 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15186 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015187
15188 VkPipelineObj pipe(m_device);
15189 pipe.AddShader(&vs);
15190 pipe.AddShader(&fs);
15191
Chia-I Wu08accc62015-07-07 11:50:03 +080015192 /* set up CB 0; type is UNORM by default */
15193 pipe.AddColorAttachment();
15194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015195
Chris Forbesa36d69e2015-05-25 11:13:44 +120015196 VkDescriptorSetObj descriptorSet(m_device);
15197 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015198 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015199
Tony Barbour5781e8f2015-08-04 16:23:11 -060015200 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015201
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015202 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015203}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015204
Karl Schultz6addd812016-02-02 17:17:23 -070015205TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015206 TEST_DESCRIPTION(
15207 "Test that an error is produced for a shader consuming a uniform "
15208 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015210
Tony Barbour1fa09702017-03-16 12:09:08 -060015211 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015212
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015213 char const *vsSource =
15214 "#version 450\n"
15215 "\n"
15216 "out gl_PerVertex {\n"
15217 " vec4 gl_Position;\n"
15218 "};\n"
15219 "void main(){\n"
15220 " gl_Position = vec4(1);\n"
15221 "}\n";
15222 char const *fsSource =
15223 "#version 450\n"
15224 "\n"
15225 "layout(location=0) out vec4 x;\n"
15226 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15227 "void main(){\n"
15228 " x = vec4(bar.y);\n"
15229 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015230
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015231 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15232 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015233
Chris Forbes556c76c2015-08-14 12:04:59 +120015234 VkPipelineObj pipe(m_device);
15235 pipe.AddShader(&vs);
15236 pipe.AddShader(&fs);
15237
15238 /* set up CB 0; type is UNORM by default */
15239 pipe.AddColorAttachment();
15240 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15241
15242 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015243 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015244
15245 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15246
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015247 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015248}
15249
Chris Forbes5c59e902016-02-26 16:56:09 +130015250TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015251 TEST_DESCRIPTION(
15252 "Test that an error is produced for a shader consuming push constants "
15253 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015255
Tony Barbour1fa09702017-03-16 12:09:08 -060015256 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015257
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015258 char const *vsSource =
15259 "#version 450\n"
15260 "\n"
15261 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15262 "out gl_PerVertex {\n"
15263 " vec4 gl_Position;\n"
15264 "};\n"
15265 "void main(){\n"
15266 " gl_Position = vec4(consts.x);\n"
15267 "}\n";
15268 char const *fsSource =
15269 "#version 450\n"
15270 "\n"
15271 "layout(location=0) out vec4 x;\n"
15272 "void main(){\n"
15273 " x = vec4(1);\n"
15274 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015275
15276 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15277 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15278
15279 VkPipelineObj pipe(m_device);
15280 pipe.AddShader(&vs);
15281 pipe.AddShader(&fs);
15282
15283 /* set up CB 0; type is UNORM by default */
15284 pipe.AddColorAttachment();
15285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15286
15287 VkDescriptorSetObj descriptorSet(m_device);
15288 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15289
15290 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15291
15292 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015293 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015294}
15295
Chris Forbes3fb17902016-08-22 14:57:55 +120015296TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015297 TEST_DESCRIPTION(
15298 "Test that an error is produced for a shader consuming an input attachment "
15299 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15301 "consumes input attachment index 0 but not provided in subpass");
15302
Tony Barbour1fa09702017-03-16 12:09:08 -060015303 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015304
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015305 char const *vsSource =
15306 "#version 450\n"
15307 "\n"
15308 "out gl_PerVertex {\n"
15309 " vec4 gl_Position;\n"
15310 "};\n"
15311 "void main(){\n"
15312 " gl_Position = vec4(1);\n"
15313 "}\n";
15314 char const *fsSource =
15315 "#version 450\n"
15316 "\n"
15317 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15318 "layout(location=0) out vec4 color;\n"
15319 "void main() {\n"
15320 " color = subpassLoad(x);\n"
15321 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015322
15323 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15324 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15325
15326 VkPipelineObj pipe(m_device);
15327 pipe.AddShader(&vs);
15328 pipe.AddShader(&fs);
15329 pipe.AddColorAttachment();
15330 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15331
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015332 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15333 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015334 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015335 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015336 ASSERT_VK_SUCCESS(err);
15337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015338 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015339 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015340 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015341 ASSERT_VK_SUCCESS(err);
15342
15343 // error here.
15344 pipe.CreateVKPipeline(pl, renderPass());
15345
15346 m_errorMonitor->VerifyFound();
15347
15348 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15349 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15350}
15351
Chris Forbes5a9a0472016-08-22 16:02:09 +120015352TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015353 TEST_DESCRIPTION(
15354 "Test that an error is produced for a shader consuming an input attachment "
15355 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15357 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15358
Tony Barbour1fa09702017-03-16 12:09:08 -060015359 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015360
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015361 char const *vsSource =
15362 "#version 450\n"
15363 "\n"
15364 "out gl_PerVertex {\n"
15365 " vec4 gl_Position;\n"
15366 "};\n"
15367 "void main(){\n"
15368 " gl_Position = vec4(1);\n"
15369 "}\n";
15370 char const *fsSource =
15371 "#version 450\n"
15372 "\n"
15373 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15374 "layout(location=0) out vec4 color;\n"
15375 "void main() {\n"
15376 " color = subpassLoad(x);\n"
15377 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015378
15379 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15380 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15381
15382 VkPipelineObj pipe(m_device);
15383 pipe.AddShader(&vs);
15384 pipe.AddShader(&fs);
15385 pipe.AddColorAttachment();
15386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15387
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015388 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15389 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015390 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015391 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015392 ASSERT_VK_SUCCESS(err);
15393
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015394 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015395 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015396 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015397 ASSERT_VK_SUCCESS(err);
15398
15399 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015400 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15401 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15402 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15403 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15404 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 +120015405 };
15406 VkAttachmentReference color = {
15407 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15408 };
15409 VkAttachmentReference input = {
15410 1, VK_IMAGE_LAYOUT_GENERAL,
15411 };
15412
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015413 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015415 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015416 VkRenderPass rp;
15417 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15418 ASSERT_VK_SUCCESS(err);
15419
15420 // error here.
15421 pipe.CreateVKPipeline(pl, rp);
15422
15423 m_errorMonitor->VerifyFound();
15424
15425 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15426 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15427 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15428}
15429
Chris Forbes541f7b02016-08-22 15:30:27 +120015430TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015431 TEST_DESCRIPTION(
15432 "Test that an error is produced for a shader consuming an input attachment "
15433 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015435 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015436
Tony Barbour1fa09702017-03-16 12:09:08 -060015437 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015438
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015439 char const *vsSource =
15440 "#version 450\n"
15441 "\n"
15442 "out gl_PerVertex {\n"
15443 " vec4 gl_Position;\n"
15444 "};\n"
15445 "void main(){\n"
15446 " gl_Position = vec4(1);\n"
15447 "}\n";
15448 char const *fsSource =
15449 "#version 450\n"
15450 "\n"
15451 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15452 "layout(location=0) out vec4 color;\n"
15453 "void main() {\n"
15454 " color = subpassLoad(xs[0]);\n"
15455 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015456
15457 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15458 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15459
15460 VkPipelineObj pipe(m_device);
15461 pipe.AddShader(&vs);
15462 pipe.AddShader(&fs);
15463 pipe.AddColorAttachment();
15464 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15465
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015466 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15467 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015468 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015469 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015470 ASSERT_VK_SUCCESS(err);
15471
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015472 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015473 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015474 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015475 ASSERT_VK_SUCCESS(err);
15476
15477 // error here.
15478 pipe.CreateVKPipeline(pl, renderPass());
15479
15480 m_errorMonitor->VerifyFound();
15481
15482 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15483 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15484}
15485
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015486TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015487 TEST_DESCRIPTION(
15488 "Test that an error is produced for a compute pipeline consuming a "
15489 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015491
Tony Barbour1fa09702017-03-16 12:09:08 -060015492 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015494 char const *csSource =
15495 "#version 450\n"
15496 "\n"
15497 "layout(local_size_x=1) in;\n"
15498 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15499 "void main(){\n"
15500 " x = vec4(1);\n"
15501 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015502
15503 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15504
15505 VkDescriptorSetObj descriptorSet(m_device);
15506 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15507
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015508 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15509 nullptr,
15510 0,
15511 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15512 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15513 descriptorSet.GetPipelineLayout(),
15514 VK_NULL_HANDLE,
15515 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015516
15517 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015518 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015519
15520 m_errorMonitor->VerifyFound();
15521
15522 if (err == VK_SUCCESS) {
15523 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15524 }
15525}
15526
Chris Forbes22a9b092016-07-19 14:34:05 +120015527TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015528 TEST_DESCRIPTION(
15529 "Test that an error is produced for a pipeline consuming a "
15530 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15532 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015533
Tony Barbour1fa09702017-03-16 12:09:08 -060015534 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015535
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015536 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15537 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015538 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015539 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015540 ASSERT_VK_SUCCESS(err);
15541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015542 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015543 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015544 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015545 ASSERT_VK_SUCCESS(err);
15546
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015547 char const *csSource =
15548 "#version 450\n"
15549 "\n"
15550 "layout(local_size_x=1) in;\n"
15551 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15552 "void main() {\n"
15553 " x.x = 1.0f;\n"
15554 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015555 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15556
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015557 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15558 nullptr,
15559 0,
15560 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15561 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15562 pl,
15563 VK_NULL_HANDLE,
15564 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015565
15566 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015567 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015568
15569 m_errorMonitor->VerifyFound();
15570
15571 if (err == VK_SUCCESS) {
15572 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15573 }
15574
15575 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15576 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15577}
15578
Chris Forbes50020592016-07-27 13:52:41 +120015579TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015580 TEST_DESCRIPTION(
15581 "Test that an error is produced when an image view type "
15582 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015583
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015584 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 +120015585
Tony Barbour1fa09702017-03-16 12:09:08 -060015586 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015587 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15588
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015589 char const *vsSource =
15590 "#version 450\n"
15591 "\n"
15592 "out gl_PerVertex { vec4 gl_Position; };\n"
15593 "void main() { gl_Position = vec4(0); }\n";
15594 char const *fsSource =
15595 "#version 450\n"
15596 "\n"
15597 "layout(set=0, binding=0) uniform sampler3D s;\n"
15598 "layout(location=0) out vec4 color;\n"
15599 "void main() {\n"
15600 " color = texture(s, vec3(0));\n"
15601 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015602 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15603 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15604
15605 VkPipelineObj pipe(m_device);
15606 pipe.AddShader(&vs);
15607 pipe.AddShader(&fs);
15608 pipe.AddColorAttachment();
15609
15610 VkTextureObj texture(m_device, nullptr);
15611 VkSamplerObj sampler(m_device);
15612
15613 VkDescriptorSetObj descriptorSet(m_device);
15614 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15615 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15616
15617 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15618 ASSERT_VK_SUCCESS(err);
15619
Tony Barbour552f6c02016-12-21 14:34:07 -070015620 m_commandBuffer->BeginCommandBuffer();
15621 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015622
15623 m_commandBuffer->BindPipeline(pipe);
15624 m_commandBuffer->BindDescriptorSet(descriptorSet);
15625
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015626 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015627 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015628 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015629 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15630
15631 // error produced here.
15632 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15633
15634 m_errorMonitor->VerifyFound();
15635
Tony Barbour552f6c02016-12-21 14:34:07 -070015636 m_commandBuffer->EndRenderPass();
15637 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015638}
15639
Chris Forbes5533bfc2016-07-27 14:12:34 +120015640TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015641 TEST_DESCRIPTION(
15642 "Test that an error is produced when a multisampled images "
15643 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015644
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015646
Tony Barbour1fa09702017-03-16 12:09:08 -060015647 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15649
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015650 char const *vsSource =
15651 "#version 450\n"
15652 "\n"
15653 "out gl_PerVertex { vec4 gl_Position; };\n"
15654 "void main() { gl_Position = vec4(0); }\n";
15655 char const *fsSource =
15656 "#version 450\n"
15657 "\n"
15658 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15659 "layout(location=0) out vec4 color;\n"
15660 "void main() {\n"
15661 " color = texelFetch(s, ivec2(0), 0);\n"
15662 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015663 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15664 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15665
15666 VkPipelineObj pipe(m_device);
15667 pipe.AddShader(&vs);
15668 pipe.AddShader(&fs);
15669 pipe.AddColorAttachment();
15670
15671 VkTextureObj texture(m_device, nullptr);
15672 VkSamplerObj sampler(m_device);
15673
15674 VkDescriptorSetObj descriptorSet(m_device);
15675 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15676 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15677
15678 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15679 ASSERT_VK_SUCCESS(err);
15680
Tony Barbour552f6c02016-12-21 14:34:07 -070015681 m_commandBuffer->BeginCommandBuffer();
15682 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015683
15684 m_commandBuffer->BindPipeline(pipe);
15685 m_commandBuffer->BindDescriptorSet(descriptorSet);
15686
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015687 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015688 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015689 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015690 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15691
15692 // error produced here.
15693 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15694
15695 m_errorMonitor->VerifyFound();
15696
Tony Barbour552f6c02016-12-21 14:34:07 -070015697 m_commandBuffer->EndRenderPass();
15698 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015699}
15700
Mark Youngc48c4c12016-04-11 14:26:49 -060015701TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015702 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015703
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015704 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15705 {
15706 VkFormatProperties properties;
15707 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15708 if (properties.optimalTilingFeatures == 0) {
15709 printf(" Image format not supported; skipped.\n");
15710 return;
15711 }
15712 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015713
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015714 VkImageCreateInfo info = {};
15715 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15716 info.pNext = NULL;
15717 info.imageType = VK_IMAGE_TYPE_2D;
15718 info.format = format;
15719 info.extent.height = 32;
15720 info.extent.depth = 1;
15721 info.mipLevels = 1;
15722 info.arrayLayers = 1;
15723 info.samples = VK_SAMPLE_COUNT_1_BIT;
15724 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15725 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15726 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015727
15728 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015729 {
15730 VkImageFormatProperties properties;
15731 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15732 info.tiling, info.usage, info.flags, &properties);
15733 ASSERT_VK_SUCCESS(result);
15734 info.extent.width = properties.maxExtent.width + 1;
15735 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015736
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015737 VkImage image;
15738 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15739 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015740 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015741}
15742
Mark Youngc48c4c12016-04-11 14:26:49 -060015743TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015744 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015745
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015746 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15747 {
15748 VkFormatProperties properties;
15749 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15750 if (properties.optimalTilingFeatures == 0) {
15751 printf(" Image format not supported; skipped.\n");
15752 return;
15753 }
15754 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015755
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015756 VkImageCreateInfo info = {};
15757 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15758 info.pNext = NULL;
15759 info.imageType = VK_IMAGE_TYPE_2D;
15760 info.format = format;
15761 info.extent.height = 32;
15762 info.extent.depth = 1;
15763 info.mipLevels = 1;
15764 info.arrayLayers = 1;
15765 info.samples = VK_SAMPLE_COUNT_1_BIT;
15766 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15767 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15768 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015769
15770 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015771 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015772
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015773 VkImage image;
Tobin Ehlisa55b1d42017-04-04 12:23:48 -060015774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02917);
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015775 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15776 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015777 m_errorMonitor->VerifyFound();
15778}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015779
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015780TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015781 TEST_DESCRIPTION(
15782 "Create a render pass with an attachment description "
15783 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015784
Tony Barbour1fa09702017-03-16 12:09:08 -060015785 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015786 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15787
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015789
15790 VkAttachmentReference color_attach = {};
15791 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15792 color_attach.attachment = 0;
15793 VkSubpassDescription subpass = {};
15794 subpass.colorAttachmentCount = 1;
15795 subpass.pColorAttachments = &color_attach;
15796
15797 VkRenderPassCreateInfo rpci = {};
15798 rpci.subpassCount = 1;
15799 rpci.pSubpasses = &subpass;
15800 rpci.attachmentCount = 1;
15801 VkAttachmentDescription attach_desc = {};
15802 attach_desc.format = VK_FORMAT_UNDEFINED;
15803 rpci.pAttachments = &attach_desc;
15804 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15805 VkRenderPass rp;
15806 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15807
15808 m_errorMonitor->VerifyFound();
15809
15810 if (result == VK_SUCCESS) {
15811 vkDestroyRenderPass(m_device->device(), rp, NULL);
15812 }
15813}
15814
Karl Schultz6addd812016-02-02 17:17:23 -070015815TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015816 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015817
Mike Stroyana3082432015-09-25 13:39:21 -060015818 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015819 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15820 const int32_t tex_width = 32;
15821 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015822
15823 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015824 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15825 image_create_info.pNext = NULL;
15826 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15827 image_create_info.format = tex_format;
15828 image_create_info.extent.width = tex_width;
15829 image_create_info.extent.height = tex_height;
15830 image_create_info.extent.depth = 1;
15831 image_create_info.mipLevels = 1;
15832 image_create_info.arrayLayers = 1;
15833 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15834 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15835 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15836 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015837
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015838 VkImage image;
15839 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015840 ASSERT_VK_SUCCESS(err);
15841
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015842 VkMemoryRequirements requirements;
15843 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15844
15845 VkMemoryAllocateInfo alloc_info{};
15846 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15847 alloc_info.pNext = NULL;
15848 alloc_info.memoryTypeIndex = 0;
15849 alloc_info.allocationSize = requirements.size;
15850 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15851 ASSERT_TRUE(pass);
15852
15853 VkDeviceMemory memory;
15854 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15855 ASSERT_VK_SUCCESS(err);
15856
15857 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15858
Tobin Ehliscde08892015-09-22 10:11:37 -060015859 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015860 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015861 image_view_create_info.image = image;
15862 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15863 image_view_create_info.format = tex_format;
15864 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015865 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015866 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015867 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015868
15869 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015871 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015872 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015873
15874 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015875 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015876}
Mike Stroyana3082432015-09-25 13:39:21 -060015877
Mark Youngd339ba32016-05-30 13:28:35 -060015878TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15879 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015881 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015882
Tony Barbour1fa09702017-03-16 12:09:08 -060015883 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015884
15885 // Create an image and try to create a view with no memory backing the image
15886 VkImage image;
15887
15888 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15889 const int32_t tex_width = 32;
15890 const int32_t tex_height = 32;
15891
15892 VkImageCreateInfo image_create_info = {};
15893 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15894 image_create_info.pNext = NULL;
15895 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15896 image_create_info.format = tex_format;
15897 image_create_info.extent.width = tex_width;
15898 image_create_info.extent.height = tex_height;
15899 image_create_info.extent.depth = 1;
15900 image_create_info.mipLevels = 1;
15901 image_create_info.arrayLayers = 1;
15902 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15903 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15904 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15905 image_create_info.flags = 0;
15906
15907 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15908 ASSERT_VK_SUCCESS(err);
15909
15910 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015911 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015912 image_view_create_info.image = image;
15913 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15914 image_view_create_info.format = tex_format;
15915 image_view_create_info.subresourceRange.layerCount = 1;
15916 image_view_create_info.subresourceRange.baseMipLevel = 0;
15917 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015918 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015919
15920 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015921 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015922
15923 m_errorMonitor->VerifyFound();
15924 vkDestroyImage(m_device->device(), image, NULL);
15925 // If last error is success, it still created the view, so delete it.
15926 if (err == VK_SUCCESS) {
15927 vkDestroyImageView(m_device->device(), view, NULL);
15928 }
Mark Youngd339ba32016-05-30 13:28:35 -060015929}
15930
Karl Schultz6addd812016-02-02 17:17:23 -070015931TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015932 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015934
Tony Barbour1fa09702017-03-16 12:09:08 -060015935 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015936
Karl Schultz6addd812016-02-02 17:17:23 -070015937 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015938 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015939 image.Init(32, 32, 1, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015940 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015941
15942 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015943 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015944 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015945 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15946 image_view_create_info.format = tex_format;
15947 image_view_create_info.subresourceRange.baseMipLevel = 0;
15948 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015949 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015950 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015951 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015952
15953 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015954 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015955
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015956 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015957}
15958
Mike Weiblena1e13f42017-02-09 21:25:59 -070015959TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15960 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15961
Tony Barbour1fa09702017-03-16 12:09:08 -060015962 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015963 VkSubresourceLayout subres_layout = {};
15964
15965 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15966 {
15967 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15968 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015969 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015970 ASSERT_TRUE(img.initialized());
15971
15972 VkImageSubresource subres = {};
15973 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15974 subres.mipLevel = 0;
15975 subres.arrayLayer = 0;
15976
15977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15978 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15979 m_errorMonitor->VerifyFound();
15980 }
15981
15982 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15983 {
15984 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060015985 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070015986 ASSERT_TRUE(img.initialized());
15987
15988 VkImageSubresource subres = {};
15989 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15990 subres.mipLevel = 0;
15991 subres.arrayLayer = 0;
15992
15993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15995 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15996 m_errorMonitor->VerifyFound();
15997 }
15998
15999 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
16000 {
16001 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016002 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016003 ASSERT_TRUE(img.initialized());
16004
16005 VkImageSubresource subres = {};
16006 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16007 subres.mipLevel = 1; // ERROR: triggers VU 00739
16008 subres.arrayLayer = 0;
16009
16010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
16011 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16012 m_errorMonitor->VerifyFound();
16013 }
16014
16015 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
16016 {
16017 VkImageObj img(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016018 img.InitNoLayout(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mike Weiblena1e13f42017-02-09 21:25:59 -070016019 ASSERT_TRUE(img.initialized());
16020
16021 VkImageSubresource subres = {};
16022 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16023 subres.mipLevel = 0;
16024 subres.arrayLayer = 1; // ERROR: triggers VU 00740
16025
16026 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
16027 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
16028 m_errorMonitor->VerifyFound();
16029 }
16030}
16031
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016032TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070016033 VkResult err;
16034 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016035
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016037
Tony Barbour1fa09702017-03-16 12:09:08 -060016038 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060016039
16040 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016041 VkImage srcImage;
16042 VkImage dstImage;
16043 VkDeviceMemory srcMem;
16044 VkDeviceMemory destMem;
16045 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016046
16047 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016048 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16049 image_create_info.pNext = NULL;
16050 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16051 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16052 image_create_info.extent.width = 32;
16053 image_create_info.extent.height = 32;
16054 image_create_info.extent.depth = 1;
16055 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016056 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070016057 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16058 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16059 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16060 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016061
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016062 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016063 ASSERT_VK_SUCCESS(err);
16064
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016065 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016066 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016067 ASSERT_VK_SUCCESS(err);
16068
16069 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016070 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016071 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16072 memAlloc.pNext = NULL;
16073 memAlloc.allocationSize = 0;
16074 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016075
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016076 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016077 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016078 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016079 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016080 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016081 ASSERT_VK_SUCCESS(err);
16082
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016083 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016084 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016085 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016086 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016087 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016088 ASSERT_VK_SUCCESS(err);
16089
16090 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16091 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016092 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016093 ASSERT_VK_SUCCESS(err);
16094
Tony Barbour552f6c02016-12-21 14:34:07 -070016095 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016096 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016097 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016098 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060016099 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016100 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060016101 copyRegion.srcOffset.x = 0;
16102 copyRegion.srcOffset.y = 0;
16103 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080016104 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016105 copyRegion.dstSubresource.mipLevel = 0;
16106 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016107 // Introduce failure by forcing the dst layerCount to differ from src
16108 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016109 copyRegion.dstOffset.x = 0;
16110 copyRegion.dstOffset.y = 0;
16111 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016112 copyRegion.extent.width = 1;
16113 copyRegion.extent.height = 1;
16114 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016115 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016116 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060016117
Chris Forbes8f36a8a2016-04-07 13:21:07 +120016118 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060016119
Chia-I Wuf7458c52015-10-26 21:10:41 +080016120 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016121 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080016122 vkFreeMemory(m_device->device(), srcMem, NULL);
16123 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016124}
16125
Tony Barbourd6673642016-05-05 14:46:39 -060016126TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060016127 TEST_DESCRIPTION("Creating images with unsuported formats ");
16128
Tony Barbour1fa09702017-03-16 12:09:08 -060016129 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016130 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060016131
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016132 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130016133 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016134 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016135 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16136 image_create_info.format = VK_FORMAT_UNDEFINED;
16137 image_create_info.extent.width = 32;
16138 image_create_info.extent.height = 32;
16139 image_create_info.extent.depth = 1;
16140 image_create_info.mipLevels = 1;
16141 image_create_info.arrayLayers = 1;
16142 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16143 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
16144 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016145
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16147 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016148
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016149 VkImage image;
16150 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016151 m_errorMonitor->VerifyFound();
16152
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016153 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016154 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060016155 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
16156 VkFormat format = static_cast<VkFormat>(f);
16157 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016158 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060016159 unsupported = format;
16160 break;
16161 }
16162 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060016163
Tony Barbourd6673642016-05-05 14:46:39 -060016164 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060016165 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060016167
Jeremy Hayes96dcd812017-03-14 14:04:19 -060016168 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060016169 m_errorMonitor->VerifyFound();
16170 }
16171}
16172
16173TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060016174 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
16175
Tony Barbour1fa09702017-03-16 12:09:08 -060016176 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060016177 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070016178 if (!depth_format) {
16179 return;
16180 }
Tony Barbourd6673642016-05-05 14:46:39 -060016181
16182 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016183 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 -060016184 VK_IMAGE_TILING_OPTIMAL, 0);
16185 ASSERT_TRUE(image.initialized());
16186
16187 VkImageView imgView;
16188 VkImageViewCreateInfo imgViewInfo = {};
16189 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
16190 imgViewInfo.image = image.handle();
16191 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
16192 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16193 imgViewInfo.subresourceRange.layerCount = 1;
16194 imgViewInfo.subresourceRange.baseMipLevel = 0;
16195 imgViewInfo.subresourceRange.levelCount = 1;
16196 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16197
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016198 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016199 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016201 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16202 m_errorMonitor->VerifyFound();
16203 imgViewInfo.subresourceRange.baseMipLevel = 0;
16204
Tony Barbourd6673642016-05-05 14:46:39 -060016205 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16206 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016208 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16209 m_errorMonitor->VerifyFound();
16210 imgViewInfo.subresourceRange.levelCount = 1;
16211
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016212 // View's levelCount can't be > image's mipLevels - Expect VIEW_CREATE_ERROR
16213 imgViewInfo.subresourceRange.levelCount = 2;
16214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
16215 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16216 m_errorMonitor->VerifyFound();
16217 imgViewInfo.subresourceRange.levelCount = 1;
16218
16219 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
16220 imgViewInfo.subresourceRange.baseArrayLayer = 1;
16221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
16222 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16223 m_errorMonitor->VerifyFound();
16224 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16225
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016226 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16227 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016228 m_errorMonitor->SetDesiredFailureMsg(
16229 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16230 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016231 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16232 m_errorMonitor->VerifyFound();
16233 imgViewInfo.subresourceRange.layerCount = 1;
16234
Tony Barbourd6673642016-05-05 14:46:39 -060016235 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016236 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016237 m_errorMonitor->SetDesiredFailureMsg(
16238 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16239 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016240 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16241 m_errorMonitor->VerifyFound();
16242 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16243
Tony Barbourd6673642016-05-05 14:46:39 -060016244 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16245 // VIEW_CREATE_ERROR
16246 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016248 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16249 m_errorMonitor->VerifyFound();
16250 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16251
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016252 // TODO: Update framework to easily passing mutable flag into ImageObj init
16253 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016254 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16255 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16256 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016257 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16258 // VIEW_CREATE_ERROR
16259 VkImageCreateInfo mutImgInfo = image.create_info();
16260 VkImage mutImage;
16261 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016262 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016263 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16264 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016265 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016266 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016267
16268 VkMemoryRequirements requirements;
16269 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16270
16271 VkMemoryAllocateInfo alloc_info{};
16272 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16273 alloc_info.pNext = NULL;
16274 alloc_info.memoryTypeIndex = 0;
16275 alloc_info.allocationSize = requirements.size;
16276 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16277 ASSERT_TRUE(pass);
16278
16279 VkDeviceMemory memory;
16280 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16281 ASSERT_VK_SUCCESS(ret);
16282
16283 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16284 ASSERT_VK_SUCCESS(ret);
16285
Tony Barbourd6673642016-05-05 14:46:39 -060016286 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016288 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16289 m_errorMonitor->VerifyFound();
16290 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016291
16292 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016293 vkDestroyImage(m_device->handle(), mutImage, NULL);
16294}
16295
Dave Houlton75967fc2017-03-06 17:21:16 -070016296TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16297 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16298
Tony Barbour1fa09702017-03-16 12:09:08 -060016299 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016300
Jamie Madill35127872017-03-15 16:17:46 -040016301 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016302 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16303 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16304 if (device_features.textureCompressionBC) {
16305 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16306 } else if (device_features.textureCompressionETC2) {
16307 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16308 } else if (device_features.textureCompressionASTC_LDR) {
16309 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16310 } else {
16311 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16312 return;
16313 }
16314
16315 VkImageCreateInfo ci;
16316 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16317 ci.pNext = NULL;
16318 ci.flags = 0;
16319 ci.imageType = VK_IMAGE_TYPE_2D;
16320 ci.format = compressed_format;
16321 ci.extent = {32, 32, 1};
16322 ci.mipLevels = 6;
16323 ci.arrayLayers = 1;
16324 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16325 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16326 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16327 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16328 ci.queueFamilyIndexCount = 0;
16329 ci.pQueueFamilyIndices = NULL;
16330 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16331
16332 VkImageObj image(m_device);
16333 image.init(&ci);
16334 ASSERT_TRUE(image.initialized());
16335
16336 VkImageObj odd_image(m_device);
16337 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16338 odd_image.init(&ci);
16339 ASSERT_TRUE(odd_image.initialized());
16340
16341 // Allocate buffers
16342 VkMemoryPropertyFlags reqs = 0;
16343 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16344 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16345 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16346 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16347 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16348
16349 VkBufferImageCopy region = {};
16350 region.bufferRowLength = 0;
16351 region.bufferImageHeight = 0;
16352 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16353 region.imageSubresource.layerCount = 1;
16354 region.imageOffset = {0, 0, 0};
16355 region.bufferOffset = 0;
16356
16357 // start recording
16358 m_commandBuffer->BeginCommandBuffer();
16359
16360 // Mip level copies that work - 5 levels
16361 m_errorMonitor->ExpectSuccess();
16362
16363 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16364 region.imageExtent = {32, 32, 1};
16365 region.imageSubresource.mipLevel = 0;
16366 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16367 &region);
16368 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16369 &region);
16370
16371 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16372 region.imageExtent = {8, 8, 1};
16373 region.imageSubresource.mipLevel = 2;
16374 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16375 &region);
16376 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16377 &region);
16378
16379 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16380 region.imageExtent = {4, 4, 1};
16381 region.imageSubresource.mipLevel = 3;
16382 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16383 &region);
16384 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16385 &region);
16386
16387 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16388 region.imageExtent = {2, 2, 1};
16389 region.imageSubresource.mipLevel = 4;
16390 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16391 &region);
16392 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16393 &region);
16394
16395 region.imageExtent = {1, 1, 1};
16396 region.imageSubresource.mipLevel = 5;
16397 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16398 &region);
16399 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16400 &region);
16401 m_errorMonitor->VerifyNotFound();
16402
16403 // Buffer must accomodate a full compressed block, regardless of texel count
16404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16405 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16406 &region);
16407 m_errorMonitor->VerifyFound();
16408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16409 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16410 &region);
16411 m_errorMonitor->VerifyFound();
16412
16413 // Copy width < compressed block size, but not the full mip width
16414 region.imageExtent = {1, 2, 1};
16415 region.imageSubresource.mipLevel = 4;
16416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16417 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16418 &region);
16419 m_errorMonitor->VerifyFound();
16420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16421 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16422 &region);
16423 m_errorMonitor->VerifyFound();
16424
16425 // Copy height < compressed block size but not the full mip height
16426 region.imageExtent = {2, 1, 1};
16427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16428 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16429 &region);
16430 m_errorMonitor->VerifyFound();
16431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16432 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16433 &region);
16434 m_errorMonitor->VerifyFound();
16435
16436 // Offsets must be multiple of compressed block size
16437 region.imageOffset = {1, 1, 0};
16438 region.imageExtent = {1, 1, 1};
16439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16440 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16441 &region);
16442 m_errorMonitor->VerifyFound();
16443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16444 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16445 &region);
16446 m_errorMonitor->VerifyFound();
16447
16448 // Offset + extent width = mip width - should succeed
16449 region.imageOffset = {4, 4, 0};
16450 region.imageExtent = {3, 4, 1};
16451 region.imageSubresource.mipLevel = 2;
16452 m_errorMonitor->ExpectSuccess();
16453 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16454 &region);
16455 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16456 &region);
16457 m_errorMonitor->VerifyNotFound();
16458
16459 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16460 region.imageExtent = {4, 4, 1};
16461 m_errorMonitor->ExpectSuccess();
16462 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16463 &region);
16464 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16465 &region);
16466 m_errorMonitor->VerifyNotFound();
16467
16468 // Offset + extent width < mip width and not a multiple of block width - should fail
16469 region.imageExtent = {3, 3, 1};
16470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16471 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16472 &region);
16473 m_errorMonitor->VerifyFound();
16474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16475 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16476 &region);
16477 m_errorMonitor->VerifyFound();
16478}
16479
Dave Houlton59a20702017-02-02 17:26:23 -070016480TEST_F(VkLayerTest, ImageBufferCopyTests) {
16481 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16482
Tony Barbour1fa09702017-03-16 12:09:08 -060016483 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016484 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16485 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16486 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16487 return;
16488 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016489
16490 // Bail if any dimension of transfer granularity is 0.
16491 auto index = m_device->graphics_queue_node_index_;
16492 auto queue_family_properties = m_device->phy().queue_properties();
16493 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16494 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16495 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16496 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16497 return;
16498 }
16499
Dave Houlton59a20702017-02-02 17:26:23 -070016500 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16501 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16502 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016503 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16504 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16505 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16506 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16507
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016508 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016509 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16510 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016511 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
Dave Houlton59a20702017-02-02 17:26:23 -070016512 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16513 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016514 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 -070016515 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016516 ASSERT_TRUE(image_64k.initialized());
16517 ASSERT_TRUE(image_16k.initialized());
16518 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016519
Dave Houltonf3229d52017-02-21 15:59:08 -070016520 // Verify all needed Depth/Stencil formats are supported
16521 bool missing_ds_support = false;
16522 VkFormatProperties props = {0, 0, 0};
16523 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16524 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16525 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16526 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16527 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16528 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16529 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16530 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16531
16532 if (!missing_ds_support) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016533 ds_image_4D_1S.Init(
16534 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016535 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16536 VK_IMAGE_TILING_OPTIMAL, 0);
16537 ASSERT_TRUE(ds_image_4D_1S.initialized());
16538
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016539 ds_image_3D_1S.Init(
16540 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
Dave Houltonf3229d52017-02-21 15:59:08 -070016541 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16542 VK_IMAGE_TILING_OPTIMAL, 0);
16543 ASSERT_TRUE(ds_image_3D_1S.initialized());
16544
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016545 ds_image_2D.Init(256, 256, 1, VK_FORMAT_D16_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16546 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16547 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016548 ASSERT_TRUE(ds_image_2D.initialized());
16549
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016550 ds_image_1S.Init(256, 256, 1, VK_FORMAT_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
16551 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16552 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houltonf3229d52017-02-21 15:59:08 -070016553 ASSERT_TRUE(ds_image_1S.initialized());
16554 }
16555
16556 // Allocate buffers
16557 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016558 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016559 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16560 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16561 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16562 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016563
16564 VkBufferImageCopy region = {};
16565 region.bufferRowLength = 0;
16566 region.bufferImageHeight = 0;
16567 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16568 region.imageSubresource.layerCount = 1;
16569 region.imageOffset = {0, 0, 0};
16570 region.imageExtent = {64, 64, 1};
16571 region.bufferOffset = 0;
16572
16573 // attempt copies before putting command buffer in recording state
16574 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16575 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16576 &region);
16577 m_errorMonitor->VerifyFound();
16578
16579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16580 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16581 &region);
16582 m_errorMonitor->VerifyFound();
16583
16584 // start recording
16585 m_commandBuffer->BeginCommandBuffer();
16586
16587 // successful copies
16588 m_errorMonitor->ExpectSuccess();
16589 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16590 &region);
16591 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16592 &region);
16593 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16594 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16595 &region);
16596 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16597 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16598 &region);
16599 region.imageOffset.x = 0;
16600 region.imageExtent.height = 64;
16601 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16602 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16603 &region);
16604 m_errorMonitor->VerifyNotFound();
16605
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016606 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016607 region.imageExtent = {65, 64, 1};
16608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16609 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16610 &region);
16611 m_errorMonitor->VerifyFound();
16612
16613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16614 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16615 &region);
16616 m_errorMonitor->VerifyFound();
16617
16618 // image/buffer too small (offset) on copy to image
16619 region.imageExtent = {64, 64, 1};
16620 region.imageOffset = {0, 4, 0};
16621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16622 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16623 &region);
16624 m_errorMonitor->VerifyFound();
16625
16626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16627 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16628 &region);
16629 m_errorMonitor->VerifyFound();
16630
16631 // image/buffer too small on copy to buffer
16632 region.imageExtent = {64, 64, 1};
16633 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016634 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016635 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16636 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16637 &region);
16638 m_errorMonitor->VerifyFound();
16639
16640 region.imageExtent = {64, 65, 1};
16641 region.bufferOffset = 0;
16642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16643 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16644 &region);
16645 m_errorMonitor->VerifyFound();
16646
16647 // buffer size ok but rowlength causes loose packing
16648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16649 region.imageExtent = {64, 64, 1};
16650 region.bufferRowLength = 68;
16651 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16652 &region);
16653 m_errorMonitor->VerifyFound();
16654
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016655 // An extent with zero area should produce a warning, but no error
16656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16657 region.imageExtent.width = 0;
16658 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16659 &region);
16660 m_errorMonitor->VerifyFound();
16661
Dave Houlton59a20702017-02-02 17:26:23 -070016662 // aspect bits
16663 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16664 region.imageExtent = {64, 64, 1};
16665 region.bufferRowLength = 0;
16666 region.bufferImageHeight = 0;
16667 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16668 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16669 buffer_16k.handle(), 1, &region);
16670 m_errorMonitor->VerifyFound();
16671
16672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16673 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16674 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16675 &region);
16676 m_errorMonitor->VerifyFound();
16677
16678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16679 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16680 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16681 buffer_16k.handle(), 1, &region);
16682 m_errorMonitor->VerifyFound();
16683
Dave Houltonf3229d52017-02-21 15:59:08 -070016684 // Test Depth/Stencil copies
16685 if (missing_ds_support) {
16686 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16687 } else {
16688 VkBufferImageCopy ds_region = {};
16689 ds_region.bufferOffset = 0;
16690 ds_region.bufferRowLength = 0;
16691 ds_region.bufferImageHeight = 0;
16692 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16693 ds_region.imageSubresource.mipLevel = 0;
16694 ds_region.imageSubresource.baseArrayLayer = 0;
16695 ds_region.imageSubresource.layerCount = 1;
16696 ds_region.imageOffset = {0, 0, 0};
16697 ds_region.imageExtent = {256, 256, 1};
16698
16699 // Depth copies that should succeed
16700 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16701 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16702 buffer_256k.handle(), 1, &ds_region);
16703 m_errorMonitor->VerifyNotFound();
16704
16705 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16706 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16707 buffer_256k.handle(), 1, &ds_region);
16708 m_errorMonitor->VerifyNotFound();
16709
16710 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16711 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16712 buffer_128k.handle(), 1, &ds_region);
16713 m_errorMonitor->VerifyNotFound();
16714
16715 // Depth copies that should fail
16716 ds_region.bufferOffset = 4;
16717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16718 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16719 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16720 buffer_256k.handle(), 1, &ds_region);
16721 m_errorMonitor->VerifyFound();
16722
16723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16724 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16725 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16726 buffer_256k.handle(), 1, &ds_region);
16727 m_errorMonitor->VerifyFound();
16728
16729 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16730 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16731 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16732 buffer_128k.handle(), 1, &ds_region);
16733 m_errorMonitor->VerifyFound();
16734
16735 // Stencil copies that should succeed
16736 ds_region.bufferOffset = 0;
16737 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16738 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16739 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16740 buffer_64k.handle(), 1, &ds_region);
16741 m_errorMonitor->VerifyNotFound();
16742
16743 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16744 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16745 buffer_64k.handle(), 1, &ds_region);
16746 m_errorMonitor->VerifyNotFound();
16747
16748 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16749 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16750 buffer_64k.handle(), 1, &ds_region);
16751 m_errorMonitor->VerifyNotFound();
16752
16753 // Stencil copies that should fail
16754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16755 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16756 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16757 buffer_16k.handle(), 1, &ds_region);
16758 m_errorMonitor->VerifyFound();
16759
16760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16761 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16762 ds_region.bufferRowLength = 260;
16763 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16764 buffer_64k.handle(), 1, &ds_region);
16765 m_errorMonitor->VerifyFound();
16766
16767 ds_region.bufferRowLength = 0;
16768 ds_region.bufferOffset = 4;
16769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16770 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16771 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16772 buffer_64k.handle(), 1, &ds_region);
16773 m_errorMonitor->VerifyFound();
16774 }
16775
Dave Houlton584d51e2017-02-16 12:52:54 -070016776 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016777 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016778 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016779 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16780 device_features.textureCompressionASTC_LDR)) {
16781 printf(" No compressed formats supported - block compression tests skipped.\n");
16782 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016783 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16784 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016785 if (device_features.textureCompressionBC) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016786 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16787 0);
16788 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 -070016789 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016790 } else if (device_features.textureCompressionETC2) {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016791 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 -070016792 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016793 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 -070016794 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016795 } else {
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016796 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 -070016797 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016798 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 -070016799 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016800 }
16801 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016802
Dave Houlton584d51e2017-02-16 12:52:54 -070016803 // Just fits
16804 m_errorMonitor->ExpectSuccess();
16805 region.imageExtent = {128, 128, 1};
16806 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16807 buffer_16k.handle(), 1, &region);
16808 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016809
Dave Houlton584d51e2017-02-16 12:52:54 -070016810 // with offset, too big for buffer
16811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16812 region.bufferOffset = 16;
16813 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16814 buffer_16k.handle(), 1, &region);
16815 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016816 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016817
Dave Houlton67e9b532017-03-02 17:00:10 -070016818 // extents that are not a multiple of compressed block size
16819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16820 region.imageExtent.width = 66;
16821 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16822 buffer_16k.handle(), 1, &region);
16823 m_errorMonitor->VerifyFound();
16824 region.imageExtent.width = 128;
16825
16826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016827 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016828 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16829 buffer_16k.handle(), 1, &region);
16830 m_errorMonitor->VerifyFound();
16831 region.imageExtent.height = 128;
16832
16833 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16834
16835 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16836 m_errorMonitor->ExpectSuccess();
16837 region.imageExtent.width = 66;
16838 region.imageOffset.x = 64;
16839 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16840 buffer_16k.handle(), 1, &region);
16841 region.imageExtent.width = 16;
16842 region.imageOffset.x = 0;
16843 region.imageExtent.height = 2;
16844 region.imageOffset.y = 128;
16845 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016846 buffer_16k.handle(), 1, &region);
16847 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016848 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016849
Dave Houlton584d51e2017-02-16 12:52:54 -070016850 // buffer offset must be a multiple of texel block size (16)
16851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16853 region.imageExtent = {64, 64, 1};
16854 region.bufferOffset = 24;
16855 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16856 buffer_16k.handle(), 1, &region);
16857 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016858
Dave Houlton584d51e2017-02-16 12:52:54 -070016859 // rowlength not a multiple of block width (4)
16860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16861 region.bufferOffset = 0;
16862 region.bufferRowLength = 130;
16863 region.bufferImageHeight = 0;
16864 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16865 buffer_64k.handle(), 1, &region);
16866 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016867
Dave Houlton584d51e2017-02-16 12:52:54 -070016868 // imageheight not a multiple of block height (4)
16869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16870 region.bufferRowLength = 0;
16871 region.bufferImageHeight = 130;
16872 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16873 buffer_64k.handle(), 1, &region);
16874 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016875 }
Dave Houlton59a20702017-02-02 17:26:23 -070016876}
16877
Tony Barbourd6673642016-05-05 14:46:39 -060016878TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016879 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016880
Tony Barbour1fa09702017-03-16 12:09:08 -060016881 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016882
Rene Lindsay135204f2016-12-22 17:11:09 -070016883 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016884 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016885 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 -070016886 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016887 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016888 vk_testing::Buffer buffer;
16889 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016890 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016891 VkBufferImageCopy region = {};
16892 region.bufferRowLength = 128;
16893 region.bufferImageHeight = 128;
16894 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16895 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016896 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016897 region.imageExtent.height = 4;
16898 region.imageExtent.width = 4;
16899 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016900
16901 VkImageObj image2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016902 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 -070016903 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016904 ASSERT_TRUE(image2.initialized());
16905 vk_testing::Buffer buffer2;
16906 VkMemoryPropertyFlags reqs2 = 0;
16907 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16908 VkBufferImageCopy region2 = {};
16909 region2.bufferRowLength = 128;
16910 region2.bufferImageHeight = 128;
16911 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16912 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16913 region2.imageSubresource.layerCount = 1;
16914 region2.imageExtent.height = 4;
16915 region2.imageExtent.width = 4;
16916 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016917 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016918
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016919 // Image must have offset.z of 0 and extent.depth of 1
16920 // Introduce failure by setting imageExtent.depth to 0
16921 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016923 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016924 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016925 m_errorMonitor->VerifyFound();
16926
16927 region.imageExtent.depth = 1;
16928
16929 // Image must have offset.z of 0 and extent.depth of 1
16930 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016931 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016932 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016935 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016936 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016937 m_errorMonitor->VerifyFound();
16938
16939 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016940 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16941 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016942 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016944 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16945 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016946 m_errorMonitor->VerifyFound();
16947
16948 // BufferOffset must be a multiple of 4
16949 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016950 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016952 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16953 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016954 m_errorMonitor->VerifyFound();
16955
16956 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16957 region.bufferOffset = 0;
16958 region.imageExtent.height = 128;
16959 region.imageExtent.width = 128;
16960 // Introduce failure by setting bufferRowLength > 0 but less than width
16961 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016963 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16964 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016965 m_errorMonitor->VerifyFound();
16966
16967 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16968 region.bufferRowLength = 128;
16969 // Introduce failure by setting bufferRowHeight > 0 but less than height
16970 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016972 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16973 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016974 m_errorMonitor->VerifyFound();
16975
16976 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016977 VkImageObj intImage1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016978 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 -070016979 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016980 VkImageObj intImage2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016981 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 -070016982 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016983 VkImageBlit blitRegion = {};
16984 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16985 blitRegion.srcSubresource.baseArrayLayer = 0;
16986 blitRegion.srcSubresource.layerCount = 1;
16987 blitRegion.srcSubresource.mipLevel = 0;
16988 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16989 blitRegion.dstSubresource.baseArrayLayer = 0;
16990 blitRegion.dstSubresource.layerCount = 1;
16991 blitRegion.dstSubresource.mipLevel = 0;
16992
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016993 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16995 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16997 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060016998 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(),
16999 intImage2.Layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060017000 m_errorMonitor->VerifyFound();
17001
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070017002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060017003 VkImageMemoryBarrier img_barrier;
17004 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
17005 img_barrier.pNext = NULL;
17006 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
17007 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
17008 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17009 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17010 img_barrier.image = image.handle();
17011 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17012 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
17013 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17014 img_barrier.subresourceRange.baseArrayLayer = 0;
17015 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060017016 img_barrier.subresourceRange.layerCount = 0;
17017 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017018 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
17019 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060017020 m_errorMonitor->VerifyFound();
17021 img_barrier.subresourceRange.layerCount = 1;
17022}
17023
17024TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060017025 TEST_DESCRIPTION("Exceed the limits of image format ");
17026
Tony Barbour1fa09702017-03-16 12:09:08 -060017027 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017028
17029 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
17030 {
17031 VkFormatProperties properties;
17032 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
17033 if (properties.linearTilingFeatures == 0) {
17034 printf(" Image format not supported; skipped.\n");
17035 return;
17036 }
17037 }
17038
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060017040 VkImageCreateInfo image_create_info = {};
17041 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17042 image_create_info.pNext = NULL;
17043 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060017044 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060017045 image_create_info.extent.width = 32;
17046 image_create_info.extent.height = 32;
17047 image_create_info.extent.depth = 1;
17048 image_create_info.mipLevels = 1;
17049 image_create_info.arrayLayers = 1;
17050 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17051 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17052 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17053 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17054 image_create_info.flags = 0;
17055
17056 VkImage nullImg;
17057 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017058 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
17059 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070017060 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017061 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17062 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17063 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070017064 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060017065
Tony Barbour0907e362017-03-09 15:05:30 -070017066 uint32_t maxDim =
17067 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
17068 // If max mip levels exceeds image extents, skip the max mip levels test
17069 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
17070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
17071 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
17072 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17073 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17074 m_errorMonitor->VerifyFound();
17075 image_create_info.mipLevels = 1;
17076 }
Tony Barbourd6673642016-05-05 14:46:39 -060017077
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060017079 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
17080 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17081 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17082 m_errorMonitor->VerifyFound();
17083 image_create_info.arrayLayers = 1;
17084
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060017086 int samples = imgFmtProps.sampleCounts >> 1;
17087 image_create_info.samples = (VkSampleCountFlagBits)samples;
17088 // Expect INVALID_FORMAT_LIMITS_VIOLATION
17089 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17090 m_errorMonitor->VerifyFound();
17091 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17092
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17094 "pCreateInfo->initialLayout, must be "
17095 "VK_IMAGE_LAYOUT_UNDEFINED or "
17096 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060017097 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
17098 // Expect INVALID_LAYOUT
17099 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
17100 m_errorMonitor->VerifyFound();
17101 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17102}
17103
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017104TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017105 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017107
Tony Barbour1fa09702017-03-16 12:09:08 -060017108 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017109
17110 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017111 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 -060017112 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017113 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 -060017114
Tony Barbour552f6c02016-12-21 14:34:07 -070017115 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017116 VkImageCopy copy_region;
17117 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17118 copy_region.srcSubresource.mipLevel = 0;
17119 copy_region.srcSubresource.baseArrayLayer = 0;
17120 copy_region.srcSubresource.layerCount = 0;
17121 copy_region.srcOffset.x = 0;
17122 copy_region.srcOffset.y = 0;
17123 copy_region.srcOffset.z = 0;
17124 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17125 copy_region.dstSubresource.mipLevel = 0;
17126 copy_region.dstSubresource.baseArrayLayer = 0;
17127 copy_region.dstSubresource.layerCount = 0;
17128 copy_region.dstOffset.x = 0;
17129 copy_region.dstOffset.y = 0;
17130 copy_region.dstOffset.z = 0;
17131 copy_region.extent.width = 64;
17132 copy_region.extent.height = 64;
17133 copy_region.extent.depth = 1;
17134 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17135 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017136 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017137
17138 m_errorMonitor->VerifyFound();
17139}
17140
17141TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017142 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060017143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017144
Tony Barbour1fa09702017-03-16 12:09:08 -060017145 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017146
17147 VkImageObj src_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017148 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 -060017149 VkImageObj dst_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017150 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 -060017151
Tony Barbour552f6c02016-12-21 14:34:07 -070017152 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017153 VkImageCopy copy_region;
17154 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17155 copy_region.srcSubresource.mipLevel = 0;
17156 copy_region.srcSubresource.baseArrayLayer = 0;
17157 copy_region.srcSubresource.layerCount = 0;
17158 copy_region.srcOffset.x = 0;
17159 copy_region.srcOffset.y = 0;
17160 copy_region.srcOffset.z = 0;
17161 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17162 copy_region.dstSubresource.mipLevel = 0;
17163 copy_region.dstSubresource.baseArrayLayer = 0;
17164 copy_region.dstSubresource.layerCount = 0;
17165 copy_region.dstOffset.x = 0;
17166 copy_region.dstOffset.y = 0;
17167 copy_region.dstOffset.z = 0;
17168 copy_region.extent.width = 64;
17169 copy_region.extent.height = 64;
17170 copy_region.extent.depth = 1;
17171 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
17172 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070017173 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060017174
17175 m_errorMonitor->VerifyFound();
17176}
17177
Karl Schultz6addd812016-02-02 17:17:23 -070017178TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060017179 VkResult err;
17180 bool pass;
17181
17182 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070017183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060017184
Tony Barbour1fa09702017-03-16 12:09:08 -060017185 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060017186
17187 // Create two images of different types and try to copy between them
17188 VkImage srcImage;
17189 VkImage dstImage;
17190 VkDeviceMemory srcMem;
17191 VkDeviceMemory destMem;
17192 VkMemoryRequirements memReqs;
17193
17194 VkImageCreateInfo image_create_info = {};
17195 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17196 image_create_info.pNext = NULL;
17197 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17198 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17199 image_create_info.extent.width = 32;
17200 image_create_info.extent.height = 32;
17201 image_create_info.extent.depth = 1;
17202 image_create_info.mipLevels = 1;
17203 image_create_info.arrayLayers = 1;
17204 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17205 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17206 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17207 image_create_info.flags = 0;
17208
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017209 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017210 ASSERT_VK_SUCCESS(err);
17211
17212 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17213 // Introduce failure by creating second image with a different-sized format.
17214 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017215 VkFormatProperties properties;
17216 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17217 if (properties.optimalTilingFeatures == 0) {
17218 printf(" Image format not supported; skipped.\n");
17219 return;
17220 }
Karl Schultzbdb75952016-04-19 11:36:49 -060017221
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017222 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017223 ASSERT_VK_SUCCESS(err);
17224
17225 // Allocate memory
17226 VkMemoryAllocateInfo memAlloc = {};
17227 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17228 memAlloc.pNext = NULL;
17229 memAlloc.allocationSize = 0;
17230 memAlloc.memoryTypeIndex = 0;
17231
17232 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17233 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017234 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017235 ASSERT_TRUE(pass);
17236 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17237 ASSERT_VK_SUCCESS(err);
17238
17239 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17240 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017241 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017242 ASSERT_TRUE(pass);
17243 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17244 ASSERT_VK_SUCCESS(err);
17245
17246 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17247 ASSERT_VK_SUCCESS(err);
17248 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17249 ASSERT_VK_SUCCESS(err);
17250
Tony Barbour552f6c02016-12-21 14:34:07 -070017251 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017252 VkImageCopy copyRegion;
17253 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17254 copyRegion.srcSubresource.mipLevel = 0;
17255 copyRegion.srcSubresource.baseArrayLayer = 0;
17256 copyRegion.srcSubresource.layerCount = 0;
17257 copyRegion.srcOffset.x = 0;
17258 copyRegion.srcOffset.y = 0;
17259 copyRegion.srcOffset.z = 0;
17260 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17261 copyRegion.dstSubresource.mipLevel = 0;
17262 copyRegion.dstSubresource.baseArrayLayer = 0;
17263 copyRegion.dstSubresource.layerCount = 0;
17264 copyRegion.dstOffset.x = 0;
17265 copyRegion.dstOffset.y = 0;
17266 copyRegion.dstOffset.z = 0;
17267 copyRegion.extent.width = 1;
17268 copyRegion.extent.height = 1;
17269 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017270 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017271 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017272
17273 m_errorMonitor->VerifyFound();
17274
17275 vkDestroyImage(m_device->device(), srcImage, NULL);
17276 vkDestroyImage(m_device->device(), dstImage, NULL);
17277 vkFreeMemory(m_device->device(), srcMem, NULL);
17278 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017279}
17280
Karl Schultz6addd812016-02-02 17:17:23 -070017281TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17282 VkResult err;
17283 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017284
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017285 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17287 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017288
Tony Barbour1fa09702017-03-16 12:09:08 -060017289 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017290 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017291 if (!depth_format) {
17292 return;
17293 }
Mike Stroyana3082432015-09-25 13:39:21 -060017294
17295 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017296 VkImage srcImage;
17297 VkImage dstImage;
17298 VkDeviceMemory srcMem;
17299 VkDeviceMemory destMem;
17300 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017301
17302 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017303 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17304 image_create_info.pNext = NULL;
17305 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017306 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017307 image_create_info.extent.width = 32;
17308 image_create_info.extent.height = 32;
17309 image_create_info.extent.depth = 1;
17310 image_create_info.mipLevels = 1;
17311 image_create_info.arrayLayers = 1;
17312 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Youngad61f4b2017-04-07 08:59:56 -060017313 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -070017314 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17315 image_create_info.flags = 0;
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017316 VkFormatProperties properties;
17317 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
17318 if (properties.optimalTilingFeatures == 0) {
17319 printf(" Image format not supported; skipped.\n");
17320 return;
17321 }
Mike Stroyana3082432015-09-25 13:39:21 -060017322
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017323 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017324 ASSERT_VK_SUCCESS(err);
17325
Karl Schultzbdb75952016-04-19 11:36:49 -060017326 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17327
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017328 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017329 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017330 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017331 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017333 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017334 ASSERT_VK_SUCCESS(err);
17335
17336 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017337 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017338 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17339 memAlloc.pNext = NULL;
17340 memAlloc.allocationSize = 0;
17341 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017342
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017343 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017344 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017345 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017346 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017347 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017348 ASSERT_VK_SUCCESS(err);
17349
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017350 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017351 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017352 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017353 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017354 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017355 ASSERT_VK_SUCCESS(err);
17356
17357 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17358 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017359 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017360 ASSERT_VK_SUCCESS(err);
17361
Tony Barbour552f6c02016-12-21 14:34:07 -070017362 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017363 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017364 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017365 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017366 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017367 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017368 copyRegion.srcOffset.x = 0;
17369 copyRegion.srcOffset.y = 0;
17370 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017371 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017372 copyRegion.dstSubresource.mipLevel = 0;
17373 copyRegion.dstSubresource.baseArrayLayer = 0;
17374 copyRegion.dstSubresource.layerCount = 0;
17375 copyRegion.dstOffset.x = 0;
17376 copyRegion.dstOffset.y = 0;
17377 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017378 copyRegion.extent.width = 1;
17379 copyRegion.extent.height = 1;
17380 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017381 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017382 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017383
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017384 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017385
Chia-I Wuf7458c52015-10-26 21:10:41 +080017386 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017387 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017388 vkFreeMemory(m_device->device(), srcMem, NULL);
17389 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017390}
17391
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017392TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17393 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017394
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017395 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017396
17397 VkImageFormatProperties image_format_properties;
17398 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17399 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17400 &image_format_properties);
17401
17402 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17403 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17404 printf(" Image multi-sample support not found; skipped.\n");
17405 return;
17406 }
17407
17408 VkImageCreateInfo ci;
17409 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17410 ci.pNext = NULL;
17411 ci.flags = 0;
17412 ci.imageType = VK_IMAGE_TYPE_2D;
17413 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17414 ci.extent = {128, 128, 1};
17415 ci.mipLevels = 1;
17416 ci.arrayLayers = 1;
17417 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17418 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17419 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17420 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17421 ci.queueFamilyIndexCount = 0;
17422 ci.pQueueFamilyIndices = NULL;
17423 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17424
17425 VkImageObj image1(m_device);
17426 image1.init(&ci);
17427 ASSERT_TRUE(image1.initialized());
17428
17429 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17430 VkImageObj image2(m_device);
17431 image2.init(&ci);
17432 ASSERT_TRUE(image2.initialized());
17433
17434 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17435 VkImageObj image4(m_device);
17436 image4.init(&ci);
17437 ASSERT_TRUE(image4.initialized());
17438
17439 m_commandBuffer->BeginCommandBuffer();
17440
17441 VkImageCopy copyRegion;
17442 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17443 copyRegion.srcSubresource.mipLevel = 0;
17444 copyRegion.srcSubresource.baseArrayLayer = 0;
17445 copyRegion.srcSubresource.layerCount = 1;
17446 copyRegion.srcOffset = {0, 0, 0};
17447 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17448 copyRegion.dstSubresource.mipLevel = 0;
17449 copyRegion.dstSubresource.baseArrayLayer = 0;
17450 copyRegion.dstSubresource.layerCount = 1;
17451 copyRegion.dstOffset = {0, 0, 0};
17452 copyRegion.extent = {128, 128, 1};
17453
17454 // Copy a single sample image to/from a multi-sample image
17455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17456 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17457 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17458 m_errorMonitor->VerifyFound();
17459
17460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17461 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17462 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17463 m_errorMonitor->VerifyFound();
17464
17465 // Copy between multi-sample images with different sample counts
17466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17467 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17468 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17469 m_errorMonitor->VerifyFound();
17470
17471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17472 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17473 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17474 m_errorMonitor->VerifyFound();
17475
17476 m_commandBuffer->EndCommandBuffer();
17477}
17478
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017479TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17480 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017481 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017482 auto ds_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017483 if (!ds_format) {
17484 return;
17485 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017486
Tobin Ehlis6d4d1d52017-04-05 12:06:10 -060017487 VkFormatProperties properties;
17488 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
17489 if (properties.optimalTilingFeatures == 0) {
17490 printf(" Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n");
17491 return;
17492 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017493 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017494 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
Mark Youngad61f4b2017-04-07 08:59:56 -060017495 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17496 VK_IMAGE_TILING_OPTIMAL, 0);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060017497 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
17498 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017499 ASSERT_TRUE(color_image.initialized());
17500 ASSERT_TRUE(depth_image.initialized());
17501 ASSERT_TRUE(ds_image.initialized());
17502
17503 VkImageCopy copyRegion;
17504 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17505 copyRegion.srcSubresource.mipLevel = 0;
17506 copyRegion.srcSubresource.baseArrayLayer = 0;
17507 copyRegion.srcSubresource.layerCount = 1;
17508 copyRegion.srcOffset = {0, 0, 0};
17509 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17510 copyRegion.dstSubresource.mipLevel = 0;
17511 copyRegion.dstSubresource.baseArrayLayer = 0;
17512 copyRegion.dstSubresource.layerCount = 1;
17513 copyRegion.dstOffset = {64, 0, 0};
17514 copyRegion.extent = {64, 128, 1};
17515
17516 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17518 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17519 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17520 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017521 m_errorMonitor->VerifyFound();
17522
17523 m_commandBuffer->BeginCommandBuffer();
17524
17525 // Src and dest aspect masks don't match
17526 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17527 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017528 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17529 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017530 m_errorMonitor->VerifyFound();
17531 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17532
17533 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017534 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017535 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17537 // These aspect/format mismatches are redundant but unavoidable here
17538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017540 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17541 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017542 m_errorMonitor->VerifyFound();
17543 // Metadata aspect is illegal - VU 01222
17544 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17545 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17547 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017548 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17549 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017550 m_errorMonitor->VerifyFound();
17551
17552 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17553 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17554
17555 // Aspect mask doesn't match source image format - VU 01200
17556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17557 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17559 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17560 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17561 m_errorMonitor->VerifyFound();
17562
17563 // Aspect mask doesn't match dest image format - VU 01201
17564 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17565 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17566 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17567 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17569 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17570 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17571 m_errorMonitor->VerifyFound();
17572
17573 m_commandBuffer->EndCommandBuffer();
17574}
17575
Karl Schultz6addd812016-02-02 17:17:23 -070017576TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17577 VkResult err;
17578 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017579
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17581 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017582
Tony Barbour1fa09702017-03-16 12:09:08 -060017583 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017584
17585 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017586 VkImage srcImage;
17587 VkImage dstImage;
17588 VkDeviceMemory srcMem;
17589 VkDeviceMemory destMem;
17590 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017591
17592 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017593 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17594 image_create_info.pNext = NULL;
17595 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17596 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17597 image_create_info.extent.width = 32;
17598 image_create_info.extent.height = 1;
17599 image_create_info.extent.depth = 1;
17600 image_create_info.mipLevels = 1;
17601 image_create_info.arrayLayers = 1;
17602 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17603 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17604 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17605 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017606
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017607 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017608 ASSERT_VK_SUCCESS(err);
17609
Karl Schultz6addd812016-02-02 17:17:23 -070017610 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017611
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017612 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017613 ASSERT_VK_SUCCESS(err);
17614
17615 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017616 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017617 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17618 memAlloc.pNext = NULL;
17619 memAlloc.allocationSize = 0;
17620 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017621
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017622 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017623 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017624 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017625 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017626 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017627 ASSERT_VK_SUCCESS(err);
17628
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017629 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017630 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017631 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017632 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017633 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017634 ASSERT_VK_SUCCESS(err);
17635
17636 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17637 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017638 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017639 ASSERT_VK_SUCCESS(err);
17640
Tony Barbour552f6c02016-12-21 14:34:07 -070017641 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017642 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017643 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17644 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017645 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017646 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017647 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017648 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017649 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017650 resolveRegion.srcOffset.x = 0;
17651 resolveRegion.srcOffset.y = 0;
17652 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017653 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017654 resolveRegion.dstSubresource.mipLevel = 0;
17655 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017656 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017657 resolveRegion.dstOffset.x = 0;
17658 resolveRegion.dstOffset.y = 0;
17659 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017660 resolveRegion.extent.width = 1;
17661 resolveRegion.extent.height = 1;
17662 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017663 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017664 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017665
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017666 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017667
Chia-I Wuf7458c52015-10-26 21:10:41 +080017668 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017669 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017670 vkFreeMemory(m_device->device(), srcMem, NULL);
17671 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017672}
17673
Karl Schultz6addd812016-02-02 17:17:23 -070017674TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17675 VkResult err;
17676 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017677
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17679 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017680
Tony Barbour1fa09702017-03-16 12:09:08 -060017681 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017682
Chris Forbesa7530692016-05-08 12:35:39 +120017683 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017684 VkImage srcImage;
17685 VkImage dstImage;
17686 VkDeviceMemory srcMem;
17687 VkDeviceMemory destMem;
17688 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017689
17690 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017691 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17692 image_create_info.pNext = NULL;
17693 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17694 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17695 image_create_info.extent.width = 32;
17696 image_create_info.extent.height = 1;
17697 image_create_info.extent.depth = 1;
17698 image_create_info.mipLevels = 1;
17699 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017700 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017701 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17702 // Note: Some implementations expect color attachment usage for any
17703 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017704 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017705 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017706
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017707 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017708 ASSERT_VK_SUCCESS(err);
17709
Karl Schultz6addd812016-02-02 17:17:23 -070017710 // Note: Some implementations expect color attachment usage for any
17711 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017712 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017713
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017714 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017715 ASSERT_VK_SUCCESS(err);
17716
17717 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017718 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017719 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17720 memAlloc.pNext = NULL;
17721 memAlloc.allocationSize = 0;
17722 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017723
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017724 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017725 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017726 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017727 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017728 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017729 ASSERT_VK_SUCCESS(err);
17730
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017731 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017732 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017733 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017734 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017735 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017736 ASSERT_VK_SUCCESS(err);
17737
17738 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17739 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017740 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017741 ASSERT_VK_SUCCESS(err);
17742
Tony Barbour552f6c02016-12-21 14:34:07 -070017743 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017744 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017745 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17746 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017747 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017748 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017749 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017750 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017751 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017752 resolveRegion.srcOffset.x = 0;
17753 resolveRegion.srcOffset.y = 0;
17754 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017755 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017756 resolveRegion.dstSubresource.mipLevel = 0;
17757 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017758 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017759 resolveRegion.dstOffset.x = 0;
17760 resolveRegion.dstOffset.y = 0;
17761 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017762 resolveRegion.extent.width = 1;
17763 resolveRegion.extent.height = 1;
17764 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017765 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017766 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017767
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017768 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017769
Chia-I Wuf7458c52015-10-26 21:10:41 +080017770 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017771 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017772 vkFreeMemory(m_device->device(), srcMem, NULL);
17773 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017774}
17775
Karl Schultz6addd812016-02-02 17:17:23 -070017776TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17777 VkResult err;
17778 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017779
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017781 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017782
Tony Barbour1fa09702017-03-16 12:09:08 -060017783 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017784
17785 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017786 VkImage srcImage;
17787 VkImage dstImage;
17788 VkDeviceMemory srcMem;
17789 VkDeviceMemory destMem;
17790 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017791
17792 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017793 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17794 image_create_info.pNext = NULL;
17795 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17796 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17797 image_create_info.extent.width = 32;
17798 image_create_info.extent.height = 1;
17799 image_create_info.extent.depth = 1;
17800 image_create_info.mipLevels = 1;
17801 image_create_info.arrayLayers = 1;
17802 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17803 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17804 // Note: Some implementations expect color attachment usage for any
17805 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017806 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017807 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017808
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017809 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017810 ASSERT_VK_SUCCESS(err);
17811
Karl Schultz6addd812016-02-02 17:17:23 -070017812 // Set format to something other than source image
17813 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17814 // Note: Some implementations expect color attachment usage for any
17815 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017816 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017817 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017818
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017819 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017820 ASSERT_VK_SUCCESS(err);
17821
17822 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017823 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017824 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17825 memAlloc.pNext = NULL;
17826 memAlloc.allocationSize = 0;
17827 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017828
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017829 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017830 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017831 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017832 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017833 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017834 ASSERT_VK_SUCCESS(err);
17835
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017836 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017837 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017838 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017839 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017840 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017841 ASSERT_VK_SUCCESS(err);
17842
17843 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17844 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017845 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017846 ASSERT_VK_SUCCESS(err);
17847
Tony Barbour552f6c02016-12-21 14:34:07 -070017848 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017849 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017850 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17851 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017852 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017853 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017854 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017855 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017856 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017857 resolveRegion.srcOffset.x = 0;
17858 resolveRegion.srcOffset.y = 0;
17859 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017860 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017861 resolveRegion.dstSubresource.mipLevel = 0;
17862 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017863 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017864 resolveRegion.dstOffset.x = 0;
17865 resolveRegion.dstOffset.y = 0;
17866 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017867 resolveRegion.extent.width = 1;
17868 resolveRegion.extent.height = 1;
17869 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017870 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017871 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017872
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017873 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017874
Chia-I Wuf7458c52015-10-26 21:10:41 +080017875 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017876 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017877 vkFreeMemory(m_device->device(), srcMem, NULL);
17878 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017879}
17880
Karl Schultz6addd812016-02-02 17:17:23 -070017881TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17882 VkResult err;
17883 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017884
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017886 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017887
Tony Barbour1fa09702017-03-16 12:09:08 -060017888 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017889
17890 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017891 VkImage srcImage;
17892 VkImage dstImage;
17893 VkDeviceMemory srcMem;
17894 VkDeviceMemory destMem;
17895 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017896
17897 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017898 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17899 image_create_info.pNext = NULL;
17900 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17901 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17902 image_create_info.extent.width = 32;
17903 image_create_info.extent.height = 1;
17904 image_create_info.extent.depth = 1;
17905 image_create_info.mipLevels = 1;
17906 image_create_info.arrayLayers = 1;
17907 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17908 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17909 // Note: Some implementations expect color attachment usage for any
17910 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017911 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017912 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017913
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017914 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017915 ASSERT_VK_SUCCESS(err);
17916
Karl Schultz6addd812016-02-02 17:17:23 -070017917 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17918 // Note: Some implementations expect color attachment usage for any
17919 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017920 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017921 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017923 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017924 ASSERT_VK_SUCCESS(err);
17925
17926 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017927 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017928 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17929 memAlloc.pNext = NULL;
17930 memAlloc.allocationSize = 0;
17931 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017932
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017933 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017934 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017935 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017936 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017937 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017938 ASSERT_VK_SUCCESS(err);
17939
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017940 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017941 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017942 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017943 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017944 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017945 ASSERT_VK_SUCCESS(err);
17946
17947 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17948 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017949 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017950 ASSERT_VK_SUCCESS(err);
17951
Tony Barbour552f6c02016-12-21 14:34:07 -070017952 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017953 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017954 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17955 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017956 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017957 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017958 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017959 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017960 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017961 resolveRegion.srcOffset.x = 0;
17962 resolveRegion.srcOffset.y = 0;
17963 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017964 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017965 resolveRegion.dstSubresource.mipLevel = 0;
17966 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017967 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017968 resolveRegion.dstOffset.x = 0;
17969 resolveRegion.dstOffset.y = 0;
17970 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017971 resolveRegion.extent.width = 1;
17972 resolveRegion.extent.height = 1;
17973 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017974 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017975 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017976
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017977 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017978
Chia-I Wuf7458c52015-10-26 21:10:41 +080017979 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017980 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017981 vkFreeMemory(m_device->device(), srcMem, NULL);
17982 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017983}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017984
Karl Schultz6addd812016-02-02 17:17:23 -070017985TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017986 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017987 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17988 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017989 // The image format check comes 2nd in validation so we trigger it first,
17990 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017991 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017992
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17994 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017995
Tony Barbour1fa09702017-03-16 12:09:08 -060017996 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060017997 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017998 if (!depth_format) {
17999 return;
18000 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018001
Chia-I Wu1b99bb22015-10-27 19:25:11 +080018002 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018003 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18004 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018005
18006 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018007 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18008 ds_pool_ci.pNext = NULL;
18009 ds_pool_ci.maxSets = 1;
18010 ds_pool_ci.poolSizeCount = 1;
18011 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018012
18013 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018014 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018015 ASSERT_VK_SUCCESS(err);
18016
18017 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018018 dsl_binding.binding = 0;
18019 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18020 dsl_binding.descriptorCount = 1;
18021 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18022 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018023
18024 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018025 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18026 ds_layout_ci.pNext = NULL;
18027 ds_layout_ci.bindingCount = 1;
18028 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018029 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018030 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018031 ASSERT_VK_SUCCESS(err);
18032
18033 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080018034 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080018035 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070018036 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018037 alloc_info.descriptorPool = ds_pool;
18038 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018039 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018040 ASSERT_VK_SUCCESS(err);
18041
Karl Schultz6addd812016-02-02 17:17:23 -070018042 VkImage image_bad;
18043 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018044 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070018045 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018046 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070018047 const int32_t tex_width = 32;
18048 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018049
18050 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070018051 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18052 image_create_info.pNext = NULL;
18053 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18054 image_create_info.format = tex_format_bad;
18055 image_create_info.extent.width = tex_width;
18056 image_create_info.extent.height = tex_height;
18057 image_create_info.extent.depth = 1;
18058 image_create_info.mipLevels = 1;
18059 image_create_info.arrayLayers = 1;
18060 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18061 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018062 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070018063 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018064
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018065 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018066 ASSERT_VK_SUCCESS(err);
18067 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018068 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18069 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018070 ASSERT_VK_SUCCESS(err);
18071
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018072 // ---Bind image memory---
18073 VkMemoryRequirements img_mem_reqs;
18074 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
18075 VkMemoryAllocateInfo image_alloc_info = {};
18076 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18077 image_alloc_info.pNext = NULL;
18078 image_alloc_info.memoryTypeIndex = 0;
18079 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018080 bool pass =
18081 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 -070018082 ASSERT_TRUE(pass);
18083 VkDeviceMemory mem;
18084 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
18085 ASSERT_VK_SUCCESS(err);
18086 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
18087 ASSERT_VK_SUCCESS(err);
18088 // -----------------------
18089
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018090 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130018091 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070018092 image_view_create_info.image = image_bad;
18093 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18094 image_view_create_info.format = tex_format_bad;
18095 image_view_create_info.subresourceRange.baseArrayLayer = 0;
18096 image_view_create_info.subresourceRange.baseMipLevel = 0;
18097 image_view_create_info.subresourceRange.layerCount = 1;
18098 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018099 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018100
18101 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018102 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060018103
Chris Forbes8f36a8a2016-04-07 13:21:07 +120018104 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018105
Chia-I Wuf7458c52015-10-26 21:10:41 +080018106 vkDestroyImage(m_device->device(), image_bad, NULL);
18107 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080018108 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18109 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070018110
18111 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060018112}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018113
18114TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018115 TEST_DESCRIPTION(
18116 "Call ClearColorImage w/ a depth|stencil image and "
18117 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018118
Tony Barbour1fa09702017-03-16 12:09:08 -060018119 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018120 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018121 if (!depth_format) {
18122 return;
18123 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018124 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18125
Tony Barbour552f6c02016-12-21 14:34:07 -070018126 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018127
18128 // Color image
18129 VkClearColorValue clear_color;
18130 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
18131 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
18132 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
18133 const int32_t img_width = 32;
18134 const int32_t img_height = 32;
18135 VkImageCreateInfo image_create_info = {};
18136 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18137 image_create_info.pNext = NULL;
18138 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18139 image_create_info.format = color_format;
18140 image_create_info.extent.width = img_width;
18141 image_create_info.extent.height = img_height;
18142 image_create_info.extent.depth = 1;
18143 image_create_info.mipLevels = 1;
18144 image_create_info.arrayLayers = 1;
18145 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18146 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
18147 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18148
18149 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018150 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018152 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018153
18154 // Depth/Stencil image
18155 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018156 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018157 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
18158 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070018159 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018160 ds_image_create_info.extent.width = 64;
18161 ds_image_create_info.extent.height = 64;
18162 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018163 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 -060018164
18165 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018166 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018167
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018168 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 -060018169
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018172 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018173 &color_range);
18174
18175 m_errorMonitor->VerifyFound();
18176
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18178 "vkCmdClearColorImage called with "
18179 "image created without "
18180 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060018181
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070018182 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060018183 &color_range);
18184
18185 m_errorMonitor->VerifyFound();
18186
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018187 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060018188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18189 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018190
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070018191 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
18192 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060018193
18194 m_errorMonitor->VerifyFound();
18195}
Tobin Ehliscde08892015-09-22 10:11:37 -060018196
Mike Schuchardt35fece12017-03-07 14:40:28 -070018197TEST_F(VkLayerTest, CommandQueueFlags) {
18198 TEST_DESCRIPTION(
18199 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
18200 "graphics-only command");
18201
18202 ASSERT_NO_FATAL_FAILURE(Init());
18203
18204 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060018205 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070018206 printf(" Non-graphics queue family not found; skipped.\n");
18207 return;
18208 } else {
18209 // Create command pool on a non-graphics queue
18210 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
18211
18212 // Setup command buffer on pool
18213 VkCommandBufferObj command_buffer(m_device, &command_pool);
18214 command_buffer.BeginCommandBuffer();
18215
18216 // Issue a graphics only command
18217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
18218 VkViewport viewport = {0, 0, 16, 16, 0, 1};
18219 command_buffer.SetViewport(0, 1, &viewport);
18220 m_errorMonitor->VerifyFound();
18221 }
18222}
18223
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018224// WSI Enabled Tests
18225//
Chris Forbes09368e42016-10-13 11:59:22 +130018226#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018227TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
18228
18229#if defined(VK_USE_PLATFORM_XCB_KHR)
18230 VkSurfaceKHR surface = VK_NULL_HANDLE;
18231
18232 VkResult err;
18233 bool pass;
18234 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
18235 VkSwapchainCreateInfoKHR swapchain_create_info = {};
18236 // uint32_t swapchain_image_count = 0;
18237 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
18238 // uint32_t image_index = 0;
18239 // VkPresentInfoKHR present_info = {};
18240
Tony Barbour1fa09702017-03-16 12:09:08 -060018241 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018242
18243 // Use the create function from one of the VK_KHR_*_surface extension in
18244 // order to create a surface, testing all known errors in the process,
18245 // before successfully creating a surface:
18246 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18248 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18249 pass = (err != VK_SUCCESS);
18250 ASSERT_TRUE(pass);
18251 m_errorMonitor->VerifyFound();
18252
18253 // Next, try to create a surface with the wrong
18254 // VkXcbSurfaceCreateInfoKHR::sType:
18255 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18256 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18258 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18259 pass = (err != VK_SUCCESS);
18260 ASSERT_TRUE(pass);
18261 m_errorMonitor->VerifyFound();
18262
18263 // Create a native window, and then correctly create a surface:
18264 xcb_connection_t *connection;
18265 xcb_screen_t *screen;
18266 xcb_window_t xcb_window;
18267 xcb_intern_atom_reply_t *atom_wm_delete_window;
18268
18269 const xcb_setup_t *setup;
18270 xcb_screen_iterator_t iter;
18271 int scr;
18272 uint32_t value_mask, value_list[32];
18273 int width = 1;
18274 int height = 1;
18275
18276 connection = xcb_connect(NULL, &scr);
18277 ASSERT_TRUE(connection != NULL);
18278 setup = xcb_get_setup(connection);
18279 iter = xcb_setup_roots_iterator(setup);
18280 while (scr-- > 0)
18281 xcb_screen_next(&iter);
18282 screen = iter.data;
18283
18284 xcb_window = xcb_generate_id(connection);
18285
18286 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18287 value_list[0] = screen->black_pixel;
18288 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18289
18290 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18291 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18292
18293 /* Magic code that will send notification when window is destroyed */
18294 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18295 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18296
18297 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18298 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18299 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18300 free(reply);
18301
18302 xcb_map_window(connection, xcb_window);
18303
18304 // Force the x/y coordinates to 100,100 results are identical in consecutive
18305 // runs
18306 const uint32_t coords[] = { 100, 100 };
18307 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18308
18309 // Finally, try to correctly create a surface:
18310 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18311 xcb_create_info.pNext = NULL;
18312 xcb_create_info.flags = 0;
18313 xcb_create_info.connection = connection;
18314 xcb_create_info.window = xcb_window;
18315 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18316 pass = (err == VK_SUCCESS);
18317 ASSERT_TRUE(pass);
18318
18319 // Check if surface supports presentation:
18320
18321 // 1st, do so without having queried the queue families:
18322 VkBool32 supported = false;
18323 // TODO: Get the following error to come out:
18324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18325 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18326 "function");
18327 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18328 pass = (err != VK_SUCCESS);
18329 // ASSERT_TRUE(pass);
18330 // m_errorMonitor->VerifyFound();
18331
18332 // Next, query a queue family index that's too large:
18333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18334 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18335 pass = (err != VK_SUCCESS);
18336 ASSERT_TRUE(pass);
18337 m_errorMonitor->VerifyFound();
18338
18339 // Finally, do so correctly:
18340 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18341 // SUPPORTED
18342 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18343 pass = (err == VK_SUCCESS);
18344 ASSERT_TRUE(pass);
18345
18346 // Before proceeding, try to create a swapchain without having called
18347 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18348 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18349 swapchain_create_info.pNext = NULL;
18350 swapchain_create_info.flags = 0;
18351 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18352 swapchain_create_info.surface = surface;
18353 swapchain_create_info.imageArrayLayers = 1;
18354 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18355 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18357 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18358 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18359 pass = (err != VK_SUCCESS);
18360 ASSERT_TRUE(pass);
18361 m_errorMonitor->VerifyFound();
18362
18363 // Get the surface capabilities:
18364 VkSurfaceCapabilitiesKHR surface_capabilities;
18365
18366 // Do so correctly (only error logged by this entrypoint is if the
18367 // extension isn't enabled):
18368 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18369 pass = (err == VK_SUCCESS);
18370 ASSERT_TRUE(pass);
18371
18372 // Get the surface formats:
18373 uint32_t surface_format_count;
18374
18375 // First, try without a pointer to surface_format_count:
18376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18377 "specified as NULL");
18378 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18379 pass = (err == VK_SUCCESS);
18380 ASSERT_TRUE(pass);
18381 m_errorMonitor->VerifyFound();
18382
18383 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18384 // correctly done a 1st try (to get the count):
18385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18386 surface_format_count = 0;
18387 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18388 pass = (err == VK_SUCCESS);
18389 ASSERT_TRUE(pass);
18390 m_errorMonitor->VerifyFound();
18391
18392 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18393 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18394 pass = (err == VK_SUCCESS);
18395 ASSERT_TRUE(pass);
18396
18397 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18398 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18399
18400 // Next, do a 2nd try with surface_format_count being set too high:
18401 surface_format_count += 5;
18402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18403 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18404 pass = (err == VK_SUCCESS);
18405 ASSERT_TRUE(pass);
18406 m_errorMonitor->VerifyFound();
18407
18408 // Finally, do a correct 1st and 2nd try:
18409 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18410 pass = (err == VK_SUCCESS);
18411 ASSERT_TRUE(pass);
18412 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18413 pass = (err == VK_SUCCESS);
18414 ASSERT_TRUE(pass);
18415
18416 // Get the surface present modes:
18417 uint32_t surface_present_mode_count;
18418
18419 // First, try without a pointer to surface_format_count:
18420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18421 "specified as NULL");
18422
18423 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18424 pass = (err == VK_SUCCESS);
18425 ASSERT_TRUE(pass);
18426 m_errorMonitor->VerifyFound();
18427
18428 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18429 // correctly done a 1st try (to get the count):
18430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18431 surface_present_mode_count = 0;
18432 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18433 (VkPresentModeKHR *)&surface_present_mode_count);
18434 pass = (err == VK_SUCCESS);
18435 ASSERT_TRUE(pass);
18436 m_errorMonitor->VerifyFound();
18437
18438 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18439 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18440 pass = (err == VK_SUCCESS);
18441 ASSERT_TRUE(pass);
18442
18443 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18444 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18445
18446 // Next, do a 2nd try with surface_format_count being set too high:
18447 surface_present_mode_count += 5;
18448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18449 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18450 pass = (err == VK_SUCCESS);
18451 ASSERT_TRUE(pass);
18452 m_errorMonitor->VerifyFound();
18453
18454 // Finally, do a correct 1st and 2nd try:
18455 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18456 pass = (err == VK_SUCCESS);
18457 ASSERT_TRUE(pass);
18458 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18459 pass = (err == VK_SUCCESS);
18460 ASSERT_TRUE(pass);
18461
18462 // Create a swapchain:
18463
18464 // First, try without a pointer to swapchain_create_info:
18465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18466 "specified as NULL");
18467
18468 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18469 pass = (err != VK_SUCCESS);
18470 ASSERT_TRUE(pass);
18471 m_errorMonitor->VerifyFound();
18472
18473 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18474 // sType:
18475 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18477
18478 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18479 pass = (err != VK_SUCCESS);
18480 ASSERT_TRUE(pass);
18481 m_errorMonitor->VerifyFound();
18482
18483 // Next, call with a NULL swapchain pointer:
18484 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18485 swapchain_create_info.pNext = NULL;
18486 swapchain_create_info.flags = 0;
18487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18488 "specified as NULL");
18489
18490 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18491 pass = (err != VK_SUCCESS);
18492 ASSERT_TRUE(pass);
18493 m_errorMonitor->VerifyFound();
18494
18495 // TODO: Enhance swapchain layer so that
18496 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18497
18498 // Next, call with a queue family index that's too large:
18499 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18500 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18501 swapchain_create_info.queueFamilyIndexCount = 2;
18502 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18504 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18505 pass = (err != VK_SUCCESS);
18506 ASSERT_TRUE(pass);
18507 m_errorMonitor->VerifyFound();
18508
18509 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18510 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18511 swapchain_create_info.queueFamilyIndexCount = 1;
18512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18513 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18514 "pCreateInfo->pQueueFamilyIndices).");
18515 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18516 pass = (err != VK_SUCCESS);
18517 ASSERT_TRUE(pass);
18518 m_errorMonitor->VerifyFound();
18519
18520 // Next, call with an invalid imageSharingMode:
18521 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18522 swapchain_create_info.queueFamilyIndexCount = 1;
18523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18524 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18525 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18526 pass = (err != VK_SUCCESS);
18527 ASSERT_TRUE(pass);
18528 m_errorMonitor->VerifyFound();
18529 // Fix for the future:
18530 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18531 // SUPPORTED
18532 swapchain_create_info.queueFamilyIndexCount = 0;
18533 queueFamilyIndex[0] = 0;
18534 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18535
18536 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18537 // Get the images from a swapchain:
18538 // Acquire an image from a swapchain:
18539 // Present an image to a swapchain:
18540 // Destroy the swapchain:
18541
18542 // TODOs:
18543 //
18544 // - Try destroying the device without first destroying the swapchain
18545 //
18546 // - Try destroying the device without first destroying the surface
18547 //
18548 // - Try destroying the surface without first destroying the swapchain
18549
18550 // Destroy the surface:
18551 vkDestroySurfaceKHR(instance(), surface, NULL);
18552
18553 // Tear down the window:
18554 xcb_destroy_window(connection, xcb_window);
18555 xcb_disconnect(connection);
18556
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018557#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018558 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018559#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018560}
Chris Forbes09368e42016-10-13 11:59:22 +130018561#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018562
18563//
18564// POSITIVE VALIDATION TESTS
18565//
18566// These tests do not expect to encounter ANY validation errors pass only if this is true
18567
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018568TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18569 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018570 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018571 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18572
18573 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18574 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018575 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018576 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18577 command_buffer_allocate_info.commandBufferCount = 1;
18578
18579 VkCommandBuffer secondary_command_buffer;
18580 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18581 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18582 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18583 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18584 command_buffer_inheritance_info.renderPass = m_renderPass;
18585 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18586
18587 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18588 command_buffer_begin_info.flags =
18589 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18590 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18591
18592 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18593 VkClearAttachment color_attachment;
18594 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18595 color_attachment.clearValue.color.float32[0] = 0;
18596 color_attachment.clearValue.color.float32[1] = 0;
18597 color_attachment.clearValue.color.float32[2] = 0;
18598 color_attachment.clearValue.color.float32[3] = 0;
18599 color_attachment.colorAttachment = 0;
18600 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18601 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18602}
18603
Tobin Ehlise0006882016-11-03 10:14:28 -060018604TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018605 TEST_DESCRIPTION(
18606 "Perform an image layout transition in a secondary command buffer followed "
18607 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018608 VkResult err;
18609 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018610 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060018611 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018612 if (!depth_format) {
18613 return;
18614 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18616 // Allocate a secondary and primary cmd buffer
18617 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18618 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018619 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018620 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18621 command_buffer_allocate_info.commandBufferCount = 1;
18622
18623 VkCommandBuffer secondary_command_buffer;
18624 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18625 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18626 VkCommandBuffer primary_command_buffer;
18627 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18628 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18629 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18630 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18631 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18632 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18633 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18634
18635 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18636 ASSERT_VK_SUCCESS(err);
18637 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060018638 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 -060018639 ASSERT_TRUE(image.initialized());
18640 VkImageMemoryBarrier img_barrier = {};
18641 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18642 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18643 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18644 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18645 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18646 img_barrier.image = image.handle();
18647 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18648 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18649 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18650 img_barrier.subresourceRange.baseArrayLayer = 0;
18651 img_barrier.subresourceRange.baseMipLevel = 0;
18652 img_barrier.subresourceRange.layerCount = 1;
18653 img_barrier.subresourceRange.levelCount = 1;
18654 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18655 0, nullptr, 1, &img_barrier);
18656 err = vkEndCommandBuffer(secondary_command_buffer);
18657 ASSERT_VK_SUCCESS(err);
18658
18659 // Now update primary cmd buffer to execute secondary and transitions image
18660 command_buffer_begin_info.pInheritanceInfo = nullptr;
18661 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18662 ASSERT_VK_SUCCESS(err);
18663 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18664 VkImageMemoryBarrier img_barrier2 = {};
18665 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18666 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18667 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18668 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18669 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18670 img_barrier2.image = image.handle();
18671 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18672 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18673 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18674 img_barrier2.subresourceRange.baseArrayLayer = 0;
18675 img_barrier2.subresourceRange.baseMipLevel = 0;
18676 img_barrier2.subresourceRange.layerCount = 1;
18677 img_barrier2.subresourceRange.levelCount = 1;
18678 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18679 nullptr, 1, &img_barrier2);
18680 err = vkEndCommandBuffer(primary_command_buffer);
18681 ASSERT_VK_SUCCESS(err);
18682 VkSubmitInfo submit_info = {};
18683 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18684 submit_info.commandBufferCount = 1;
18685 submit_info.pCommandBuffers = &primary_command_buffer;
18686 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18687 ASSERT_VK_SUCCESS(err);
18688 m_errorMonitor->VerifyNotFound();
18689 err = vkDeviceWaitIdle(m_device->device());
18690 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018691 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18692 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018693}
18694
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018695// This is a positive test. No failures are expected.
18696TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018697 TEST_DESCRIPTION(
18698 "Ensure that the vkUpdateDescriptorSets validation code "
18699 "is ignoring VkWriteDescriptorSet members that are not "
18700 "related to the descriptor type specified by "
18701 "VkWriteDescriptorSet::descriptorType. Correct "
18702 "validation behavior will result in the test running to "
18703 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018704
18705 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18706
Tony Barbour1fa09702017-03-16 12:09:08 -060018707 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018708
18709 // Image Case
18710 {
18711 m_errorMonitor->ExpectSuccess();
18712
18713 VkImage image;
18714 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18715 const int32_t tex_width = 32;
18716 const int32_t tex_height = 32;
18717 VkImageCreateInfo image_create_info = {};
18718 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18719 image_create_info.pNext = NULL;
18720 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18721 image_create_info.format = tex_format;
18722 image_create_info.extent.width = tex_width;
18723 image_create_info.extent.height = tex_height;
18724 image_create_info.extent.depth = 1;
18725 image_create_info.mipLevels = 1;
18726 image_create_info.arrayLayers = 1;
18727 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18728 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18729 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18730 image_create_info.flags = 0;
18731 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18732 ASSERT_VK_SUCCESS(err);
18733
18734 VkMemoryRequirements memory_reqs;
18735 VkDeviceMemory image_memory;
18736 bool pass;
18737 VkMemoryAllocateInfo memory_info = {};
18738 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18739 memory_info.pNext = NULL;
18740 memory_info.allocationSize = 0;
18741 memory_info.memoryTypeIndex = 0;
18742 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18743 memory_info.allocationSize = memory_reqs.size;
18744 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18745 ASSERT_TRUE(pass);
18746 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18747 ASSERT_VK_SUCCESS(err);
18748 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18749 ASSERT_VK_SUCCESS(err);
18750
18751 VkImageViewCreateInfo image_view_create_info = {};
18752 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18753 image_view_create_info.image = image;
18754 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18755 image_view_create_info.format = tex_format;
18756 image_view_create_info.subresourceRange.layerCount = 1;
18757 image_view_create_info.subresourceRange.baseMipLevel = 0;
18758 image_view_create_info.subresourceRange.levelCount = 1;
18759 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18760
18761 VkImageView view;
18762 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18763 ASSERT_VK_SUCCESS(err);
18764
18765 VkDescriptorPoolSize ds_type_count = {};
18766 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18767 ds_type_count.descriptorCount = 1;
18768
18769 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18770 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18771 ds_pool_ci.pNext = NULL;
18772 ds_pool_ci.maxSets = 1;
18773 ds_pool_ci.poolSizeCount = 1;
18774 ds_pool_ci.pPoolSizes = &ds_type_count;
18775
18776 VkDescriptorPool ds_pool;
18777 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18778 ASSERT_VK_SUCCESS(err);
18779
18780 VkDescriptorSetLayoutBinding dsl_binding = {};
18781 dsl_binding.binding = 0;
18782 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18783 dsl_binding.descriptorCount = 1;
18784 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18785 dsl_binding.pImmutableSamplers = NULL;
18786
18787 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18788 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18789 ds_layout_ci.pNext = NULL;
18790 ds_layout_ci.bindingCount = 1;
18791 ds_layout_ci.pBindings = &dsl_binding;
18792 VkDescriptorSetLayout ds_layout;
18793 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18794 ASSERT_VK_SUCCESS(err);
18795
18796 VkDescriptorSet descriptor_set;
18797 VkDescriptorSetAllocateInfo alloc_info = {};
18798 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18799 alloc_info.descriptorSetCount = 1;
18800 alloc_info.descriptorPool = ds_pool;
18801 alloc_info.pSetLayouts = &ds_layout;
18802 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18803 ASSERT_VK_SUCCESS(err);
18804
18805 VkDescriptorImageInfo image_info = {};
18806 image_info.imageView = view;
18807 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18808
18809 VkWriteDescriptorSet descriptor_write;
18810 memset(&descriptor_write, 0, sizeof(descriptor_write));
18811 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18812 descriptor_write.dstSet = descriptor_set;
18813 descriptor_write.dstBinding = 0;
18814 descriptor_write.descriptorCount = 1;
18815 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18816 descriptor_write.pImageInfo = &image_info;
18817
18818 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18819 // be
18820 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18821 // This will most likely produce a crash if the parameter_validation
18822 // layer
18823 // does not correctly ignore pBufferInfo.
18824 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18825 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18826
18827 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18828
18829 m_errorMonitor->VerifyNotFound();
18830
18831 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18832 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18833 vkDestroyImageView(m_device->device(), view, NULL);
18834 vkDestroyImage(m_device->device(), image, NULL);
18835 vkFreeMemory(m_device->device(), image_memory, NULL);
18836 }
18837
18838 // Buffer Case
18839 {
18840 m_errorMonitor->ExpectSuccess();
18841
18842 VkBuffer buffer;
18843 uint32_t queue_family_index = 0;
18844 VkBufferCreateInfo buffer_create_info = {};
18845 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18846 buffer_create_info.size = 1024;
18847 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18848 buffer_create_info.queueFamilyIndexCount = 1;
18849 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18850
18851 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18852 ASSERT_VK_SUCCESS(err);
18853
18854 VkMemoryRequirements memory_reqs;
18855 VkDeviceMemory buffer_memory;
18856 bool pass;
18857 VkMemoryAllocateInfo memory_info = {};
18858 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18859 memory_info.pNext = NULL;
18860 memory_info.allocationSize = 0;
18861 memory_info.memoryTypeIndex = 0;
18862
18863 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18864 memory_info.allocationSize = memory_reqs.size;
18865 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18866 ASSERT_TRUE(pass);
18867
18868 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18869 ASSERT_VK_SUCCESS(err);
18870 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18871 ASSERT_VK_SUCCESS(err);
18872
18873 VkDescriptorPoolSize ds_type_count = {};
18874 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18875 ds_type_count.descriptorCount = 1;
18876
18877 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18878 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18879 ds_pool_ci.pNext = NULL;
18880 ds_pool_ci.maxSets = 1;
18881 ds_pool_ci.poolSizeCount = 1;
18882 ds_pool_ci.pPoolSizes = &ds_type_count;
18883
18884 VkDescriptorPool ds_pool;
18885 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18886 ASSERT_VK_SUCCESS(err);
18887
18888 VkDescriptorSetLayoutBinding dsl_binding = {};
18889 dsl_binding.binding = 0;
18890 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18891 dsl_binding.descriptorCount = 1;
18892 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18893 dsl_binding.pImmutableSamplers = NULL;
18894
18895 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18896 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18897 ds_layout_ci.pNext = NULL;
18898 ds_layout_ci.bindingCount = 1;
18899 ds_layout_ci.pBindings = &dsl_binding;
18900 VkDescriptorSetLayout ds_layout;
18901 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18902 ASSERT_VK_SUCCESS(err);
18903
18904 VkDescriptorSet descriptor_set;
18905 VkDescriptorSetAllocateInfo alloc_info = {};
18906 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18907 alloc_info.descriptorSetCount = 1;
18908 alloc_info.descriptorPool = ds_pool;
18909 alloc_info.pSetLayouts = &ds_layout;
18910 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18911 ASSERT_VK_SUCCESS(err);
18912
18913 VkDescriptorBufferInfo buffer_info = {};
18914 buffer_info.buffer = buffer;
18915 buffer_info.offset = 0;
18916 buffer_info.range = 1024;
18917
18918 VkWriteDescriptorSet descriptor_write;
18919 memset(&descriptor_write, 0, sizeof(descriptor_write));
18920 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18921 descriptor_write.dstSet = descriptor_set;
18922 descriptor_write.dstBinding = 0;
18923 descriptor_write.descriptorCount = 1;
18924 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18925 descriptor_write.pBufferInfo = &buffer_info;
18926
18927 // Set pImageInfo and pTexelBufferView to invalid values, which should
18928 // be
18929 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18930 // This will most likely produce a crash if the parameter_validation
18931 // layer
18932 // does not correctly ignore pImageInfo.
18933 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18934 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18935
18936 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18937
18938 m_errorMonitor->VerifyNotFound();
18939
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018940 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18941 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18942 vkDestroyBuffer(m_device->device(), buffer, NULL);
18943 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18944 }
18945
18946 // Texel Buffer Case
18947 {
18948 m_errorMonitor->ExpectSuccess();
18949
18950 VkBuffer buffer;
18951 uint32_t queue_family_index = 0;
18952 VkBufferCreateInfo buffer_create_info = {};
18953 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18954 buffer_create_info.size = 1024;
18955 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18956 buffer_create_info.queueFamilyIndexCount = 1;
18957 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18958
18959 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18960 ASSERT_VK_SUCCESS(err);
18961
18962 VkMemoryRequirements memory_reqs;
18963 VkDeviceMemory buffer_memory;
18964 bool pass;
18965 VkMemoryAllocateInfo memory_info = {};
18966 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18967 memory_info.pNext = NULL;
18968 memory_info.allocationSize = 0;
18969 memory_info.memoryTypeIndex = 0;
18970
18971 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18972 memory_info.allocationSize = memory_reqs.size;
18973 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18974 ASSERT_TRUE(pass);
18975
18976 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18977 ASSERT_VK_SUCCESS(err);
18978 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18979 ASSERT_VK_SUCCESS(err);
18980
18981 VkBufferViewCreateInfo buff_view_ci = {};
18982 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18983 buff_view_ci.buffer = buffer;
18984 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18985 buff_view_ci.range = VK_WHOLE_SIZE;
18986 VkBufferView buffer_view;
18987 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18988
18989 VkDescriptorPoolSize ds_type_count = {};
18990 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18991 ds_type_count.descriptorCount = 1;
18992
18993 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18994 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18995 ds_pool_ci.pNext = NULL;
18996 ds_pool_ci.maxSets = 1;
18997 ds_pool_ci.poolSizeCount = 1;
18998 ds_pool_ci.pPoolSizes = &ds_type_count;
18999
19000 VkDescriptorPool ds_pool;
19001 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19002 ASSERT_VK_SUCCESS(err);
19003
19004 VkDescriptorSetLayoutBinding dsl_binding = {};
19005 dsl_binding.binding = 0;
19006 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19007 dsl_binding.descriptorCount = 1;
19008 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
19009 dsl_binding.pImmutableSamplers = NULL;
19010
19011 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19012 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19013 ds_layout_ci.pNext = NULL;
19014 ds_layout_ci.bindingCount = 1;
19015 ds_layout_ci.pBindings = &dsl_binding;
19016 VkDescriptorSetLayout ds_layout;
19017 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19018 ASSERT_VK_SUCCESS(err);
19019
19020 VkDescriptorSet descriptor_set;
19021 VkDescriptorSetAllocateInfo alloc_info = {};
19022 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19023 alloc_info.descriptorSetCount = 1;
19024 alloc_info.descriptorPool = ds_pool;
19025 alloc_info.pSetLayouts = &ds_layout;
19026 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19027 ASSERT_VK_SUCCESS(err);
19028
19029 VkWriteDescriptorSet descriptor_write;
19030 memset(&descriptor_write, 0, sizeof(descriptor_write));
19031 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19032 descriptor_write.dstSet = descriptor_set;
19033 descriptor_write.dstBinding = 0;
19034 descriptor_write.descriptorCount = 1;
19035 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
19036 descriptor_write.pTexelBufferView = &buffer_view;
19037
19038 // Set pImageInfo and pBufferInfo to invalid values, which should be
19039 // ignored for descriptorType ==
19040 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
19041 // This will most likely produce a crash if the parameter_validation
19042 // layer
19043 // does not correctly ignore pImageInfo and pBufferInfo.
19044 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
19045 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
19046
19047 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19048
19049 m_errorMonitor->VerifyNotFound();
19050
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019051 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19052 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19053 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
19054 vkDestroyBuffer(m_device->device(), buffer, NULL);
19055 vkFreeMemory(m_device->device(), buffer_memory, NULL);
19056 }
19057}
19058
Tobin Ehlisf7428442016-10-25 07:58:24 -060019059TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
19060 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
19061
Tony Barbour1fa09702017-03-16 12:09:08 -060019062 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060019063 // Create layout where two binding #s are "1"
19064 static const uint32_t NUM_BINDINGS = 3;
19065 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19066 dsl_binding[0].binding = 1;
19067 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19068 dsl_binding[0].descriptorCount = 1;
19069 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19070 dsl_binding[0].pImmutableSamplers = NULL;
19071 dsl_binding[1].binding = 0;
19072 dsl_binding[1].descriptorCount = 1;
19073 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19074 dsl_binding[1].descriptorCount = 1;
19075 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19076 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019077 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060019078 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19079 dsl_binding[2].descriptorCount = 1;
19080 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19081 dsl_binding[2].pImmutableSamplers = NULL;
19082
19083 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19084 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19085 ds_layout_ci.pNext = NULL;
19086 ds_layout_ci.bindingCount = NUM_BINDINGS;
19087 ds_layout_ci.pBindings = dsl_binding;
19088 VkDescriptorSetLayout ds_layout;
19089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
19090 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19091 m_errorMonitor->VerifyFound();
19092}
19093
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019094TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019095 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
19096
Tony Barbour1fa09702017-03-16 12:09:08 -060019097 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019098
Tony Barbour552f6c02016-12-21 14:34:07 -070019099 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019100
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060019101 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
19102
19103 {
19104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
19105 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
19106 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19107 m_errorMonitor->VerifyFound();
19108 }
19109
19110 {
19111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
19112 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
19113 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19114 m_errorMonitor->VerifyFound();
19115 }
19116
19117 {
19118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19119 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
19120 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19121 m_errorMonitor->VerifyFound();
19122 }
19123
19124 {
19125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
19126 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
19127 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19128 m_errorMonitor->VerifyFound();
19129 }
19130
19131 {
19132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
19133 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
19134 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19135 m_errorMonitor->VerifyFound();
19136 }
19137
19138 {
19139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
19140 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
19141 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
19142 m_errorMonitor->VerifyFound();
19143 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019144
19145 {
19146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19147 VkRect2D scissor = {{-1, 0}, {16, 16}};
19148 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19149 m_errorMonitor->VerifyFound();
19150 }
19151
19152 {
19153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
19154 VkRect2D scissor = {{0, -2}, {16, 16}};
19155 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19156 m_errorMonitor->VerifyFound();
19157 }
19158
19159 {
19160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
19161 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
19162 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19163 m_errorMonitor->VerifyFound();
19164 }
19165
19166 {
19167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
19168 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
19169 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
19170 m_errorMonitor->VerifyFound();
19171 }
19172
Tony Barbour552f6c02016-12-21 14:34:07 -070019173 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060019174}
19175
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019176// This is a positive test. No failures are expected.
19177TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
19178 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
19179 VkResult err;
19180
Tony Barbour1fa09702017-03-16 12:09:08 -060019181 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019182 m_errorMonitor->ExpectSuccess();
19183 VkDescriptorPoolSize ds_type_count = {};
19184 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19185 ds_type_count.descriptorCount = 2;
19186
19187 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19188 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19189 ds_pool_ci.pNext = NULL;
19190 ds_pool_ci.maxSets = 1;
19191 ds_pool_ci.poolSizeCount = 1;
19192 ds_pool_ci.pPoolSizes = &ds_type_count;
19193
19194 VkDescriptorPool ds_pool;
19195 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19196 ASSERT_VK_SUCCESS(err);
19197
19198 // Create layout with two uniform buffer descriptors w/ empty binding between them
19199 static const uint32_t NUM_BINDINGS = 3;
19200 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
19201 dsl_binding[0].binding = 0;
19202 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19203 dsl_binding[0].descriptorCount = 1;
19204 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
19205 dsl_binding[0].pImmutableSamplers = NULL;
19206 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019207 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019208 dsl_binding[2].binding = 2;
19209 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19210 dsl_binding[2].descriptorCount = 1;
19211 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
19212 dsl_binding[2].pImmutableSamplers = NULL;
19213
19214 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19215 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19216 ds_layout_ci.pNext = NULL;
19217 ds_layout_ci.bindingCount = NUM_BINDINGS;
19218 ds_layout_ci.pBindings = dsl_binding;
19219 VkDescriptorSetLayout ds_layout;
19220 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19221 ASSERT_VK_SUCCESS(err);
19222
19223 VkDescriptorSet descriptor_set = {};
19224 VkDescriptorSetAllocateInfo alloc_info = {};
19225 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19226 alloc_info.descriptorSetCount = 1;
19227 alloc_info.descriptorPool = ds_pool;
19228 alloc_info.pSetLayouts = &ds_layout;
19229 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19230 ASSERT_VK_SUCCESS(err);
19231
19232 // Create a buffer to be used for update
19233 VkBufferCreateInfo buff_ci = {};
19234 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19235 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19236 buff_ci.size = 256;
19237 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19238 VkBuffer buffer;
19239 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19240 ASSERT_VK_SUCCESS(err);
19241 // Have to bind memory to buffer before descriptor update
19242 VkMemoryAllocateInfo mem_alloc = {};
19243 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19244 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019245 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019246 mem_alloc.memoryTypeIndex = 0;
19247
19248 VkMemoryRequirements mem_reqs;
19249 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19250 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19251 if (!pass) {
19252 vkDestroyBuffer(m_device->device(), buffer, NULL);
19253 return;
19254 }
19255
19256 VkDeviceMemory mem;
19257 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19258 ASSERT_VK_SUCCESS(err);
19259 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19260 ASSERT_VK_SUCCESS(err);
19261
19262 // Only update the descriptor at binding 2
19263 VkDescriptorBufferInfo buff_info = {};
19264 buff_info.buffer = buffer;
19265 buff_info.offset = 0;
19266 buff_info.range = VK_WHOLE_SIZE;
19267 VkWriteDescriptorSet descriptor_write = {};
19268 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19269 descriptor_write.dstBinding = 2;
19270 descriptor_write.descriptorCount = 1;
19271 descriptor_write.pTexelBufferView = nullptr;
19272 descriptor_write.pBufferInfo = &buff_info;
19273 descriptor_write.pImageInfo = nullptr;
19274 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19275 descriptor_write.dstSet = descriptor_set;
19276
19277 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19278
19279 m_errorMonitor->VerifyNotFound();
19280 // Cleanup
19281 vkFreeMemory(m_device->device(), mem, NULL);
19282 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19283 vkDestroyBuffer(m_device->device(), buffer, NULL);
19284 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19285}
19286
19287// This is a positive test. No failures are expected.
19288TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19289 VkResult err;
19290 bool pass;
19291
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019292 TEST_DESCRIPTION(
19293 "Create a buffer, allocate memory, bind memory, destroy "
19294 "the buffer, create an image, and bind the same memory to "
19295 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019296
19297 m_errorMonitor->ExpectSuccess();
19298
Tony Barbour1fa09702017-03-16 12:09:08 -060019299 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019300
19301 VkBuffer buffer;
19302 VkImage image;
19303 VkDeviceMemory mem;
19304 VkMemoryRequirements mem_reqs;
19305
19306 VkBufferCreateInfo buf_info = {};
19307 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19308 buf_info.pNext = NULL;
19309 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19310 buf_info.size = 256;
19311 buf_info.queueFamilyIndexCount = 0;
19312 buf_info.pQueueFamilyIndices = NULL;
19313 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19314 buf_info.flags = 0;
19315 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19316 ASSERT_VK_SUCCESS(err);
19317
19318 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19319
19320 VkMemoryAllocateInfo alloc_info = {};
19321 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19322 alloc_info.pNext = NULL;
19323 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019324
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019325 // Ensure memory is big enough for both bindings
19326 alloc_info.allocationSize = 0x10000;
19327
19328 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19329 if (!pass) {
19330 vkDestroyBuffer(m_device->device(), buffer, NULL);
19331 return;
19332 }
19333
19334 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19335 ASSERT_VK_SUCCESS(err);
19336
19337 uint8_t *pData;
19338 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19339 ASSERT_VK_SUCCESS(err);
19340
19341 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19342
19343 vkUnmapMemory(m_device->device(), mem);
19344
19345 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19346 ASSERT_VK_SUCCESS(err);
19347
19348 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19349 // memory. In fact, it was never used by the GPU.
19350 // Just be be sure, wait for idle.
19351 vkDestroyBuffer(m_device->device(), buffer, NULL);
19352 vkDeviceWaitIdle(m_device->device());
19353
Tobin Ehlis6a005702016-12-28 15:25:56 -070019354 // Use optimal as some platforms report linear support but then fail image creation
19355 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19356 VkImageFormatProperties image_format_properties;
19357 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19358 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19359 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019360 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019361 vkFreeMemory(m_device->device(), mem, NULL);
19362 return;
19363 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019364 VkImageCreateInfo image_create_info = {};
19365 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19366 image_create_info.pNext = NULL;
19367 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19368 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19369 image_create_info.extent.width = 64;
19370 image_create_info.extent.height = 64;
19371 image_create_info.extent.depth = 1;
19372 image_create_info.mipLevels = 1;
19373 image_create_info.arrayLayers = 1;
19374 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019375 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019376 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19377 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19378 image_create_info.queueFamilyIndexCount = 0;
19379 image_create_info.pQueueFamilyIndices = NULL;
19380 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19381 image_create_info.flags = 0;
19382
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019383 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019384 * to be textures or it will be the staging image if they are not.
19385 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019386 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19387 ASSERT_VK_SUCCESS(err);
19388
19389 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19390
Tobin Ehlis6a005702016-12-28 15:25:56 -070019391 VkMemoryAllocateInfo mem_alloc = {};
19392 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19393 mem_alloc.pNext = NULL;
19394 mem_alloc.allocationSize = 0;
19395 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019396 mem_alloc.allocationSize = mem_reqs.size;
19397
19398 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19399 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019400 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019401 vkDestroyImage(m_device->device(), image, NULL);
19402 return;
19403 }
19404
19405 // VALIDATION FAILURE:
19406 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19407 ASSERT_VK_SUCCESS(err);
19408
19409 m_errorMonitor->VerifyNotFound();
19410
19411 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019412 vkDestroyImage(m_device->device(), image, NULL);
19413}
19414
Tony Barbourab713912017-02-02 14:17:35 -070019415// This is a positive test. No failures are expected.
19416TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19417 VkResult err;
19418
19419 TEST_DESCRIPTION(
19420 "Call all applicable destroy and free routines with NULL"
19421 "handles, expecting no validation errors");
19422
19423 m_errorMonitor->ExpectSuccess();
19424
Tony Barbour1fa09702017-03-16 12:09:08 -060019425 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019426 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19427 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19428 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19429 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19430 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19431 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19432 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19433 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19434 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19435 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19436 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19437 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19438 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19439 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19440 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19441 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19442 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19443 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19444 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19445 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19446
19447 VkCommandPool command_pool;
19448 VkCommandPoolCreateInfo pool_create_info{};
19449 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19450 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19451 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19452 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19453 VkCommandBuffer command_buffers[3] = {};
19454 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19455 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19456 command_buffer_allocate_info.commandPool = command_pool;
19457 command_buffer_allocate_info.commandBufferCount = 1;
19458 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19459 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19460 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19461 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19462
19463 VkDescriptorPoolSize ds_type_count = {};
19464 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19465 ds_type_count.descriptorCount = 1;
19466
19467 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19468 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19469 ds_pool_ci.pNext = NULL;
19470 ds_pool_ci.maxSets = 1;
19471 ds_pool_ci.poolSizeCount = 1;
19472 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19473 ds_pool_ci.pPoolSizes = &ds_type_count;
19474
19475 VkDescriptorPool ds_pool;
19476 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19477 ASSERT_VK_SUCCESS(err);
19478
19479 VkDescriptorSetLayoutBinding dsl_binding = {};
19480 dsl_binding.binding = 2;
19481 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19482 dsl_binding.descriptorCount = 1;
19483 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19484 dsl_binding.pImmutableSamplers = NULL;
19485 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19486 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19487 ds_layout_ci.pNext = NULL;
19488 ds_layout_ci.bindingCount = 1;
19489 ds_layout_ci.pBindings = &dsl_binding;
19490 VkDescriptorSetLayout ds_layout;
19491 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19492 ASSERT_VK_SUCCESS(err);
19493
19494 VkDescriptorSet descriptor_sets[3] = {};
19495 VkDescriptorSetAllocateInfo alloc_info = {};
19496 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19497 alloc_info.descriptorSetCount = 1;
19498 alloc_info.descriptorPool = ds_pool;
19499 alloc_info.pSetLayouts = &ds_layout;
19500 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19501 ASSERT_VK_SUCCESS(err);
19502 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19503 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19504 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19505
19506 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19507
19508 m_errorMonitor->VerifyNotFound();
19509}
19510
Tony Barbour626994c2017-02-08 15:29:37 -070019511TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019512 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019513
19514 m_errorMonitor->ExpectSuccess();
19515
Tony Barbour1fa09702017-03-16 12:09:08 -060019516 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019517 VkCommandBuffer cmd_bufs[4];
19518 VkCommandBufferAllocateInfo alloc_info;
19519 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19520 alloc_info.pNext = NULL;
19521 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019522 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019523 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19524 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19525 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060019526 image.Init(128, 128, 1, VK_FORMAT_B8G8R8A8_UNORM,
Mike Weiblen62d08a32017-03-07 22:18:27 -070019527 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19528 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019529 ASSERT_TRUE(image.initialized());
19530 VkCommandBufferBeginInfo cb_binfo;
19531 cb_binfo.pNext = NULL;
19532 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19533 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19534 cb_binfo.flags = 0;
19535 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19536 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19537 VkImageMemoryBarrier img_barrier = {};
19538 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19539 img_barrier.pNext = NULL;
19540 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19541 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19542 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19543 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19544 img_barrier.image = image.handle();
19545 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19546 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19547 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19548 img_barrier.subresourceRange.baseArrayLayer = 0;
19549 img_barrier.subresourceRange.baseMipLevel = 0;
19550 img_barrier.subresourceRange.layerCount = 1;
19551 img_barrier.subresourceRange.levelCount = 1;
19552 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19553 &img_barrier);
19554 vkEndCommandBuffer(cmd_bufs[0]);
19555 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19556 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19557 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19558 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19559 &img_barrier);
19560 vkEndCommandBuffer(cmd_bufs[1]);
19561 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19562 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19563 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19564 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19565 &img_barrier);
19566 vkEndCommandBuffer(cmd_bufs[2]);
19567 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19568 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19569 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19570 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19571 &img_barrier);
19572 vkEndCommandBuffer(cmd_bufs[3]);
19573
19574 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19575 VkSemaphore semaphore1, semaphore2;
19576 VkSemaphoreCreateInfo semaphore_create_info{};
19577 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19578 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19579 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19580 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19581 VkSubmitInfo submit_info[3];
19582 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19583 submit_info[0].pNext = nullptr;
19584 submit_info[0].commandBufferCount = 1;
19585 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19586 submit_info[0].signalSemaphoreCount = 1;
19587 submit_info[0].pSignalSemaphores = &semaphore1;
19588 submit_info[0].waitSemaphoreCount = 0;
19589 submit_info[0].pWaitDstStageMask = nullptr;
19590 submit_info[0].pWaitDstStageMask = flags;
19591 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19592 submit_info[1].pNext = nullptr;
19593 submit_info[1].commandBufferCount = 1;
19594 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19595 submit_info[1].waitSemaphoreCount = 1;
19596 submit_info[1].pWaitSemaphores = &semaphore1;
19597 submit_info[1].signalSemaphoreCount = 1;
19598 submit_info[1].pSignalSemaphores = &semaphore2;
19599 submit_info[1].pWaitDstStageMask = flags;
19600 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19601 submit_info[2].pNext = nullptr;
19602 submit_info[2].commandBufferCount = 2;
19603 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19604 submit_info[2].waitSemaphoreCount = 1;
19605 submit_info[2].pWaitSemaphores = &semaphore2;
19606 submit_info[2].signalSemaphoreCount = 0;
19607 submit_info[2].pSignalSemaphores = nullptr;
19608 submit_info[2].pWaitDstStageMask = flags;
19609 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19610 vkQueueWaitIdle(m_device->m_queue);
19611
19612 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19613 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19614 m_errorMonitor->VerifyNotFound();
19615}
19616
Tobin Ehlis953e8392016-11-17 10:54:13 -070019617TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19618 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19619 // We previously had a bug where dynamic offset of inactive bindings was still being used
19620 VkResult err;
19621 m_errorMonitor->ExpectSuccess();
19622
Tony Barbour1fa09702017-03-16 12:09:08 -060019623 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019624 ASSERT_NO_FATAL_FAILURE(InitViewport());
19625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19626
19627 VkDescriptorPoolSize ds_type_count = {};
19628 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19629 ds_type_count.descriptorCount = 3;
19630
19631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19633 ds_pool_ci.pNext = NULL;
19634 ds_pool_ci.maxSets = 1;
19635 ds_pool_ci.poolSizeCount = 1;
19636 ds_pool_ci.pPoolSizes = &ds_type_count;
19637
19638 VkDescriptorPool ds_pool;
19639 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19640 ASSERT_VK_SUCCESS(err);
19641
19642 const uint32_t BINDING_COUNT = 3;
19643 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019644 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019645 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19646 dsl_binding[0].descriptorCount = 1;
19647 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19648 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019649 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019650 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19651 dsl_binding[1].descriptorCount = 1;
19652 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19653 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019654 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019655 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19656 dsl_binding[2].descriptorCount = 1;
19657 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19658 dsl_binding[2].pImmutableSamplers = NULL;
19659
19660 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19661 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19662 ds_layout_ci.pNext = NULL;
19663 ds_layout_ci.bindingCount = BINDING_COUNT;
19664 ds_layout_ci.pBindings = dsl_binding;
19665 VkDescriptorSetLayout ds_layout;
19666 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19667 ASSERT_VK_SUCCESS(err);
19668
19669 VkDescriptorSet descriptor_set;
19670 VkDescriptorSetAllocateInfo alloc_info = {};
19671 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19672 alloc_info.descriptorSetCount = 1;
19673 alloc_info.descriptorPool = ds_pool;
19674 alloc_info.pSetLayouts = &ds_layout;
19675 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19676 ASSERT_VK_SUCCESS(err);
19677
19678 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19679 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19680 pipeline_layout_ci.pNext = NULL;
19681 pipeline_layout_ci.setLayoutCount = 1;
19682 pipeline_layout_ci.pSetLayouts = &ds_layout;
19683
19684 VkPipelineLayout pipeline_layout;
19685 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19686 ASSERT_VK_SUCCESS(err);
19687
19688 // Create two buffers to update the descriptors with
19689 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19690 uint32_t qfi = 0;
19691 VkBufferCreateInfo buffCI = {};
19692 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19693 buffCI.size = 2048;
19694 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19695 buffCI.queueFamilyIndexCount = 1;
19696 buffCI.pQueueFamilyIndices = &qfi;
19697
19698 VkBuffer dyub1;
19699 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19700 ASSERT_VK_SUCCESS(err);
19701 // buffer2
19702 buffCI.size = 1024;
19703 VkBuffer dyub2;
19704 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19705 ASSERT_VK_SUCCESS(err);
19706 // Allocate memory and bind to buffers
19707 VkMemoryAllocateInfo mem_alloc[2] = {};
19708 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19709 mem_alloc[0].pNext = NULL;
19710 mem_alloc[0].memoryTypeIndex = 0;
19711 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19712 mem_alloc[1].pNext = NULL;
19713 mem_alloc[1].memoryTypeIndex = 0;
19714
19715 VkMemoryRequirements mem_reqs1;
19716 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19717 VkMemoryRequirements mem_reqs2;
19718 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19719 mem_alloc[0].allocationSize = mem_reqs1.size;
19720 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19721 mem_alloc[1].allocationSize = mem_reqs2.size;
19722 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19723 if (!pass) {
19724 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19725 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19726 return;
19727 }
19728
19729 VkDeviceMemory mem1;
19730 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19731 ASSERT_VK_SUCCESS(err);
19732 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19733 ASSERT_VK_SUCCESS(err);
19734 VkDeviceMemory mem2;
19735 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19736 ASSERT_VK_SUCCESS(err);
19737 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19738 ASSERT_VK_SUCCESS(err);
19739 // Update descriptors
19740 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19741 buff_info[0].buffer = dyub1;
19742 buff_info[0].offset = 0;
19743 buff_info[0].range = 256;
19744 buff_info[1].buffer = dyub1;
19745 buff_info[1].offset = 256;
19746 buff_info[1].range = 512;
19747 buff_info[2].buffer = dyub2;
19748 buff_info[2].offset = 0;
19749 buff_info[2].range = 512;
19750
19751 VkWriteDescriptorSet descriptor_write;
19752 memset(&descriptor_write, 0, sizeof(descriptor_write));
19753 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19754 descriptor_write.dstSet = descriptor_set;
19755 descriptor_write.dstBinding = 0;
19756 descriptor_write.descriptorCount = BINDING_COUNT;
19757 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19758 descriptor_write.pBufferInfo = buff_info;
19759
19760 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19761
Tony Barbour552f6c02016-12-21 14:34:07 -070019762 m_commandBuffer->BeginCommandBuffer();
19763 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019764
19765 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019766 char const *vsSource =
19767 "#version 450\n"
19768 "\n"
19769 "out gl_PerVertex { \n"
19770 " vec4 gl_Position;\n"
19771 "};\n"
19772 "void main(){\n"
19773 " gl_Position = vec4(1);\n"
19774 "}\n";
19775 char const *fsSource =
19776 "#version 450\n"
19777 "\n"
19778 "layout(location=0) out vec4 x;\n"
19779 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19780 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19781 "void main(){\n"
19782 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19783 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019784 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19785 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19786 VkPipelineObj pipe(m_device);
19787 pipe.SetViewport(m_viewports);
19788 pipe.SetScissor(m_scissors);
19789 pipe.AddShader(&vs);
19790 pipe.AddShader(&fs);
19791 pipe.AddColorAttachment();
19792 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19793
19794 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19795 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19796 // we used to have a bug in this case.
19797 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19798 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19799 &descriptor_set, BINDING_COUNT, dyn_off);
19800 Draw(1, 0, 0, 0);
19801 m_errorMonitor->VerifyNotFound();
19802
19803 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19804 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19805 vkFreeMemory(m_device->device(), mem1, NULL);
19806 vkFreeMemory(m_device->device(), mem2, NULL);
19807
19808 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19809 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19810 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19811}
19812
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019813TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019814 TEST_DESCRIPTION(
19815 "Ensure that validations handling of non-coherent memory "
19816 "mapping while using VK_WHOLE_SIZE does not cause access "
19817 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019818 VkResult err;
19819 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019820 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019821
19822 VkDeviceMemory mem;
19823 VkMemoryRequirements mem_reqs;
19824 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019825 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019826 VkMemoryAllocateInfo alloc_info = {};
19827 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19828 alloc_info.pNext = NULL;
19829 alloc_info.memoryTypeIndex = 0;
19830
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019831 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019832 alloc_info.allocationSize = allocation_size;
19833
19834 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19835 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 -070019836 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019837 if (!pass) {
19838 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019839 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19840 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019841 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019842 pass = m_device->phy().set_memory_type(
19843 mem_reqs.memoryTypeBits, &alloc_info,
19844 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19845 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019846 if (!pass) {
19847 return;
19848 }
19849 }
19850 }
19851
19852 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19853 ASSERT_VK_SUCCESS(err);
19854
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019855 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019856 m_errorMonitor->ExpectSuccess();
19857 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19858 ASSERT_VK_SUCCESS(err);
19859 VkMappedMemoryRange mmr = {};
19860 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19861 mmr.memory = mem;
19862 mmr.offset = 0;
19863 mmr.size = VK_WHOLE_SIZE;
19864 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19865 ASSERT_VK_SUCCESS(err);
19866 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19867 ASSERT_VK_SUCCESS(err);
19868 m_errorMonitor->VerifyNotFound();
19869 vkUnmapMemory(m_device->device(), mem);
19870
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019871 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019872 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019873 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019874 ASSERT_VK_SUCCESS(err);
19875 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19876 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019877 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019878 mmr.size = VK_WHOLE_SIZE;
19879 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19880 ASSERT_VK_SUCCESS(err);
19881 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19882 ASSERT_VK_SUCCESS(err);
19883 m_errorMonitor->VerifyNotFound();
19884 vkUnmapMemory(m_device->device(), mem);
19885
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019886 // Map with offset and size
19887 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019888 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019889 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019890 ASSERT_VK_SUCCESS(err);
19891 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19892 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019893 mmr.offset = 4 * atom_size;
19894 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019895 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19896 ASSERT_VK_SUCCESS(err);
19897 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19898 ASSERT_VK_SUCCESS(err);
19899 m_errorMonitor->VerifyNotFound();
19900 vkUnmapMemory(m_device->device(), mem);
19901
19902 // Map without offset and flush WHOLE_SIZE with two separate offsets
19903 m_errorMonitor->ExpectSuccess();
19904 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19905 ASSERT_VK_SUCCESS(err);
19906 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19907 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019908 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019909 mmr.size = VK_WHOLE_SIZE;
19910 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19911 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019912 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019913 mmr.size = VK_WHOLE_SIZE;
19914 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19915 ASSERT_VK_SUCCESS(err);
19916 m_errorMonitor->VerifyNotFound();
19917 vkUnmapMemory(m_device->device(), mem);
19918
19919 vkFreeMemory(m_device->device(), mem, NULL);
19920}
19921
19922// This is a positive test. We used to expect error in this case but spec now allows it
19923TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19924 m_errorMonitor->ExpectSuccess();
19925 vk_testing::Fence testFence;
19926 VkFenceCreateInfo fenceInfo = {};
19927 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19928 fenceInfo.pNext = NULL;
19929
Tony Barbour1fa09702017-03-16 12:09:08 -060019930 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019931 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019932 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019933 VkResult result = vkResetFences(m_device->device(), 1, fences);
19934 ASSERT_VK_SUCCESS(result);
19935
19936 m_errorMonitor->VerifyNotFound();
19937}
19938
19939TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19940 m_errorMonitor->ExpectSuccess();
19941
Tony Barbour1fa09702017-03-16 12:09:08 -060019942 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019943 VkResult err;
19944
19945 // Record (empty!) command buffer that can be submitted multiple times
19946 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019947 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19948 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019949 m_commandBuffer->BeginCommandBuffer(&cbbi);
19950 m_commandBuffer->EndCommandBuffer();
19951
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019952 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019953 VkFence fence;
19954 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19955 ASSERT_VK_SUCCESS(err);
19956
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019957 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019958 VkSemaphore s1, s2;
19959 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19960 ASSERT_VK_SUCCESS(err);
19961 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19962 ASSERT_VK_SUCCESS(err);
19963
19964 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019965 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019966 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19967 ASSERT_VK_SUCCESS(err);
19968
19969 // Submit CB again, signaling s2.
19970 si.pSignalSemaphores = &s2;
19971 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19972 ASSERT_VK_SUCCESS(err);
19973
19974 // Wait for fence.
19975 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19976 ASSERT_VK_SUCCESS(err);
19977
19978 // CB is still in flight from second submission, but semaphore s1 is no
19979 // longer in flight. delete it.
19980 vkDestroySemaphore(m_device->device(), s1, nullptr);
19981
19982 m_errorMonitor->VerifyNotFound();
19983
19984 // Force device idle and clean up remaining objects
19985 vkDeviceWaitIdle(m_device->device());
19986 vkDestroySemaphore(m_device->device(), s2, nullptr);
19987 vkDestroyFence(m_device->device(), fence, nullptr);
19988}
19989
19990TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19991 m_errorMonitor->ExpectSuccess();
19992
Tony Barbour1fa09702017-03-16 12:09:08 -060019993 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019994 VkResult err;
19995
19996 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019997 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019998 VkFence f1;
19999 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
20000 ASSERT_VK_SUCCESS(err);
20001
20002 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020003 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020004 VkFence f2;
20005 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
20006 ASSERT_VK_SUCCESS(err);
20007
20008 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020009 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020010 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
20011
20012 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020013 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020014 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
20015
20016 // Should have both retired!
20017 vkDestroyFence(m_device->device(), f1, nullptr);
20018 vkDestroyFence(m_device->device(), f2, nullptr);
20019
20020 m_errorMonitor->VerifyNotFound();
20021}
20022
20023TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020024 TEST_DESCRIPTION(
20025 "Verify that creating an image view from an image with valid usage "
20026 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020027
Tony Barbour1fa09702017-03-16 12:09:08 -060020028 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020029
20030 m_errorMonitor->ExpectSuccess();
20031 // Verify that we can create a view with usage INPUT_ATTACHMENT
20032 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020033 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 -060020034 ASSERT_TRUE(image.initialized());
20035 VkImageView imageView;
20036 VkImageViewCreateInfo ivci = {};
20037 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
20038 ivci.image = image.handle();
20039 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
20040 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
20041 ivci.subresourceRange.layerCount = 1;
20042 ivci.subresourceRange.baseMipLevel = 0;
20043 ivci.subresourceRange.levelCount = 1;
20044 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20045
20046 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
20047 m_errorMonitor->VerifyNotFound();
20048 vkDestroyImageView(m_device->device(), imageView, NULL);
20049}
20050
20051// This is a positive test. No failures are expected.
20052TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020053 TEST_DESCRIPTION(
20054 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
20055 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020056
Tony Barbour1fa09702017-03-16 12:09:08 -060020057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020058
20059 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020060 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060020061 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020062
20063 m_errorMonitor->ExpectSuccess();
20064
20065 VkImage image;
20066 VkImageCreateInfo image_create_info = {};
20067 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
20068 image_create_info.pNext = NULL;
20069 image_create_info.imageType = VK_IMAGE_TYPE_2D;
20070 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
20071 image_create_info.extent.width = 64;
20072 image_create_info.extent.height = 64;
20073 image_create_info.extent.depth = 1;
20074 image_create_info.mipLevels = 1;
20075 image_create_info.arrayLayers = 1;
20076 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
20077 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
20078 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
20079 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
20080 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
20081 ASSERT_VK_SUCCESS(err);
20082
20083 VkMemoryRequirements memory_reqs;
20084 VkDeviceMemory memory_one, memory_two;
20085 bool pass;
20086 VkMemoryAllocateInfo memory_info = {};
20087 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20088 memory_info.pNext = NULL;
20089 memory_info.allocationSize = 0;
20090 memory_info.memoryTypeIndex = 0;
20091 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20092 // Find an image big enough to allow sparse mapping of 2 memory regions
20093 // Increase the image size until it is at least twice the
20094 // size of the required alignment, to ensure we can bind both
20095 // allocated memory blocks to the image on aligned offsets.
20096 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
20097 vkDestroyImage(m_device->device(), image, nullptr);
20098 image_create_info.extent.width *= 2;
20099 image_create_info.extent.height *= 2;
20100 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
20101 ASSERT_VK_SUCCESS(err);
20102 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
20103 }
20104 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
20105 // at the end of the first
20106 memory_info.allocationSize = memory_reqs.alignment;
20107 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
20108 ASSERT_TRUE(pass);
20109 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
20110 ASSERT_VK_SUCCESS(err);
20111 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
20112 ASSERT_VK_SUCCESS(err);
20113 VkSparseMemoryBind binds[2];
20114 binds[0].flags = 0;
20115 binds[0].memory = memory_one;
20116 binds[0].memoryOffset = 0;
20117 binds[0].resourceOffset = 0;
20118 binds[0].size = memory_info.allocationSize;
20119 binds[1].flags = 0;
20120 binds[1].memory = memory_two;
20121 binds[1].memoryOffset = 0;
20122 binds[1].resourceOffset = memory_info.allocationSize;
20123 binds[1].size = memory_info.allocationSize;
20124
20125 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
20126 opaqueBindInfo.image = image;
20127 opaqueBindInfo.bindCount = 2;
20128 opaqueBindInfo.pBinds = binds;
20129
20130 VkFence fence = VK_NULL_HANDLE;
20131 VkBindSparseInfo bindSparseInfo = {};
20132 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
20133 bindSparseInfo.imageOpaqueBindCount = 1;
20134 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
20135
20136 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
20137 vkQueueWaitIdle(m_device->m_queue);
20138 vkDestroyImage(m_device->device(), image, NULL);
20139 vkFreeMemory(m_device->device(), memory_one, NULL);
20140 vkFreeMemory(m_device->device(), memory_two, NULL);
20141 m_errorMonitor->VerifyNotFound();
20142}
20143
20144TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020145 TEST_DESCRIPTION(
20146 "Ensure that CmdBeginRenderPass with an attachment's "
20147 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
20148 "the command buffer has prior knowledge of that "
20149 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020150
20151 m_errorMonitor->ExpectSuccess();
20152
Tony Barbour1fa09702017-03-16 12:09:08 -060020153 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020154
20155 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020156 VkAttachmentDescription attachment = {0,
20157 VK_FORMAT_R8G8B8A8_UNORM,
20158 VK_SAMPLE_COUNT_1_BIT,
20159 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20160 VK_ATTACHMENT_STORE_OP_STORE,
20161 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20162 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20163 VK_IMAGE_LAYOUT_UNDEFINED,
20164 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020165
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020166 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020167
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020168 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020169
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020170 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020171
20172 VkRenderPass rp;
20173 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20174 ASSERT_VK_SUCCESS(err);
20175
20176 // A compatible framebuffer.
20177 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020178 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 -060020179 ASSERT_TRUE(image.initialized());
20180
20181 VkImageViewCreateInfo ivci = {
20182 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20183 nullptr,
20184 0,
20185 image.handle(),
20186 VK_IMAGE_VIEW_TYPE_2D,
20187 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020188 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20189 VK_COMPONENT_SWIZZLE_IDENTITY},
20190 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020191 };
20192 VkImageView view;
20193 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20194 ASSERT_VK_SUCCESS(err);
20195
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020196 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020197 VkFramebuffer fb;
20198 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20199 ASSERT_VK_SUCCESS(err);
20200
20201 // Record a single command buffer which uses this renderpass twice. The
20202 // bug is triggered at the beginning of the second renderpass, when the
20203 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020204 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 -070020205 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020206 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20207 vkCmdEndRenderPass(m_commandBuffer->handle());
20208 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20209
20210 m_errorMonitor->VerifyNotFound();
20211
20212 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020213 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020214
20215 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20216 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20217 vkDestroyImageView(m_device->device(), view, nullptr);
20218}
20219
20220TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020221 TEST_DESCRIPTION(
20222 "This test should pass. Create a Framebuffer and "
20223 "command buffer, bind them together, then destroy "
20224 "command pool and framebuffer and verify there are no "
20225 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020226
20227 m_errorMonitor->ExpectSuccess();
20228
Tony Barbour1fa09702017-03-16 12:09:08 -060020229 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020230
20231 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020232 VkAttachmentDescription attachment = {0,
20233 VK_FORMAT_R8G8B8A8_UNORM,
20234 VK_SAMPLE_COUNT_1_BIT,
20235 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20236 VK_ATTACHMENT_STORE_OP_STORE,
20237 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20238 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20239 VK_IMAGE_LAYOUT_UNDEFINED,
20240 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020241
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020242 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020243
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020244 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020245
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020246 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020247
20248 VkRenderPass rp;
20249 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20250 ASSERT_VK_SUCCESS(err);
20251
20252 // A compatible framebuffer.
20253 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020254 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 -060020255 ASSERT_TRUE(image.initialized());
20256
20257 VkImageViewCreateInfo ivci = {
20258 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20259 nullptr,
20260 0,
20261 image.handle(),
20262 VK_IMAGE_VIEW_TYPE_2D,
20263 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020264 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20265 VK_COMPONENT_SWIZZLE_IDENTITY},
20266 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020267 };
20268 VkImageView view;
20269 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20270 ASSERT_VK_SUCCESS(err);
20271
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020272 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020273 VkFramebuffer fb;
20274 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20275 ASSERT_VK_SUCCESS(err);
20276
20277 // Explicitly create a command buffer to bind the FB to so that we can then
20278 // destroy the command pool in order to implicitly free command buffer
20279 VkCommandPool command_pool;
20280 VkCommandPoolCreateInfo pool_create_info{};
20281 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20282 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20283 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20284 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20285
20286 VkCommandBuffer command_buffer;
20287 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20288 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20289 command_buffer_allocate_info.commandPool = command_pool;
20290 command_buffer_allocate_info.commandBufferCount = 1;
20291 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20292 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20293
20294 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020295 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 -060020296 VkCommandBufferBeginInfo begin_info{};
20297 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20298 vkBeginCommandBuffer(command_buffer, &begin_info);
20299
20300 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20301 vkCmdEndRenderPass(command_buffer);
20302 vkEndCommandBuffer(command_buffer);
20303 vkDestroyImageView(m_device->device(), view, nullptr);
20304 // Destroy command pool to implicitly free command buffer
20305 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20306 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20307 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20308 m_errorMonitor->VerifyNotFound();
20309}
20310
20311TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020312 TEST_DESCRIPTION(
20313 "Ensure that CmdBeginRenderPass applies the layout "
20314 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020315
20316 m_errorMonitor->ExpectSuccess();
20317
Tony Barbour1fa09702017-03-16 12:09:08 -060020318 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020319
20320 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020321 VkAttachmentDescription attachment = {0,
20322 VK_FORMAT_R8G8B8A8_UNORM,
20323 VK_SAMPLE_COUNT_1_BIT,
20324 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20325 VK_ATTACHMENT_STORE_OP_STORE,
20326 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20327 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20328 VK_IMAGE_LAYOUT_UNDEFINED,
20329 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020330
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020331 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020332
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020333 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020334
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020335 VkSubpassDependency dep = {0,
20336 0,
20337 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20338 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20339 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20340 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20341 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020342
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020343 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020344
20345 VkResult err;
20346 VkRenderPass rp;
20347 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20348 ASSERT_VK_SUCCESS(err);
20349
20350 // A compatible framebuffer.
20351 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020352 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 -060020353 ASSERT_TRUE(image.initialized());
20354
20355 VkImageViewCreateInfo ivci = {
20356 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20357 nullptr,
20358 0,
20359 image.handle(),
20360 VK_IMAGE_VIEW_TYPE_2D,
20361 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020362 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20363 VK_COMPONENT_SWIZZLE_IDENTITY},
20364 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020365 };
20366 VkImageView view;
20367 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20368 ASSERT_VK_SUCCESS(err);
20369
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020370 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020371 VkFramebuffer fb;
20372 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20373 ASSERT_VK_SUCCESS(err);
20374
20375 // Record a single command buffer which issues a pipeline barrier w/
20376 // image memory barrier for the attachment. This detects the previously
20377 // missing tracking of the subpass layout by throwing a validation error
20378 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020379 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 -070020380 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020381 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20382
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020383 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20384 nullptr,
20385 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20386 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20387 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20388 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20389 VK_QUEUE_FAMILY_IGNORED,
20390 VK_QUEUE_FAMILY_IGNORED,
20391 image.handle(),
20392 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020393 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020394 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20395 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020396
20397 vkCmdEndRenderPass(m_commandBuffer->handle());
20398 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020399 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020400
20401 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20402 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20403 vkDestroyImageView(m_device->device(), view, nullptr);
20404}
20405
20406TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020407 TEST_DESCRIPTION(
20408 "Validate that when an imageView of a depth/stencil image "
20409 "is used as a depth/stencil framebuffer attachment, the "
20410 "aspectMask is ignored and both depth and stencil image "
20411 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020412
Tony Barbour1fa09702017-03-16 12:09:08 -060020413 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020414 VkFormatProperties format_properties;
20415 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20416 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20417 return;
20418 }
20419
20420 m_errorMonitor->ExpectSuccess();
20421
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020422 VkAttachmentDescription attachment = {0,
20423 VK_FORMAT_D32_SFLOAT_S8_UINT,
20424 VK_SAMPLE_COUNT_1_BIT,
20425 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20426 VK_ATTACHMENT_STORE_OP_STORE,
20427 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20428 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20429 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20430 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020431
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020432 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020433
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020434 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020435
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020436 VkSubpassDependency dep = {0,
20437 0,
20438 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20439 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20440 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20441 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20442 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020443
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020444 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020445
20446 VkResult err;
20447 VkRenderPass rp;
20448 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20449 ASSERT_VK_SUCCESS(err);
20450
20451 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020452 image.InitNoLayout(32, 32, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
20453 0x26, // usage
20454 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020455 ASSERT_TRUE(image.initialized());
20456 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20457
20458 VkImageViewCreateInfo ivci = {
20459 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20460 nullptr,
20461 0,
20462 image.handle(),
20463 VK_IMAGE_VIEW_TYPE_2D,
20464 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020465 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20466 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020467 };
20468 VkImageView view;
20469 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20470 ASSERT_VK_SUCCESS(err);
20471
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020472 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020473 VkFramebuffer fb;
20474 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20475 ASSERT_VK_SUCCESS(err);
20476
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020477 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 -070020478 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020479 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20480
20481 VkImageMemoryBarrier imb = {};
20482 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20483 imb.pNext = nullptr;
20484 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20485 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20486 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20487 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20488 imb.srcQueueFamilyIndex = 0;
20489 imb.dstQueueFamilyIndex = 0;
20490 imb.image = image.handle();
20491 imb.subresourceRange.aspectMask = 0x6;
20492 imb.subresourceRange.baseMipLevel = 0;
20493 imb.subresourceRange.levelCount = 0x1;
20494 imb.subresourceRange.baseArrayLayer = 0;
20495 imb.subresourceRange.layerCount = 0x1;
20496
20497 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020498 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20499 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020500
20501 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020502 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020503 QueueCommandBuffer(false);
20504 m_errorMonitor->VerifyNotFound();
20505
20506 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20507 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20508 vkDestroyImageView(m_device->device(), view, nullptr);
20509}
20510
20511TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020512 TEST_DESCRIPTION(
20513 "Ensure that layout transitions work correctly without "
20514 "errors, when an attachment reference is "
20515 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020516
20517 m_errorMonitor->ExpectSuccess();
20518
Tony Barbour1fa09702017-03-16 12:09:08 -060020519 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020520
20521 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020522 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020523
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020524 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020526 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020527
20528 VkRenderPass rp;
20529 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20530 ASSERT_VK_SUCCESS(err);
20531
20532 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020533 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020534 VkFramebuffer fb;
20535 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20536 ASSERT_VK_SUCCESS(err);
20537
20538 // Record a command buffer which just begins and ends the renderpass. The
20539 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020540 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 -070020541 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020542 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20543 vkCmdEndRenderPass(m_commandBuffer->handle());
20544 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020545 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020546
20547 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20548 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20549}
20550
20551// This is a positive test. No errors are expected.
20552TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020553 TEST_DESCRIPTION(
20554 "Create a stencil-only attachment with a LOAD_OP set to "
20555 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020556 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020557 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020558 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020559 if (!depth_format) {
20560 printf(" No Depth + Stencil format found. Skipped.\n");
20561 return;
20562 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020563 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020564 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020565 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20566 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020567 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20568 return;
20569 }
20570
Tony Barbourf887b162017-03-09 10:06:46 -070020571 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020572 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020573 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020574 VkAttachmentDescription att = {};
20575 VkAttachmentReference ref = {};
20576 att.format = depth_stencil_fmt;
20577 att.samples = VK_SAMPLE_COUNT_1_BIT;
20578 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20579 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20580 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20581 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20582 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20583 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20584
20585 VkClearValue clear;
20586 clear.depthStencil.depth = 1.0;
20587 clear.depthStencil.stencil = 0;
20588 ref.attachment = 0;
20589 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20590
20591 VkSubpassDescription subpass = {};
20592 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20593 subpass.flags = 0;
20594 subpass.inputAttachmentCount = 0;
20595 subpass.pInputAttachments = NULL;
20596 subpass.colorAttachmentCount = 0;
20597 subpass.pColorAttachments = NULL;
20598 subpass.pResolveAttachments = NULL;
20599 subpass.pDepthStencilAttachment = &ref;
20600 subpass.preserveAttachmentCount = 0;
20601 subpass.pPreserveAttachments = NULL;
20602
20603 VkRenderPass rp;
20604 VkRenderPassCreateInfo rp_info = {};
20605 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20606 rp_info.attachmentCount = 1;
20607 rp_info.pAttachments = &att;
20608 rp_info.subpassCount = 1;
20609 rp_info.pSubpasses = &subpass;
20610 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20611 ASSERT_VK_SUCCESS(result);
20612
20613 VkImageView *depthView = m_depthStencil->BindInfo();
20614 VkFramebufferCreateInfo fb_info = {};
20615 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20616 fb_info.pNext = NULL;
20617 fb_info.renderPass = rp;
20618 fb_info.attachmentCount = 1;
20619 fb_info.pAttachments = depthView;
20620 fb_info.width = 100;
20621 fb_info.height = 100;
20622 fb_info.layers = 1;
20623 VkFramebuffer fb;
20624 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20625 ASSERT_VK_SUCCESS(result);
20626
20627 VkRenderPassBeginInfo rpbinfo = {};
20628 rpbinfo.clearValueCount = 1;
20629 rpbinfo.pClearValues = &clear;
20630 rpbinfo.pNext = NULL;
20631 rpbinfo.renderPass = rp;
20632 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20633 rpbinfo.renderArea.extent.width = 100;
20634 rpbinfo.renderArea.extent.height = 100;
20635 rpbinfo.renderArea.offset.x = 0;
20636 rpbinfo.renderArea.offset.y = 0;
20637 rpbinfo.framebuffer = fb;
20638
20639 VkFence fence = {};
20640 VkFenceCreateInfo fence_ci = {};
20641 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20642 fence_ci.pNext = nullptr;
20643 fence_ci.flags = 0;
20644 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20645 ASSERT_VK_SUCCESS(result);
20646
20647 m_commandBuffer->BeginCommandBuffer();
20648 m_commandBuffer->BeginRenderPass(rpbinfo);
20649 m_commandBuffer->EndRenderPass();
20650 m_commandBuffer->EndCommandBuffer();
20651 m_commandBuffer->QueueCommandBuffer(fence);
20652
20653 VkImageObj destImage(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020654 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 -070020655 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020656 VkImageMemoryBarrier barrier = {};
20657 VkImageSubresourceRange range;
20658 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20659 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20660 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20661 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20662 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20663 barrier.image = m_depthStencil->handle();
20664 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20665 range.baseMipLevel = 0;
20666 range.levelCount = 1;
20667 range.baseArrayLayer = 0;
20668 range.layerCount = 1;
20669 barrier.subresourceRange = range;
20670 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20671 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20672 cmdbuf.BeginCommandBuffer();
20673 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 -070020674 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020675 barrier.srcAccessMask = 0;
20676 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20677 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20678 barrier.image = destImage.handle();
20679 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20680 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 -070020681 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020682 VkImageCopy cregion;
20683 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20684 cregion.srcSubresource.mipLevel = 0;
20685 cregion.srcSubresource.baseArrayLayer = 0;
20686 cregion.srcSubresource.layerCount = 1;
20687 cregion.srcOffset.x = 0;
20688 cregion.srcOffset.y = 0;
20689 cregion.srcOffset.z = 0;
20690 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20691 cregion.dstSubresource.mipLevel = 0;
20692 cregion.dstSubresource.baseArrayLayer = 0;
20693 cregion.dstSubresource.layerCount = 1;
20694 cregion.dstOffset.x = 0;
20695 cregion.dstOffset.y = 0;
20696 cregion.dstOffset.z = 0;
20697 cregion.extent.width = 100;
20698 cregion.extent.height = 100;
20699 cregion.extent.depth = 1;
20700 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020701 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020702 cmdbuf.EndCommandBuffer();
20703
20704 VkSubmitInfo submit_info;
20705 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20706 submit_info.pNext = NULL;
20707 submit_info.waitSemaphoreCount = 0;
20708 submit_info.pWaitSemaphores = NULL;
20709 submit_info.pWaitDstStageMask = NULL;
20710 submit_info.commandBufferCount = 1;
20711 submit_info.pCommandBuffers = &cmdbuf.handle();
20712 submit_info.signalSemaphoreCount = 0;
20713 submit_info.pSignalSemaphores = NULL;
20714
20715 m_errorMonitor->ExpectSuccess();
20716 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20717 m_errorMonitor->VerifyNotFound();
20718
20719 vkQueueWaitIdle(m_device->m_queue);
20720 vkDestroyFence(m_device->device(), fence, nullptr);
20721 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20722 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20723}
20724
20725// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020726TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20727 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20728
20729 m_errorMonitor->ExpectSuccess();
20730
Tony Barbour1fa09702017-03-16 12:09:08 -060020731 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060020732 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020733 if (!depth_format) {
20734 printf(" No Depth + Stencil format found. Skipped.\n");
20735 return;
20736 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20738
20739 VkImageMemoryBarrier img_barrier = {};
20740 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20741 img_barrier.pNext = NULL;
20742 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20743 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20744 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20745 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20746 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20747 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20748 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20749 img_barrier.subresourceRange.baseArrayLayer = 0;
20750 img_barrier.subresourceRange.baseMipLevel = 0;
20751 img_barrier.subresourceRange.layerCount = 1;
20752 img_barrier.subresourceRange.levelCount = 1;
20753
20754 {
20755 VkImageObj img_color(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020756 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 -070020757 ASSERT_TRUE(img_color.initialized());
20758
20759 VkImageObj img_ds1(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020760 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 -070020761 ASSERT_TRUE(img_ds1.initialized());
20762
20763 VkImageObj img_ds2(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020764 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 -070020765 ASSERT_TRUE(img_ds2.initialized());
20766
20767 VkImageObj img_xfer_src(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020768 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 -070020769 ASSERT_TRUE(img_xfer_src.initialized());
20770
20771 VkImageObj img_xfer_dst(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020772 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 -070020773 ASSERT_TRUE(img_xfer_dst.initialized());
20774
20775 VkImageObj img_sampled(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020776 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 -070020777 ASSERT_TRUE(img_sampled.initialized());
20778
20779 VkImageObj img_input(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060020780 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 -070020781 ASSERT_TRUE(img_input.initialized());
20782
20783 const struct {
20784 VkImageObj &image_obj;
20785 VkImageLayout old_layout;
20786 VkImageLayout new_layout;
20787 } buffer_layouts[] = {
20788 // clang-format off
20789 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20790 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20791 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20792 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20793 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20794 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20795 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20796 // clang-format on
20797 };
20798 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20799
20800 m_commandBuffer->BeginCommandBuffer();
20801 for (uint32_t i = 0; i < layout_count; ++i) {
20802 img_barrier.image = buffer_layouts[i].image_obj.handle();
20803 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20804 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20805 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20806 : VK_IMAGE_ASPECT_COLOR_BIT;
20807
20808 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20809 img_barrier.newLayout = buffer_layouts[i].new_layout;
20810 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20811 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20812
20813 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20814 img_barrier.newLayout = buffer_layouts[i].old_layout;
20815 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20816 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20817 }
20818 m_commandBuffer->EndCommandBuffer();
20819
20820 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20821 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20822 }
20823 m_errorMonitor->VerifyNotFound();
20824}
20825
20826// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020827TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20828 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20829
20830 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020831 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020832
20833 VkEvent event;
20834 VkEventCreateInfo event_create_info{};
20835 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20836 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20837
20838 VkCommandPool command_pool;
20839 VkCommandPoolCreateInfo pool_create_info{};
20840 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20841 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20842 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20843 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20844
20845 VkCommandBuffer command_buffer;
20846 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20847 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20848 command_buffer_allocate_info.commandPool = command_pool;
20849 command_buffer_allocate_info.commandBufferCount = 1;
20850 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20851 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20852
20853 VkQueue queue = VK_NULL_HANDLE;
20854 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20855
20856 {
20857 VkCommandBufferBeginInfo begin_info{};
20858 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20859 vkBeginCommandBuffer(command_buffer, &begin_info);
20860
20861 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 -070020862 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020863 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20864 vkEndCommandBuffer(command_buffer);
20865 }
20866 {
20867 VkSubmitInfo submit_info{};
20868 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20869 submit_info.commandBufferCount = 1;
20870 submit_info.pCommandBuffers = &command_buffer;
20871 submit_info.signalSemaphoreCount = 0;
20872 submit_info.pSignalSemaphores = nullptr;
20873 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20874 }
20875 { vkSetEvent(m_device->device(), event); }
20876
20877 vkQueueWaitIdle(queue);
20878
20879 vkDestroyEvent(m_device->device(), event, nullptr);
20880 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20881 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20882
20883 m_errorMonitor->VerifyNotFound();
20884}
20885// This is a positive test. No errors should be generated.
20886TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20887 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20888
Tony Barbour1fa09702017-03-16 12:09:08 -060020889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020890 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020891
20892 m_errorMonitor->ExpectSuccess();
20893
20894 VkQueryPool query_pool;
20895 VkQueryPoolCreateInfo query_pool_create_info{};
20896 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20897 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20898 query_pool_create_info.queryCount = 1;
20899 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20900
20901 VkCommandPool command_pool;
20902 VkCommandPoolCreateInfo pool_create_info{};
20903 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20904 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20905 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20906 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20907
20908 VkCommandBuffer command_buffer;
20909 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20910 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20911 command_buffer_allocate_info.commandPool = command_pool;
20912 command_buffer_allocate_info.commandBufferCount = 1;
20913 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20914 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20915
20916 VkCommandBuffer secondary_command_buffer;
20917 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20918 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20919
20920 VkQueue queue = VK_NULL_HANDLE;
20921 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20922
20923 uint32_t qfi = 0;
20924 VkBufferCreateInfo buff_create_info = {};
20925 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20926 buff_create_info.size = 1024;
20927 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20928 buff_create_info.queueFamilyIndexCount = 1;
20929 buff_create_info.pQueueFamilyIndices = &qfi;
20930
20931 VkResult err;
20932 VkBuffer buffer;
20933 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20934 ASSERT_VK_SUCCESS(err);
20935 VkMemoryAllocateInfo mem_alloc = {};
20936 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20937 mem_alloc.pNext = NULL;
20938 mem_alloc.allocationSize = 1024;
20939 mem_alloc.memoryTypeIndex = 0;
20940
20941 VkMemoryRequirements memReqs;
20942 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20943 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20944 if (!pass) {
20945 vkDestroyBuffer(m_device->device(), buffer, NULL);
20946 return;
20947 }
20948
20949 VkDeviceMemory mem;
20950 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20951 ASSERT_VK_SUCCESS(err);
20952 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20953 ASSERT_VK_SUCCESS(err);
20954
20955 VkCommandBufferInheritanceInfo hinfo = {};
20956 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20957 hinfo.renderPass = VK_NULL_HANDLE;
20958 hinfo.subpass = 0;
20959 hinfo.framebuffer = VK_NULL_HANDLE;
20960 hinfo.occlusionQueryEnable = VK_FALSE;
20961 hinfo.queryFlags = 0;
20962 hinfo.pipelineStatistics = 0;
20963
20964 {
20965 VkCommandBufferBeginInfo begin_info{};
20966 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20967 begin_info.pInheritanceInfo = &hinfo;
20968 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20969
20970 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20971 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20972
20973 vkEndCommandBuffer(secondary_command_buffer);
20974
20975 begin_info.pInheritanceInfo = nullptr;
20976 vkBeginCommandBuffer(command_buffer, &begin_info);
20977
20978 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20979 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20980
20981 vkEndCommandBuffer(command_buffer);
20982 }
20983 {
20984 VkSubmitInfo submit_info{};
20985 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20986 submit_info.commandBufferCount = 1;
20987 submit_info.pCommandBuffers = &command_buffer;
20988 submit_info.signalSemaphoreCount = 0;
20989 submit_info.pSignalSemaphores = nullptr;
20990 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20991 }
20992
20993 vkQueueWaitIdle(queue);
20994
20995 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20996 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20997 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20998 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20999 vkDestroyBuffer(m_device->device(), buffer, NULL);
21000 vkFreeMemory(m_device->device(), mem, NULL);
21001
21002 m_errorMonitor->VerifyNotFound();
21003}
21004
21005// This is a positive test. No errors should be generated.
21006TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
21007 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
21008
Tony Barbour1fa09702017-03-16 12:09:08 -060021009 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021010 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021011
21012 m_errorMonitor->ExpectSuccess();
21013
21014 VkQueryPool query_pool;
21015 VkQueryPoolCreateInfo query_pool_create_info{};
21016 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
21017 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
21018 query_pool_create_info.queryCount = 1;
21019 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
21020
21021 VkCommandPool command_pool;
21022 VkCommandPoolCreateInfo pool_create_info{};
21023 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21024 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21025 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21026 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21027
21028 VkCommandBuffer command_buffer[2];
21029 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21030 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21031 command_buffer_allocate_info.commandPool = command_pool;
21032 command_buffer_allocate_info.commandBufferCount = 2;
21033 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21034 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21035
21036 VkQueue queue = VK_NULL_HANDLE;
21037 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21038
21039 uint32_t qfi = 0;
21040 VkBufferCreateInfo buff_create_info = {};
21041 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
21042 buff_create_info.size = 1024;
21043 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
21044 buff_create_info.queueFamilyIndexCount = 1;
21045 buff_create_info.pQueueFamilyIndices = &qfi;
21046
21047 VkResult err;
21048 VkBuffer buffer;
21049 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
21050 ASSERT_VK_SUCCESS(err);
21051 VkMemoryAllocateInfo mem_alloc = {};
21052 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
21053 mem_alloc.pNext = NULL;
21054 mem_alloc.allocationSize = 1024;
21055 mem_alloc.memoryTypeIndex = 0;
21056
21057 VkMemoryRequirements memReqs;
21058 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
21059 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
21060 if (!pass) {
21061 vkDestroyBuffer(m_device->device(), buffer, NULL);
21062 return;
21063 }
21064
21065 VkDeviceMemory mem;
21066 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
21067 ASSERT_VK_SUCCESS(err);
21068 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
21069 ASSERT_VK_SUCCESS(err);
21070
21071 {
21072 VkCommandBufferBeginInfo begin_info{};
21073 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21074 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21075
21076 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
21077 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
21078
21079 vkEndCommandBuffer(command_buffer[0]);
21080
21081 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21082
21083 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
21084
21085 vkEndCommandBuffer(command_buffer[1]);
21086 }
21087 {
21088 VkSubmitInfo submit_info{};
21089 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21090 submit_info.commandBufferCount = 2;
21091 submit_info.pCommandBuffers = command_buffer;
21092 submit_info.signalSemaphoreCount = 0;
21093 submit_info.pSignalSemaphores = nullptr;
21094 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21095 }
21096
21097 vkQueueWaitIdle(queue);
21098
21099 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
21100 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
21101 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21102 vkDestroyBuffer(m_device->device(), buffer, NULL);
21103 vkFreeMemory(m_device->device(), mem, NULL);
21104
21105 m_errorMonitor->VerifyNotFound();
21106}
21107
Tony Barbourc46924f2016-11-04 11:49:52 -060021108TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021109 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
21110
Tony Barbour1fa09702017-03-16 12:09:08 -060021111 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021112 VkEvent event;
21113 VkEventCreateInfo event_create_info{};
21114 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
21115 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
21116
21117 VkCommandPool command_pool;
21118 VkCommandPoolCreateInfo pool_create_info{};
21119 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21120 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21121 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21122 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21123
21124 VkCommandBuffer command_buffer;
21125 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21126 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21127 command_buffer_allocate_info.commandPool = command_pool;
21128 command_buffer_allocate_info.commandBufferCount = 1;
21129 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21130 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
21131
21132 VkQueue queue = VK_NULL_HANDLE;
21133 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21134
21135 {
21136 VkCommandBufferBeginInfo begin_info{};
21137 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21138 vkBeginCommandBuffer(command_buffer, &begin_info);
21139
21140 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021141 vkEndCommandBuffer(command_buffer);
21142 }
21143 {
21144 VkSubmitInfo submit_info{};
21145 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21146 submit_info.commandBufferCount = 1;
21147 submit_info.pCommandBuffers = &command_buffer;
21148 submit_info.signalSemaphoreCount = 0;
21149 submit_info.pSignalSemaphores = nullptr;
21150 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21151 }
21152 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
21154 "that is already in use by a "
21155 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021156 vkSetEvent(m_device->device(), event);
21157 m_errorMonitor->VerifyFound();
21158 }
21159
21160 vkQueueWaitIdle(queue);
21161
21162 vkDestroyEvent(m_device->device(), event, nullptr);
21163 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
21164 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21165}
21166
21167// This is a positive test. No errors should be generated.
21168TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021169 TEST_DESCRIPTION(
21170 "Two command buffers with two separate fences are each "
21171 "run through a Submit & WaitForFences cycle 3 times. This "
21172 "previously revealed a bug so running this positive test "
21173 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021174 m_errorMonitor->ExpectSuccess();
21175
Tony Barbour1fa09702017-03-16 12:09:08 -060021176 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021177 VkQueue queue = VK_NULL_HANDLE;
21178 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
21179
21180 static const uint32_t NUM_OBJECTS = 2;
21181 static const uint32_t NUM_FRAMES = 3;
21182 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
21183 VkFence fences[NUM_OBJECTS] = {};
21184
21185 VkCommandPool cmd_pool;
21186 VkCommandPoolCreateInfo cmd_pool_ci = {};
21187 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21188 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
21189 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21190 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
21191 ASSERT_VK_SUCCESS(err);
21192
21193 VkCommandBufferAllocateInfo cmd_buf_info = {};
21194 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21195 cmd_buf_info.commandPool = cmd_pool;
21196 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21197 cmd_buf_info.commandBufferCount = 1;
21198
21199 VkFenceCreateInfo fence_ci = {};
21200 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21201 fence_ci.pNext = nullptr;
21202 fence_ci.flags = 0;
21203
21204 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21205 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
21206 ASSERT_VK_SUCCESS(err);
21207 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
21208 ASSERT_VK_SUCCESS(err);
21209 }
21210
21211 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
21212 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
21213 // Create empty cmd buffer
21214 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
21215 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21216
21217 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
21218 ASSERT_VK_SUCCESS(err);
21219 err = vkEndCommandBuffer(cmd_buffers[obj]);
21220 ASSERT_VK_SUCCESS(err);
21221
21222 VkSubmitInfo submit_info = {};
21223 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21224 submit_info.commandBufferCount = 1;
21225 submit_info.pCommandBuffers = &cmd_buffers[obj];
21226 // Submit cmd buffer and wait for fence
21227 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
21228 ASSERT_VK_SUCCESS(err);
21229 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
21230 ASSERT_VK_SUCCESS(err);
21231 err = vkResetFences(m_device->device(), 1, &fences[obj]);
21232 ASSERT_VK_SUCCESS(err);
21233 }
21234 }
21235 m_errorMonitor->VerifyNotFound();
21236 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
21237 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
21238 vkDestroyFence(m_device->device(), fences[i], nullptr);
21239 }
21240}
21241// This is a positive test. No errors should be generated.
21242TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021243 TEST_DESCRIPTION(
21244 "Two command buffers, each in a separate QueueSubmit call "
21245 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021246
Tony Barbour1fa09702017-03-16 12:09:08 -060021247 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021248 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021249
21250 m_errorMonitor->ExpectSuccess();
21251
21252 VkSemaphore semaphore;
21253 VkSemaphoreCreateInfo semaphore_create_info{};
21254 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21255 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21256
21257 VkCommandPool command_pool;
21258 VkCommandPoolCreateInfo pool_create_info{};
21259 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21260 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21261 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21262 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21263
21264 VkCommandBuffer command_buffer[2];
21265 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21266 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21267 command_buffer_allocate_info.commandPool = command_pool;
21268 command_buffer_allocate_info.commandBufferCount = 2;
21269 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21270 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21271
21272 VkQueue queue = VK_NULL_HANDLE;
21273 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21274
21275 {
21276 VkCommandBufferBeginInfo begin_info{};
21277 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21278 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21279
21280 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 -070021281 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021282
21283 VkViewport viewport{};
21284 viewport.maxDepth = 1.0f;
21285 viewport.minDepth = 0.0f;
21286 viewport.width = 512;
21287 viewport.height = 512;
21288 viewport.x = 0;
21289 viewport.y = 0;
21290 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21291 vkEndCommandBuffer(command_buffer[0]);
21292 }
21293 {
21294 VkCommandBufferBeginInfo begin_info{};
21295 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21296 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21297
21298 VkViewport viewport{};
21299 viewport.maxDepth = 1.0f;
21300 viewport.minDepth = 0.0f;
21301 viewport.width = 512;
21302 viewport.height = 512;
21303 viewport.x = 0;
21304 viewport.y = 0;
21305 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21306 vkEndCommandBuffer(command_buffer[1]);
21307 }
21308 {
21309 VkSubmitInfo submit_info{};
21310 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21311 submit_info.commandBufferCount = 1;
21312 submit_info.pCommandBuffers = &command_buffer[0];
21313 submit_info.signalSemaphoreCount = 1;
21314 submit_info.pSignalSemaphores = &semaphore;
21315 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21316 }
21317 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021318 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021319 VkSubmitInfo submit_info{};
21320 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21321 submit_info.commandBufferCount = 1;
21322 submit_info.pCommandBuffers = &command_buffer[1];
21323 submit_info.waitSemaphoreCount = 1;
21324 submit_info.pWaitSemaphores = &semaphore;
21325 submit_info.pWaitDstStageMask = flags;
21326 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21327 }
21328
21329 vkQueueWaitIdle(m_device->m_queue);
21330
21331 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21332 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21333 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21334
21335 m_errorMonitor->VerifyNotFound();
21336}
21337
21338// This is a positive test. No errors should be generated.
21339TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021340 TEST_DESCRIPTION(
21341 "Two command buffers, each in a separate QueueSubmit call "
21342 "submitted on separate queues, the second having a fence"
21343 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021344
Tony Barbour1fa09702017-03-16 12:09:08 -060021345 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021346 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021347
21348 m_errorMonitor->ExpectSuccess();
21349
21350 VkFence fence;
21351 VkFenceCreateInfo fence_create_info{};
21352 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21353 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21354
21355 VkSemaphore semaphore;
21356 VkSemaphoreCreateInfo semaphore_create_info{};
21357 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21358 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21359
21360 VkCommandPool command_pool;
21361 VkCommandPoolCreateInfo pool_create_info{};
21362 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21363 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21364 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21365 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21366
21367 VkCommandBuffer command_buffer[2];
21368 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21369 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21370 command_buffer_allocate_info.commandPool = command_pool;
21371 command_buffer_allocate_info.commandBufferCount = 2;
21372 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21373 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21374
21375 VkQueue queue = VK_NULL_HANDLE;
21376 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21377
21378 {
21379 VkCommandBufferBeginInfo begin_info{};
21380 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21381 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21382
21383 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 -070021384 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021385
21386 VkViewport viewport{};
21387 viewport.maxDepth = 1.0f;
21388 viewport.minDepth = 0.0f;
21389 viewport.width = 512;
21390 viewport.height = 512;
21391 viewport.x = 0;
21392 viewport.y = 0;
21393 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21394 vkEndCommandBuffer(command_buffer[0]);
21395 }
21396 {
21397 VkCommandBufferBeginInfo begin_info{};
21398 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21399 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21400
21401 VkViewport viewport{};
21402 viewport.maxDepth = 1.0f;
21403 viewport.minDepth = 0.0f;
21404 viewport.width = 512;
21405 viewport.height = 512;
21406 viewport.x = 0;
21407 viewport.y = 0;
21408 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21409 vkEndCommandBuffer(command_buffer[1]);
21410 }
21411 {
21412 VkSubmitInfo submit_info{};
21413 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21414 submit_info.commandBufferCount = 1;
21415 submit_info.pCommandBuffers = &command_buffer[0];
21416 submit_info.signalSemaphoreCount = 1;
21417 submit_info.pSignalSemaphores = &semaphore;
21418 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21419 }
21420 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021421 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021422 VkSubmitInfo submit_info{};
21423 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21424 submit_info.commandBufferCount = 1;
21425 submit_info.pCommandBuffers = &command_buffer[1];
21426 submit_info.waitSemaphoreCount = 1;
21427 submit_info.pWaitSemaphores = &semaphore;
21428 submit_info.pWaitDstStageMask = flags;
21429 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21430 }
21431
21432 vkQueueWaitIdle(m_device->m_queue);
21433
21434 vkDestroyFence(m_device->device(), fence, nullptr);
21435 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21436 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21437 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21438
21439 m_errorMonitor->VerifyNotFound();
21440}
21441
21442// This is a positive test. No errors should be generated.
21443TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021444 TEST_DESCRIPTION(
21445 "Two command buffers, each in a separate QueueSubmit call "
21446 "submitted on separate queues, the second having a fence"
21447 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021448
Tony Barbour1fa09702017-03-16 12:09:08 -060021449 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021450 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021451
21452 m_errorMonitor->ExpectSuccess();
21453
21454 VkFence fence;
21455 VkFenceCreateInfo fence_create_info{};
21456 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21457 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21458
21459 VkSemaphore semaphore;
21460 VkSemaphoreCreateInfo semaphore_create_info{};
21461 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21462 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21463
21464 VkCommandPool command_pool;
21465 VkCommandPoolCreateInfo pool_create_info{};
21466 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21467 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21468 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21469 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21470
21471 VkCommandBuffer command_buffer[2];
21472 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21473 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21474 command_buffer_allocate_info.commandPool = command_pool;
21475 command_buffer_allocate_info.commandBufferCount = 2;
21476 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21477 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21478
21479 VkQueue queue = VK_NULL_HANDLE;
21480 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21481
21482 {
21483 VkCommandBufferBeginInfo begin_info{};
21484 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21485 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21486
21487 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 -070021488 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021489
21490 VkViewport viewport{};
21491 viewport.maxDepth = 1.0f;
21492 viewport.minDepth = 0.0f;
21493 viewport.width = 512;
21494 viewport.height = 512;
21495 viewport.x = 0;
21496 viewport.y = 0;
21497 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21498 vkEndCommandBuffer(command_buffer[0]);
21499 }
21500 {
21501 VkCommandBufferBeginInfo begin_info{};
21502 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21503 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21504
21505 VkViewport viewport{};
21506 viewport.maxDepth = 1.0f;
21507 viewport.minDepth = 0.0f;
21508 viewport.width = 512;
21509 viewport.height = 512;
21510 viewport.x = 0;
21511 viewport.y = 0;
21512 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21513 vkEndCommandBuffer(command_buffer[1]);
21514 }
21515 {
21516 VkSubmitInfo submit_info{};
21517 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21518 submit_info.commandBufferCount = 1;
21519 submit_info.pCommandBuffers = &command_buffer[0];
21520 submit_info.signalSemaphoreCount = 1;
21521 submit_info.pSignalSemaphores = &semaphore;
21522 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21523 }
21524 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021525 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021526 VkSubmitInfo submit_info{};
21527 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21528 submit_info.commandBufferCount = 1;
21529 submit_info.pCommandBuffers = &command_buffer[1];
21530 submit_info.waitSemaphoreCount = 1;
21531 submit_info.pWaitSemaphores = &semaphore;
21532 submit_info.pWaitDstStageMask = flags;
21533 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21534 }
21535
21536 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21537 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21538
21539 vkDestroyFence(m_device->device(), fence, nullptr);
21540 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21541 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21542 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21543
21544 m_errorMonitor->VerifyNotFound();
21545}
21546
21547TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021548 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021549 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021550 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021551 return;
21552 }
21553
21554 VkResult err;
21555
21556 m_errorMonitor->ExpectSuccess();
21557
21558 VkQueue q0 = m_device->m_queue;
21559 VkQueue q1 = nullptr;
21560 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21561 ASSERT_NE(q1, nullptr);
21562
21563 // An (empty) command buffer. We must have work in the first submission --
21564 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021565 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021566 VkCommandPool pool;
21567 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21568 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021569 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21570 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021571 VkCommandBuffer cb;
21572 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21573 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021574 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021575 err = vkBeginCommandBuffer(cb, &cbbi);
21576 ASSERT_VK_SUCCESS(err);
21577 err = vkEndCommandBuffer(cb);
21578 ASSERT_VK_SUCCESS(err);
21579
21580 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021581 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021582 VkSemaphore s;
21583 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21584 ASSERT_VK_SUCCESS(err);
21585
21586 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021587 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021588
21589 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21590 ASSERT_VK_SUCCESS(err);
21591
21592 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021593 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021594 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021595
21596 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21597 ASSERT_VK_SUCCESS(err);
21598
21599 // Wait for q0 idle
21600 err = vkQueueWaitIdle(q0);
21601 ASSERT_VK_SUCCESS(err);
21602
21603 // Command buffer should have been completed (it was on q0); reset the pool.
21604 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21605
21606 m_errorMonitor->VerifyNotFound();
21607
21608 // Force device completely idle and clean up resources
21609 vkDeviceWaitIdle(m_device->device());
21610 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21611 vkDestroySemaphore(m_device->device(), s, nullptr);
21612}
21613
21614// This is a positive test. No errors should be generated.
21615TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021616 TEST_DESCRIPTION(
21617 "Two command buffers, each in a separate QueueSubmit call "
21618 "submitted on separate queues, the second having a fence, "
21619 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021620
Tony Barbour1fa09702017-03-16 12:09:08 -060021621 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021622 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021623
21624 m_errorMonitor->ExpectSuccess();
21625
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021626 VkFence fence;
21627 VkFenceCreateInfo fence_create_info{};
21628 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21629 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21630
21631 VkSemaphore semaphore;
21632 VkSemaphoreCreateInfo semaphore_create_info{};
21633 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21634 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21635
21636 VkCommandPool command_pool;
21637 VkCommandPoolCreateInfo pool_create_info{};
21638 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21639 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21640 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21641 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21642
21643 VkCommandBuffer command_buffer[2];
21644 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21645 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21646 command_buffer_allocate_info.commandPool = command_pool;
21647 command_buffer_allocate_info.commandBufferCount = 2;
21648 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21649 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21650
21651 VkQueue queue = VK_NULL_HANDLE;
21652 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21653
21654 {
21655 VkCommandBufferBeginInfo begin_info{};
21656 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21657 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21658
21659 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 -070021660 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021661
21662 VkViewport viewport{};
21663 viewport.maxDepth = 1.0f;
21664 viewport.minDepth = 0.0f;
21665 viewport.width = 512;
21666 viewport.height = 512;
21667 viewport.x = 0;
21668 viewport.y = 0;
21669 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21670 vkEndCommandBuffer(command_buffer[0]);
21671 }
21672 {
21673 VkCommandBufferBeginInfo begin_info{};
21674 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21675 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21676
21677 VkViewport viewport{};
21678 viewport.maxDepth = 1.0f;
21679 viewport.minDepth = 0.0f;
21680 viewport.width = 512;
21681 viewport.height = 512;
21682 viewport.x = 0;
21683 viewport.y = 0;
21684 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21685 vkEndCommandBuffer(command_buffer[1]);
21686 }
21687 {
21688 VkSubmitInfo submit_info{};
21689 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21690 submit_info.commandBufferCount = 1;
21691 submit_info.pCommandBuffers = &command_buffer[0];
21692 submit_info.signalSemaphoreCount = 1;
21693 submit_info.pSignalSemaphores = &semaphore;
21694 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21695 }
21696 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021697 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021698 VkSubmitInfo submit_info{};
21699 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21700 submit_info.commandBufferCount = 1;
21701 submit_info.pCommandBuffers = &command_buffer[1];
21702 submit_info.waitSemaphoreCount = 1;
21703 submit_info.pWaitSemaphores = &semaphore;
21704 submit_info.pWaitDstStageMask = flags;
21705 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21706 }
21707
21708 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21709
21710 vkDestroyFence(m_device->device(), fence, nullptr);
21711 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21712 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21713 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21714
21715 m_errorMonitor->VerifyNotFound();
21716}
21717
21718// This is a positive test. No errors should be generated.
21719TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021720 TEST_DESCRIPTION(
21721 "Two command buffers, each in a separate QueueSubmit call "
21722 "on the same queue, sharing a signal/wait semaphore, the "
21723 "second having a fence, "
21724 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021725
21726 m_errorMonitor->ExpectSuccess();
21727
Tony Barbour1fa09702017-03-16 12:09:08 -060021728 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021729 VkFence fence;
21730 VkFenceCreateInfo fence_create_info{};
21731 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21732 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21733
21734 VkSemaphore semaphore;
21735 VkSemaphoreCreateInfo semaphore_create_info{};
21736 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21737 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21738
21739 VkCommandPool command_pool;
21740 VkCommandPoolCreateInfo pool_create_info{};
21741 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21742 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21743 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21744 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21745
21746 VkCommandBuffer command_buffer[2];
21747 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21748 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21749 command_buffer_allocate_info.commandPool = command_pool;
21750 command_buffer_allocate_info.commandBufferCount = 2;
21751 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21752 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21753
21754 {
21755 VkCommandBufferBeginInfo begin_info{};
21756 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21757 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21758
21759 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 -070021760 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021761
21762 VkViewport viewport{};
21763 viewport.maxDepth = 1.0f;
21764 viewport.minDepth = 0.0f;
21765 viewport.width = 512;
21766 viewport.height = 512;
21767 viewport.x = 0;
21768 viewport.y = 0;
21769 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21770 vkEndCommandBuffer(command_buffer[0]);
21771 }
21772 {
21773 VkCommandBufferBeginInfo begin_info{};
21774 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21775 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21776
21777 VkViewport viewport{};
21778 viewport.maxDepth = 1.0f;
21779 viewport.minDepth = 0.0f;
21780 viewport.width = 512;
21781 viewport.height = 512;
21782 viewport.x = 0;
21783 viewport.y = 0;
21784 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21785 vkEndCommandBuffer(command_buffer[1]);
21786 }
21787 {
21788 VkSubmitInfo submit_info{};
21789 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21790 submit_info.commandBufferCount = 1;
21791 submit_info.pCommandBuffers = &command_buffer[0];
21792 submit_info.signalSemaphoreCount = 1;
21793 submit_info.pSignalSemaphores = &semaphore;
21794 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21795 }
21796 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021797 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021798 VkSubmitInfo submit_info{};
21799 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21800 submit_info.commandBufferCount = 1;
21801 submit_info.pCommandBuffers = &command_buffer[1];
21802 submit_info.waitSemaphoreCount = 1;
21803 submit_info.pWaitSemaphores = &semaphore;
21804 submit_info.pWaitDstStageMask = flags;
21805 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21806 }
21807
21808 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21809
21810 vkDestroyFence(m_device->device(), fence, nullptr);
21811 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21812 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21813 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21814
21815 m_errorMonitor->VerifyNotFound();
21816}
21817
21818// This is a positive test. No errors should be generated.
21819TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021820 TEST_DESCRIPTION(
21821 "Two command buffers, each in a separate QueueSubmit call "
21822 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21823 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021824
21825 m_errorMonitor->ExpectSuccess();
21826
Tony Barbour1fa09702017-03-16 12:09:08 -060021827 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021828 VkFence fence;
21829 VkFenceCreateInfo fence_create_info{};
21830 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21831 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21832
21833 VkCommandPool command_pool;
21834 VkCommandPoolCreateInfo pool_create_info{};
21835 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21836 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21837 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21838 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21839
21840 VkCommandBuffer command_buffer[2];
21841 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21842 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21843 command_buffer_allocate_info.commandPool = command_pool;
21844 command_buffer_allocate_info.commandBufferCount = 2;
21845 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21846 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21847
21848 {
21849 VkCommandBufferBeginInfo begin_info{};
21850 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21851 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21852
21853 vkCmdPipelineBarrier(command_buffer[0], VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021854 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021855
21856 VkViewport viewport{};
21857 viewport.maxDepth = 1.0f;
21858 viewport.minDepth = 0.0f;
21859 viewport.width = 512;
21860 viewport.height = 512;
21861 viewport.x = 0;
21862 viewport.y = 0;
21863 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21864 vkEndCommandBuffer(command_buffer[0]);
21865 }
21866 {
21867 VkCommandBufferBeginInfo begin_info{};
21868 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21869 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21870
21871 VkViewport viewport{};
21872 viewport.maxDepth = 1.0f;
21873 viewport.minDepth = 0.0f;
21874 viewport.width = 512;
21875 viewport.height = 512;
21876 viewport.x = 0;
21877 viewport.y = 0;
21878 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21879 vkEndCommandBuffer(command_buffer[1]);
21880 }
21881 {
21882 VkSubmitInfo submit_info{};
21883 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21884 submit_info.commandBufferCount = 1;
21885 submit_info.pCommandBuffers = &command_buffer[0];
21886 submit_info.signalSemaphoreCount = 0;
21887 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21888 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21889 }
21890 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021891 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021892 VkSubmitInfo submit_info{};
21893 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21894 submit_info.commandBufferCount = 1;
21895 submit_info.pCommandBuffers = &command_buffer[1];
21896 submit_info.waitSemaphoreCount = 0;
21897 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21898 submit_info.pWaitDstStageMask = flags;
21899 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21900 }
21901
21902 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21903
21904 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21905 ASSERT_VK_SUCCESS(err);
21906
21907 vkDestroyFence(m_device->device(), fence, nullptr);
21908 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21909 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21910
21911 m_errorMonitor->VerifyNotFound();
21912}
21913
21914// This is a positive test. No errors should be generated.
21915TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021916 TEST_DESCRIPTION(
21917 "Two command buffers, each in a separate QueueSubmit call "
21918 "on the same queue, the second having a fence, followed "
21919 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021920
21921 m_errorMonitor->ExpectSuccess();
21922
Tony Barbour1fa09702017-03-16 12:09:08 -060021923 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021924 VkFence fence;
21925 VkFenceCreateInfo fence_create_info{};
21926 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21927 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21928
21929 VkCommandPool command_pool;
21930 VkCommandPoolCreateInfo pool_create_info{};
21931 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21932 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21933 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21934 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21935
21936 VkCommandBuffer command_buffer[2];
21937 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21938 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21939 command_buffer_allocate_info.commandPool = command_pool;
21940 command_buffer_allocate_info.commandBufferCount = 2;
21941 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21942 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21943
21944 {
21945 VkCommandBufferBeginInfo begin_info{};
21946 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21947 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21948
21949 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 -070021950 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021951
21952 VkViewport viewport{};
21953 viewport.maxDepth = 1.0f;
21954 viewport.minDepth = 0.0f;
21955 viewport.width = 512;
21956 viewport.height = 512;
21957 viewport.x = 0;
21958 viewport.y = 0;
21959 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21960 vkEndCommandBuffer(command_buffer[0]);
21961 }
21962 {
21963 VkCommandBufferBeginInfo begin_info{};
21964 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21965 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21966
21967 VkViewport viewport{};
21968 viewport.maxDepth = 1.0f;
21969 viewport.minDepth = 0.0f;
21970 viewport.width = 512;
21971 viewport.height = 512;
21972 viewport.x = 0;
21973 viewport.y = 0;
21974 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21975 vkEndCommandBuffer(command_buffer[1]);
21976 }
21977 {
21978 VkSubmitInfo submit_info{};
21979 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21980 submit_info.commandBufferCount = 1;
21981 submit_info.pCommandBuffers = &command_buffer[0];
21982 submit_info.signalSemaphoreCount = 0;
21983 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21984 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21985 }
21986 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021987 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021988 VkSubmitInfo submit_info{};
21989 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21990 submit_info.commandBufferCount = 1;
21991 submit_info.pCommandBuffers = &command_buffer[1];
21992 submit_info.waitSemaphoreCount = 0;
21993 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21994 submit_info.pWaitDstStageMask = flags;
21995 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21996 }
21997
21998 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21999
22000 vkDestroyFence(m_device->device(), fence, nullptr);
22001 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22002 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22003
22004 m_errorMonitor->VerifyNotFound();
22005}
22006
22007// This is a positive test. No errors should be generated.
22008TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022009 TEST_DESCRIPTION(
22010 "Two command buffers each in a separate SubmitInfo sent in a single "
22011 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060022012 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022013
22014 m_errorMonitor->ExpectSuccess();
22015
22016 VkFence fence;
22017 VkFenceCreateInfo fence_create_info{};
22018 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
22019 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
22020
22021 VkSemaphore semaphore;
22022 VkSemaphoreCreateInfo semaphore_create_info{};
22023 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
22024 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
22025
22026 VkCommandPool command_pool;
22027 VkCommandPoolCreateInfo pool_create_info{};
22028 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
22029 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
22030 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
22031 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
22032
22033 VkCommandBuffer command_buffer[2];
22034 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
22035 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22036 command_buffer_allocate_info.commandPool = command_pool;
22037 command_buffer_allocate_info.commandBufferCount = 2;
22038 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22039 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
22040
22041 {
22042 VkCommandBufferBeginInfo begin_info{};
22043 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22044 vkBeginCommandBuffer(command_buffer[0], &begin_info);
22045
22046 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 -070022047 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022048
22049 VkViewport viewport{};
22050 viewport.maxDepth = 1.0f;
22051 viewport.minDepth = 0.0f;
22052 viewport.width = 512;
22053 viewport.height = 512;
22054 viewport.x = 0;
22055 viewport.y = 0;
22056 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
22057 vkEndCommandBuffer(command_buffer[0]);
22058 }
22059 {
22060 VkCommandBufferBeginInfo begin_info{};
22061 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22062 vkBeginCommandBuffer(command_buffer[1], &begin_info);
22063
22064 VkViewport viewport{};
22065 viewport.maxDepth = 1.0f;
22066 viewport.minDepth = 0.0f;
22067 viewport.width = 512;
22068 viewport.height = 512;
22069 viewport.x = 0;
22070 viewport.y = 0;
22071 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
22072 vkEndCommandBuffer(command_buffer[1]);
22073 }
22074 {
22075 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022076 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022077
22078 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22079 submit_info[0].pNext = NULL;
22080 submit_info[0].commandBufferCount = 1;
22081 submit_info[0].pCommandBuffers = &command_buffer[0];
22082 submit_info[0].signalSemaphoreCount = 1;
22083 submit_info[0].pSignalSemaphores = &semaphore;
22084 submit_info[0].waitSemaphoreCount = 0;
22085 submit_info[0].pWaitSemaphores = NULL;
22086 submit_info[0].pWaitDstStageMask = 0;
22087
22088 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
22089 submit_info[1].pNext = NULL;
22090 submit_info[1].commandBufferCount = 1;
22091 submit_info[1].pCommandBuffers = &command_buffer[1];
22092 submit_info[1].waitSemaphoreCount = 1;
22093 submit_info[1].pWaitSemaphores = &semaphore;
22094 submit_info[1].pWaitDstStageMask = flags;
22095 submit_info[1].signalSemaphoreCount = 0;
22096 submit_info[1].pSignalSemaphores = NULL;
22097 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
22098 }
22099
22100 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
22101
22102 vkDestroyFence(m_device->device(), fence, nullptr);
22103 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
22104 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
22105 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
22106
22107 m_errorMonitor->VerifyNotFound();
22108}
22109
22110TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
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
Tony Barbour552f6c02016-12-21 14:34:07 -070022116 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022117
22118 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
22119 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22120 m_errorMonitor->VerifyNotFound();
22121 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
22122 m_errorMonitor->VerifyNotFound();
22123 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
22124 m_errorMonitor->VerifyNotFound();
22125
22126 m_commandBuffer->EndCommandBuffer();
22127 m_errorMonitor->VerifyNotFound();
22128}
22129
22130TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022131 TEST_DESCRIPTION(
22132 "Positive test where we create a renderpass with an "
22133 "attachment that uses LOAD_OP_CLEAR, the first subpass "
22134 "has a valid layout, and a second subpass then uses a "
22135 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022136 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060022137 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022138 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022139 if (!depth_format) {
22140 printf(" No Depth + Stencil format found. Skipped.\n");
22141 return;
22142 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022143
22144 VkAttachmentReference attach[2] = {};
22145 attach[0].attachment = 0;
22146 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22147 attach[1].attachment = 0;
22148 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22149 VkSubpassDescription subpasses[2] = {};
22150 // First subpass clears DS attach on load
22151 subpasses[0].pDepthStencilAttachment = &attach[0];
22152 // 2nd subpass reads in DS as input attachment
22153 subpasses[1].inputAttachmentCount = 1;
22154 subpasses[1].pInputAttachments = &attach[1];
22155 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070022156 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022157 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
22158 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
22159 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
22160 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22161 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
22162 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
22163 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
22164 VkRenderPassCreateInfo rpci = {};
22165 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
22166 rpci.attachmentCount = 1;
22167 rpci.pAttachments = &attach_desc;
22168 rpci.subpassCount = 2;
22169 rpci.pSubpasses = subpasses;
22170
22171 // Now create RenderPass and verify no errors
22172 VkRenderPass rp;
22173 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
22174 m_errorMonitor->VerifyNotFound();
22175
22176 vkDestroyRenderPass(m_device->device(), rp, NULL);
22177}
22178
Tobin Ehlis01103de2017-02-16 13:22:47 -070022179TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
22180 TEST_DESCRIPTION(
22181 "Create a render pass with depth-stencil attachment where layout transition "
22182 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
22183 "transition has correctly occurred at queue submit time with no validation errors.");
22184
Tony Barbour1fa09702017-03-16 12:09:08 -060022185 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton1d2022c2017-03-29 11:43:58 -060022186 auto depth_format = FindSupportedDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070022187 if (!depth_format) {
22188 printf(" No Depth + Stencil format found. Skipped.\n");
22189 return;
22190 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070022191 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070022192 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022193 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
22194 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070022195 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070022196 return;
22197 }
22198
22199 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070022200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22201
22202 // A renderpass with one depth/stencil attachment.
22203 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070022204 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022205 VK_SAMPLE_COUNT_1_BIT,
22206 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22207 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22208 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
22209 VK_ATTACHMENT_STORE_OP_DONT_CARE,
22210 VK_IMAGE_LAYOUT_UNDEFINED,
22211 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22212
22213 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
22214
22215 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
22216
22217 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
22218
22219 VkRenderPass rp;
22220 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22221 ASSERT_VK_SUCCESS(err);
22222 // A compatible ds image.
22223 VkImageObj image(m_device);
Jeremy Hayesf6bfa6b2017-04-04 15:05:52 -060022224 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 -070022225 ASSERT_TRUE(image.initialized());
22226
22227 VkImageViewCreateInfo ivci = {
22228 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
22229 nullptr,
22230 0,
22231 image.handle(),
22232 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070022233 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070022234 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
22235 VK_COMPONENT_SWIZZLE_IDENTITY},
22236 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
22237 };
22238 VkImageView view;
22239 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22240 ASSERT_VK_SUCCESS(err);
22241
22242 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22243 VkFramebuffer fb;
22244 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22245 ASSERT_VK_SUCCESS(err);
22246
22247 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22248 m_commandBuffer->BeginCommandBuffer();
22249 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22250 vkCmdEndRenderPass(m_commandBuffer->handle());
22251 m_commandBuffer->EndCommandBuffer();
22252 QueueCommandBuffer(false);
22253 m_errorMonitor->VerifyNotFound();
22254
22255 // Cleanup
22256 vkDestroyImageView(m_device->device(), view, NULL);
22257 vkDestroyRenderPass(m_device->device(), rp, NULL);
22258 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22259}
22260
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022261TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022262 TEST_DESCRIPTION(
22263 "Test that pipeline validation accepts matrices passed "
22264 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022265 m_errorMonitor->ExpectSuccess();
22266
Tony Barbour1fa09702017-03-16 12:09:08 -060022267 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22269
22270 VkVertexInputBindingDescription input_binding;
22271 memset(&input_binding, 0, sizeof(input_binding));
22272
22273 VkVertexInputAttributeDescription input_attribs[2];
22274 memset(input_attribs, 0, sizeof(input_attribs));
22275
22276 for (int i = 0; i < 2; i++) {
22277 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22278 input_attribs[i].location = i;
22279 }
22280
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022281 char const *vsSource =
22282 "#version 450\n"
22283 "\n"
22284 "layout(location=0) in mat2x4 x;\n"
22285 "out gl_PerVertex {\n"
22286 " vec4 gl_Position;\n"
22287 "};\n"
22288 "void main(){\n"
22289 " gl_Position = x[0] + x[1];\n"
22290 "}\n";
22291 char const *fsSource =
22292 "#version 450\n"
22293 "\n"
22294 "layout(location=0) out vec4 color;\n"
22295 "void main(){\n"
22296 " color = vec4(1);\n"
22297 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022298
22299 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22300 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22301
22302 VkPipelineObj pipe(m_device);
22303 pipe.AddColorAttachment();
22304 pipe.AddShader(&vs);
22305 pipe.AddShader(&fs);
22306
22307 pipe.AddVertexInputBindings(&input_binding, 1);
22308 pipe.AddVertexInputAttribs(input_attribs, 2);
22309
22310 VkDescriptorSetObj descriptorSet(m_device);
22311 descriptorSet.AppendDummy();
22312 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22313
22314 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22315
22316 /* expect success */
22317 m_errorMonitor->VerifyNotFound();
22318}
22319
22320TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22321 m_errorMonitor->ExpectSuccess();
22322
Tony Barbour1fa09702017-03-16 12:09:08 -060022323 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22325
22326 VkVertexInputBindingDescription input_binding;
22327 memset(&input_binding, 0, sizeof(input_binding));
22328
22329 VkVertexInputAttributeDescription input_attribs[2];
22330 memset(input_attribs, 0, sizeof(input_attribs));
22331
22332 for (int i = 0; i < 2; i++) {
22333 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22334 input_attribs[i].location = i;
22335 }
22336
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022337 char const *vsSource =
22338 "#version 450\n"
22339 "\n"
22340 "layout(location=0) in vec4 x[2];\n"
22341 "out gl_PerVertex {\n"
22342 " vec4 gl_Position;\n"
22343 "};\n"
22344 "void main(){\n"
22345 " gl_Position = x[0] + x[1];\n"
22346 "}\n";
22347 char const *fsSource =
22348 "#version 450\n"
22349 "\n"
22350 "layout(location=0) out vec4 color;\n"
22351 "void main(){\n"
22352 " color = vec4(1);\n"
22353 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022354
22355 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22356 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22357
22358 VkPipelineObj pipe(m_device);
22359 pipe.AddColorAttachment();
22360 pipe.AddShader(&vs);
22361 pipe.AddShader(&fs);
22362
22363 pipe.AddVertexInputBindings(&input_binding, 1);
22364 pipe.AddVertexInputAttribs(input_attribs, 2);
22365
22366 VkDescriptorSetObj descriptorSet(m_device);
22367 descriptorSet.AppendDummy();
22368 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22369
22370 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22371
22372 m_errorMonitor->VerifyNotFound();
22373}
22374
22375TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022376 TEST_DESCRIPTION(
22377 "Test that pipeline validation accepts consuming a vertex attribute "
22378 "through multiple vertex shader inputs, each consuming a different "
22379 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022380 m_errorMonitor->ExpectSuccess();
22381
Tony Barbour1fa09702017-03-16 12:09:08 -060022382 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22384
22385 VkVertexInputBindingDescription input_binding;
22386 memset(&input_binding, 0, sizeof(input_binding));
22387
22388 VkVertexInputAttributeDescription input_attribs[3];
22389 memset(input_attribs, 0, sizeof(input_attribs));
22390
22391 for (int i = 0; i < 3; i++) {
22392 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22393 input_attribs[i].location = i;
22394 }
22395
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022396 char const *vsSource =
22397 "#version 450\n"
22398 "\n"
22399 "layout(location=0) in vec4 x;\n"
22400 "layout(location=1) in vec3 y1;\n"
22401 "layout(location=1, component=3) in float y2;\n"
22402 "layout(location=2) in vec4 z;\n"
22403 "out gl_PerVertex {\n"
22404 " vec4 gl_Position;\n"
22405 "};\n"
22406 "void main(){\n"
22407 " gl_Position = x + vec4(y1, y2) + z;\n"
22408 "}\n";
22409 char const *fsSource =
22410 "#version 450\n"
22411 "\n"
22412 "layout(location=0) out vec4 color;\n"
22413 "void main(){\n"
22414 " color = vec4(1);\n"
22415 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022416
22417 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22418 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22419
22420 VkPipelineObj pipe(m_device);
22421 pipe.AddColorAttachment();
22422 pipe.AddShader(&vs);
22423 pipe.AddShader(&fs);
22424
22425 pipe.AddVertexInputBindings(&input_binding, 1);
22426 pipe.AddVertexInputAttribs(input_attribs, 3);
22427
22428 VkDescriptorSetObj descriptorSet(m_device);
22429 descriptorSet.AppendDummy();
22430 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22431
22432 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22433
22434 m_errorMonitor->VerifyNotFound();
22435}
22436
22437TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22438 m_errorMonitor->ExpectSuccess();
22439
Tony Barbour1fa09702017-03-16 12:09:08 -060022440 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022441 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22442
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022443 char const *vsSource =
22444 "#version 450\n"
22445 "out gl_PerVertex {\n"
22446 " vec4 gl_Position;\n"
22447 "};\n"
22448 "void main(){\n"
22449 " gl_Position = vec4(0);\n"
22450 "}\n";
22451 char const *fsSource =
22452 "#version 450\n"
22453 "\n"
22454 "layout(location=0) out vec4 color;\n"
22455 "void main(){\n"
22456 " color = vec4(1);\n"
22457 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022458
22459 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22460 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22461
22462 VkPipelineObj pipe(m_device);
22463 pipe.AddColorAttachment();
22464 pipe.AddShader(&vs);
22465 pipe.AddShader(&fs);
22466
22467 VkDescriptorSetObj descriptorSet(m_device);
22468 descriptorSet.AppendDummy();
22469 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22470
22471 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22472
22473 m_errorMonitor->VerifyNotFound();
22474}
22475
22476TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022477 TEST_DESCRIPTION(
22478 "Test that pipeline validation accepts the relaxed type matching rules "
22479 "set out in 14.1.3: fundamental type must match, and producer side must "
22480 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022481 m_errorMonitor->ExpectSuccess();
22482
22483 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22484
Tony Barbour1fa09702017-03-16 12:09:08 -060022485 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22487
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022488 char const *vsSource =
22489 "#version 450\n"
22490 "out gl_PerVertex {\n"
22491 " vec4 gl_Position;\n"
22492 "};\n"
22493 "layout(location=0) out vec3 x;\n"
22494 "layout(location=1) out ivec3 y;\n"
22495 "layout(location=2) out vec3 z;\n"
22496 "void main(){\n"
22497 " gl_Position = vec4(0);\n"
22498 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22499 "}\n";
22500 char const *fsSource =
22501 "#version 450\n"
22502 "\n"
22503 "layout(location=0) out vec4 color;\n"
22504 "layout(location=0) in float x;\n"
22505 "layout(location=1) flat in int y;\n"
22506 "layout(location=2) in vec2 z;\n"
22507 "void main(){\n"
22508 " color = vec4(1 + x + y + z.x);\n"
22509 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022510
22511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22513
22514 VkPipelineObj pipe(m_device);
22515 pipe.AddColorAttachment();
22516 pipe.AddShader(&vs);
22517 pipe.AddShader(&fs);
22518
22519 VkDescriptorSetObj descriptorSet(m_device);
22520 descriptorSet.AppendDummy();
22521 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22522
22523 VkResult err = VK_SUCCESS;
22524 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22525 ASSERT_VK_SUCCESS(err);
22526
22527 m_errorMonitor->VerifyNotFound();
22528}
22529
22530TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022531 TEST_DESCRIPTION(
22532 "Test that pipeline validation accepts per-vertex variables "
22533 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022534 m_errorMonitor->ExpectSuccess();
22535
Tony Barbour1fa09702017-03-16 12:09:08 -060022536 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22538
22539 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022540 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022541 return;
22542 }
22543
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022544 char const *vsSource =
22545 "#version 450\n"
22546 "void main(){}\n";
22547 char const *tcsSource =
22548 "#version 450\n"
22549 "layout(location=0) out int x[];\n"
22550 "layout(vertices=3) out;\n"
22551 "void main(){\n"
22552 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22553 " gl_TessLevelInner[0] = 1;\n"
22554 " x[gl_InvocationID] = gl_InvocationID;\n"
22555 "}\n";
22556 char const *tesSource =
22557 "#version 450\n"
22558 "layout(triangles, equal_spacing, cw) in;\n"
22559 "layout(location=0) in int x[];\n"
22560 "out gl_PerVertex { vec4 gl_Position; };\n"
22561 "void main(){\n"
22562 " gl_Position.xyz = gl_TessCoord;\n"
22563 " gl_Position.w = x[0] + x[1] + x[2];\n"
22564 "}\n";
22565 char const *fsSource =
22566 "#version 450\n"
22567 "layout(location=0) out vec4 color;\n"
22568 "void main(){\n"
22569 " color = vec4(1);\n"
22570 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022571
22572 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22573 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22574 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22575 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22576
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022577 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22578 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022579
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022580 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022581
22582 VkPipelineObj pipe(m_device);
22583 pipe.SetInputAssembly(&iasci);
22584 pipe.SetTessellation(&tsci);
22585 pipe.AddColorAttachment();
22586 pipe.AddShader(&vs);
22587 pipe.AddShader(&tcs);
22588 pipe.AddShader(&tes);
22589 pipe.AddShader(&fs);
22590
22591 VkDescriptorSetObj descriptorSet(m_device);
22592 descriptorSet.AppendDummy();
22593 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22594
22595 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22596
22597 m_errorMonitor->VerifyNotFound();
22598}
22599
22600TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022601 TEST_DESCRIPTION(
22602 "Test that pipeline validation accepts a user-defined "
22603 "interface block passed into the geometry shader. This "
22604 "is interesting because the 'extra' array level is not "
22605 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022606 m_errorMonitor->ExpectSuccess();
22607
Tony Barbour1fa09702017-03-16 12:09:08 -060022608 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022609 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22610
22611 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022612 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022613 return;
22614 }
22615
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022616 char const *vsSource =
22617 "#version 450\n"
22618 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22619 "void main(){\n"
22620 " vs_out.x = vec4(1);\n"
22621 "}\n";
22622 char const *gsSource =
22623 "#version 450\n"
22624 "layout(triangles) in;\n"
22625 "layout(triangle_strip, max_vertices=3) out;\n"
22626 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22627 "out gl_PerVertex { vec4 gl_Position; };\n"
22628 "void main() {\n"
22629 " gl_Position = gs_in[0].x;\n"
22630 " EmitVertex();\n"
22631 "}\n";
22632 char const *fsSource =
22633 "#version 450\n"
22634 "layout(location=0) out vec4 color;\n"
22635 "void main(){\n"
22636 " color = vec4(1);\n"
22637 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022638
22639 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22640 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22641 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22642
22643 VkPipelineObj pipe(m_device);
22644 pipe.AddColorAttachment();
22645 pipe.AddShader(&vs);
22646 pipe.AddShader(&gs);
22647 pipe.AddShader(&fs);
22648
22649 VkDescriptorSetObj descriptorSet(m_device);
22650 descriptorSet.AppendDummy();
22651 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22652
22653 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22654
22655 m_errorMonitor->VerifyNotFound();
22656}
22657
22658TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022659 TEST_DESCRIPTION(
22660 "Test that pipeline validation accepts basic use of 64bit vertex "
22661 "attributes. This is interesting because they consume multiple "
22662 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022663 m_errorMonitor->ExpectSuccess();
22664
Tony Barbour1fa09702017-03-16 12:09:08 -060022665 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22667
22668 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022669 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022670 return;
22671 }
22672
22673 VkVertexInputBindingDescription input_bindings[1];
22674 memset(input_bindings, 0, sizeof(input_bindings));
22675
22676 VkVertexInputAttributeDescription input_attribs[4];
22677 memset(input_attribs, 0, sizeof(input_attribs));
22678 input_attribs[0].location = 0;
22679 input_attribs[0].offset = 0;
22680 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22681 input_attribs[1].location = 2;
22682 input_attribs[1].offset = 32;
22683 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22684 input_attribs[2].location = 4;
22685 input_attribs[2].offset = 64;
22686 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22687 input_attribs[3].location = 6;
22688 input_attribs[3].offset = 96;
22689 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22690
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022691 char const *vsSource =
22692 "#version 450\n"
22693 "\n"
22694 "layout(location=0) in dmat4 x;\n"
22695 "out gl_PerVertex {\n"
22696 " vec4 gl_Position;\n"
22697 "};\n"
22698 "void main(){\n"
22699 " gl_Position = vec4(x[0][0]);\n"
22700 "}\n";
22701 char const *fsSource =
22702 "#version 450\n"
22703 "\n"
22704 "layout(location=0) out vec4 color;\n"
22705 "void main(){\n"
22706 " color = vec4(1);\n"
22707 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022708
22709 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22710 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22711
22712 VkPipelineObj pipe(m_device);
22713 pipe.AddColorAttachment();
22714 pipe.AddShader(&vs);
22715 pipe.AddShader(&fs);
22716
22717 pipe.AddVertexInputBindings(input_bindings, 1);
22718 pipe.AddVertexInputAttribs(input_attribs, 4);
22719
22720 VkDescriptorSetObj descriptorSet(m_device);
22721 descriptorSet.AppendDummy();
22722 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22723
22724 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22725
22726 m_errorMonitor->VerifyNotFound();
22727}
22728
22729TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22730 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22731 m_errorMonitor->ExpectSuccess();
22732
Tony Barbour1fa09702017-03-16 12:09:08 -060022733 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022734
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022735 char const *vsSource =
22736 "#version 450\n"
22737 "\n"
22738 "out gl_PerVertex {\n"
22739 " vec4 gl_Position;\n"
22740 "};\n"
22741 "void main(){\n"
22742 " gl_Position = vec4(1);\n"
22743 "}\n";
22744 char const *fsSource =
22745 "#version 450\n"
22746 "\n"
22747 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22748 "layout(location=0) out vec4 color;\n"
22749 "void main() {\n"
22750 " color = subpassLoad(x);\n"
22751 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022752
22753 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22754 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22755
22756 VkPipelineObj pipe(m_device);
22757 pipe.AddShader(&vs);
22758 pipe.AddShader(&fs);
22759 pipe.AddColorAttachment();
22760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22761
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022762 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22763 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022764 VkDescriptorSetLayout dsl;
22765 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22766 ASSERT_VK_SUCCESS(err);
22767
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022768 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022769 VkPipelineLayout pl;
22770 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22771 ASSERT_VK_SUCCESS(err);
22772
22773 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022774 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22775 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22776 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22777 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22778 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 -060022779 };
22780 VkAttachmentReference color = {
22781 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22782 };
22783 VkAttachmentReference input = {
22784 1, VK_IMAGE_LAYOUT_GENERAL,
22785 };
22786
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022787 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022788
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022789 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022790 VkRenderPass rp;
22791 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22792 ASSERT_VK_SUCCESS(err);
22793
22794 // should be OK. would go wrong here if it's going to...
22795 pipe.CreateVKPipeline(pl, rp);
22796
22797 m_errorMonitor->VerifyNotFound();
22798
22799 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22800 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22801 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22802}
22803
22804TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022805 TEST_DESCRIPTION(
22806 "Test that pipeline validation accepts a compute pipeline which declares a "
22807 "descriptor-backed resource which is not provided, but the shader does not "
22808 "statically use it. This is interesting because it requires compute pipelines "
22809 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022810 m_errorMonitor->ExpectSuccess();
22811
Tony Barbour1fa09702017-03-16 12:09:08 -060022812 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022813
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022814 char const *csSource =
22815 "#version 450\n"
22816 "\n"
22817 "layout(local_size_x=1) in;\n"
22818 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22819 "void main(){\n"
22820 " // x is not used.\n"
22821 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022822
22823 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22824
22825 VkDescriptorSetObj descriptorSet(m_device);
22826 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22827
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022828 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22829 nullptr,
22830 0,
22831 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22832 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22833 descriptorSet.GetPipelineLayout(),
22834 VK_NULL_HANDLE,
22835 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022836
22837 VkPipeline pipe;
22838 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22839
22840 m_errorMonitor->VerifyNotFound();
22841
22842 if (err == VK_SUCCESS) {
22843 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22844 }
22845}
22846
22847TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022848 TEST_DESCRIPTION(
22849 "Test that pipeline validation accepts a shader consuming only the "
22850 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022851 m_errorMonitor->ExpectSuccess();
22852
Tony Barbour1fa09702017-03-16 12:09:08 -060022853 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022854
22855 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022856 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22857 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22858 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022859 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022860 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022861 VkDescriptorSetLayout dsl;
22862 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22863 ASSERT_VK_SUCCESS(err);
22864
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022865 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022866 VkPipelineLayout pl;
22867 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22868 ASSERT_VK_SUCCESS(err);
22869
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022870 char const *csSource =
22871 "#version 450\n"
22872 "\n"
22873 "layout(local_size_x=1) in;\n"
22874 "layout(set=0, binding=0) uniform sampler s;\n"
22875 "layout(set=0, binding=1) uniform texture2D t;\n"
22876 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22877 "void main() {\n"
22878 " x = texture(sampler2D(t, s), vec2(0));\n"
22879 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022880 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22881
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022882 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22883 nullptr,
22884 0,
22885 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22886 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22887 pl,
22888 VK_NULL_HANDLE,
22889 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022890
22891 VkPipeline pipe;
22892 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22893
22894 m_errorMonitor->VerifyNotFound();
22895
22896 if (err == VK_SUCCESS) {
22897 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22898 }
22899
22900 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22901 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22902}
22903
22904TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022905 TEST_DESCRIPTION(
22906 "Test that pipeline validation accepts a shader consuming only the "
22907 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022908 m_errorMonitor->ExpectSuccess();
22909
Tony Barbour1fa09702017-03-16 12:09:08 -060022910 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022911
22912 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022913 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22914 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22915 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022916 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022917 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022918 VkDescriptorSetLayout dsl;
22919 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22920 ASSERT_VK_SUCCESS(err);
22921
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022922 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022923 VkPipelineLayout pl;
22924 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22925 ASSERT_VK_SUCCESS(err);
22926
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022927 char const *csSource =
22928 "#version 450\n"
22929 "\n"
22930 "layout(local_size_x=1) in;\n"
22931 "layout(set=0, binding=0) uniform texture2D t;\n"
22932 "layout(set=0, binding=1) uniform sampler s;\n"
22933 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22934 "void main() {\n"
22935 " x = texture(sampler2D(t, s), vec2(0));\n"
22936 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022937 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22938
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022939 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22940 nullptr,
22941 0,
22942 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22943 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22944 pl,
22945 VK_NULL_HANDLE,
22946 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022947
22948 VkPipeline pipe;
22949 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22950
22951 m_errorMonitor->VerifyNotFound();
22952
22953 if (err == VK_SUCCESS) {
22954 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22955 }
22956
22957 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22958 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22959}
22960
22961TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022962 TEST_DESCRIPTION(
22963 "Test that pipeline validation accepts a shader consuming "
22964 "both the sampler and the image of a combined image+sampler "
22965 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022966 m_errorMonitor->ExpectSuccess();
22967
Tony Barbour1fa09702017-03-16 12:09:08 -060022968 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022969
22970 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022971 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22972 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022973 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022974 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022975 VkDescriptorSetLayout dsl;
22976 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22977 ASSERT_VK_SUCCESS(err);
22978
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022979 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022980 VkPipelineLayout pl;
22981 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22982 ASSERT_VK_SUCCESS(err);
22983
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022984 char const *csSource =
22985 "#version 450\n"
22986 "\n"
22987 "layout(local_size_x=1) in;\n"
22988 "layout(set=0, binding=0) uniform texture2D t;\n"
22989 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22990 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22991 "void main() {\n"
22992 " x = texture(sampler2D(t, s), vec2(0));\n"
22993 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022994 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22995
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022996 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22997 nullptr,
22998 0,
22999 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
23000 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
23001 pl,
23002 VK_NULL_HANDLE,
23003 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023004
23005 VkPipeline pipe;
23006 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
23007
23008 m_errorMonitor->VerifyNotFound();
23009
23010 if (err == VK_SUCCESS) {
23011 vkDestroyPipeline(m_device->device(), pipe, nullptr);
23012 }
23013
23014 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
23015 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
23016}
23017
Tony Barbour3ed87a02017-03-15 16:19:02 -060023018TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023019 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
23020
Tony Barbour3ed87a02017-03-15 16:19:02 -060023021 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060023022 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060023023
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023024 // Ensure that extension is available and enabled.
23025 uint32_t extension_count = 0;
23026 bool supports_maintenance1_extension = false;
23027 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23028 ASSERT_VK_SUCCESS(err);
23029 if (extension_count > 0) {
23030 std::vector<VkExtensionProperties> available_extensions(extension_count);
23031
23032 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23033 ASSERT_VK_SUCCESS(err);
23034 for (const auto &extension_props : available_extensions) {
23035 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
23036 supports_maintenance1_extension = true;
23037 }
23038 }
23039 }
23040
23041 // Proceed if extension is supported by hardware
23042 if (!supports_maintenance1_extension) {
23043 printf(" Maintenance1 Extension not supported, skipping tests\n");
23044 return;
23045 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023046
23047 m_errorMonitor->ExpectSuccess();
Dave Houlton8e0fe7a2017-03-30 10:32:10 -060023048 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023049 VkCommandBuffer cmd_buf;
23050 VkCommandBufferAllocateInfo alloc_info;
23051 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
23052 alloc_info.pNext = NULL;
23053 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070023054 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060023055 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
23056 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
23057
23058 VkCommandBufferBeginInfo cb_binfo;
23059 cb_binfo.pNext = NULL;
23060 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
23061 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
23062 cb_binfo.flags = 0;
23063 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
23064 // Set Negative height, should give error if Maintenance 1 is not enabled
23065 VkViewport viewport = {0, 0, 16, -16, 0, 1};
23066 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
23067 vkEndCommandBuffer(cmd_buf);
23068
23069 m_errorMonitor->VerifyNotFound();
23070}
23071
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060023072TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
23073 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
23074
23075 ASSERT_NO_FATAL_FAILURE(Init());
23076
23077 uint32_t extension_count = 0;
23078 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23079 ASSERT_VK_SUCCESS(err);
23080
23081 if (extension_count > 0) {
23082 std::vector<VkExtensionProperties> available_extensions(extension_count);
23083 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23084 ASSERT_VK_SUCCESS(err);
23085
23086 for (const auto &extension_props : available_extensions) {
23087 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23088 // Create two pNext structures which by themselves would be valid
23089 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23090 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
23091 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23092 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
23093 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23094
23095 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23096 dedicated_buffer_create_info_2.pNext = nullptr;
23097 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
23098
23099 uint32_t queue_family_index = 0;
23100 VkBufferCreateInfo buffer_create_info = {};
23101 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23102 buffer_create_info.pNext = &dedicated_buffer_create_info;
23103 buffer_create_info.size = 1024;
23104 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23105 buffer_create_info.queueFamilyIndexCount = 1;
23106 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23107
23108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
23109 VkBuffer buffer;
23110 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
23111 m_errorMonitor->VerifyFound();
23112 }
23113 }
23114 }
23115}
23116
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023117TEST_F(VkPositiveLayerTest, ValidStructPNext) {
23118 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
23119
Tony Barbour1fa09702017-03-16 12:09:08 -060023120 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023121
23122 // Positive test to check parameter_validation and unique_objects support
23123 // for NV_dedicated_allocation
23124 uint32_t extension_count = 0;
23125 bool supports_nv_dedicated_allocation = false;
23126 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
23127 ASSERT_VK_SUCCESS(err);
23128
23129 if (extension_count > 0) {
23130 std::vector<VkExtensionProperties> available_extensions(extension_count);
23131
23132 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
23133 ASSERT_VK_SUCCESS(err);
23134
23135 for (const auto &extension_props : available_extensions) {
23136 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
23137 supports_nv_dedicated_allocation = true;
23138 }
23139 }
23140 }
23141
23142 if (supports_nv_dedicated_allocation) {
23143 m_errorMonitor->ExpectSuccess();
23144
23145 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
23146 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
23147 dedicated_buffer_create_info.pNext = nullptr;
23148 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
23149
23150 uint32_t queue_family_index = 0;
23151 VkBufferCreateInfo buffer_create_info = {};
23152 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
23153 buffer_create_info.pNext = &dedicated_buffer_create_info;
23154 buffer_create_info.size = 1024;
23155 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
23156 buffer_create_info.queueFamilyIndexCount = 1;
23157 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
23158
23159 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070023160 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023161 ASSERT_VK_SUCCESS(err);
23162
23163 VkMemoryRequirements memory_reqs;
23164 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
23165
23166 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
23167 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
23168 dedicated_memory_info.pNext = nullptr;
23169 dedicated_memory_info.buffer = buffer;
23170 dedicated_memory_info.image = VK_NULL_HANDLE;
23171
23172 VkMemoryAllocateInfo memory_info = {};
23173 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
23174 memory_info.pNext = &dedicated_memory_info;
23175 memory_info.allocationSize = memory_reqs.size;
23176
23177 bool pass;
23178 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
23179 ASSERT_TRUE(pass);
23180
23181 VkDeviceMemory buffer_memory;
23182 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
23183 ASSERT_VK_SUCCESS(err);
23184
23185 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
23186 ASSERT_VK_SUCCESS(err);
23187
23188 vkDestroyBuffer(m_device->device(), buffer, NULL);
23189 vkFreeMemory(m_device->device(), buffer_memory, NULL);
23190
23191 m_errorMonitor->VerifyNotFound();
23192 }
23193}
23194
23195TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
23196 VkResult err;
23197
23198 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
23199
Tony Barbour1fa09702017-03-16 12:09:08 -060023200 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
23202
23203 std::vector<const char *> device_extension_names;
23204 auto features = m_device->phy().features();
23205 // Artificially disable support for non-solid fill modes
23206 features.fillModeNonSolid = false;
23207 // The sacrificial device object
23208 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
23209
23210 VkRenderpassObj render_pass(&test_device);
23211
23212 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
23213 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
23214 pipeline_layout_ci.setLayoutCount = 0;
23215 pipeline_layout_ci.pSetLayouts = NULL;
23216
23217 VkPipelineLayout pipeline_layout;
23218 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
23219 ASSERT_VK_SUCCESS(err);
23220
23221 VkPipelineRasterizationStateCreateInfo rs_ci = {};
23222 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
23223 rs_ci.pNext = nullptr;
23224 rs_ci.lineWidth = 1.0f;
23225 rs_ci.rasterizerDiscardEnable = true;
23226
23227 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
23228 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
23229
23230 // Set polygonMode=FILL. No error is expected
23231 m_errorMonitor->ExpectSuccess();
23232 {
23233 VkPipelineObj pipe(&test_device);
23234 pipe.AddShader(&vs);
23235 pipe.AddShader(&fs);
23236 pipe.AddColorAttachment();
23237 // Set polygonMode to a good value
23238 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
23239 pipe.SetRasterization(&rs_ci);
23240 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
23241 }
23242 m_errorMonitor->VerifyNotFound();
23243
23244 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23245}
23246
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023247#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023248TEST_F(VkPositiveLayerTest, LongFenceChain)
23249{
23250 m_errorMonitor->ExpectSuccess();
23251
Tony Barbour1fa09702017-03-16 12:09:08 -060023252 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023253 VkResult err;
23254
23255 std::vector<VkFence> fences;
23256
23257 const int chainLength = 32768;
23258
23259 for (int i = 0; i < chainLength; i++) {
23260 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23261 VkFence fence;
23262 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23263 ASSERT_VK_SUCCESS(err);
23264
23265 fences.push_back(fence);
23266
23267 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23268 0, nullptr, 0, nullptr };
23269 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23270 ASSERT_VK_SUCCESS(err);
23271
23272 }
23273
23274 // BOOM, stack overflow.
23275 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23276
23277 for (auto fence : fences)
23278 vkDestroyFence(m_device->device(), fence, nullptr);
23279
23280 m_errorMonitor->VerifyNotFound();
23281}
23282#endif
23283
Cody Northrop1242dfd2016-07-13 17:24:59 -060023284#if defined(ANDROID) && defined(VALIDATION_APK)
Cody Northropb94529f2017-04-05 13:05:51 -060023285const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023286static bool initialized = false;
23287static bool active = false;
23288
23289// Convert Intents to argv
23290// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023291std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023292 std::vector<std::string> args;
23293 JavaVM &vm = *app.activity->vm;
23294 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023295 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023296
23297 JNIEnv &env = *p_env;
23298 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023299 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023300 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023301 jmethodID get_string_extra_method =
23302 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023303 jvalue get_string_extra_args;
23304 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023305 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023306
23307 std::string args_str;
23308 if (extra_str) {
23309 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23310 args_str = extra_utf;
23311 env.ReleaseStringUTFChars(extra_str, extra_utf);
23312 env.DeleteLocalRef(extra_str);
23313 }
23314
23315 env.DeleteLocalRef(get_string_extra_args.l);
23316 env.DeleteLocalRef(intent);
23317 vm.DetachCurrentThread();
23318
23319 // split args_str
23320 std::stringstream ss(args_str);
23321 std::string arg;
23322 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023323 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023324 }
23325
23326 return args;
23327}
23328
Cody Northropb94529f2017-04-05 13:05:51 -060023329void addFullTestCommentIfPresent(const ::testing::TestInfo& test_info, std::string& error_message) {
23330 const char* const type_param = test_info.type_param();
23331 const char* const value_param = test_info.value_param();
23332
23333 if (type_param != NULL || value_param != NULL) {
23334 error_message.append(", where ");
23335 if (type_param != NULL) {
23336 error_message.append("TypeParam = ").append(type_param);
23337 if (value_param != NULL)
23338 error_message.append(" and ");
23339 }
23340 if (value_param != NULL) {
23341 error_message.append("GetParam() = ").append(value_param);
23342 }
23343 }
23344}
23345
23346// Inspired by https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md
23347class LogcatPrinter : public ::testing::EmptyTestEventListener {
23348 // Called before a test starts.
23349 virtual void OnTestStart(const ::testing::TestInfo& test_info) {
23350 __android_log_print(ANDROID_LOG_INFO, appTag, "[ RUN ] %s.%s", test_info.test_case_name(), test_info.name());
23351 }
23352
23353 // Called after a failed assertion or a SUCCEED() invocation.
23354 virtual void OnTestPartResult(const ::testing::TestPartResult& result) {
23355
23356 // If the test part succeeded, we don't need to do anything.
23357 if (result.type() == ::testing::TestPartResult::kSuccess)
23358 return;
23359
23360 __android_log_print(ANDROID_LOG_INFO, appTag, "%s in %s:%d %s",
23361 result.failed() ? "*** Failure" : "Success",
23362 result.file_name(),
23363 result.line_number(),
23364 result.summary());
23365 }
23366
23367 // Called after a test ends.
23368 virtual void OnTestEnd(const ::testing::TestInfo& info) {
23369 std::string result;
23370 if (info.result()->Passed()) {
23371 result.append("[ OK ]");
23372 } else {
23373 result.append("[ FAILED ]");
23374 }
23375 result.append(info.test_case_name()).append(".").append(info.name());
23376 if (info.result()->Failed())
23377 addFullTestCommentIfPresent(info, result);
23378
23379 if (::testing::GTEST_FLAG(print_time)) {
23380 std::ostringstream os;
23381 os << info.result()->elapsed_time();
23382 result.append(" (").append(os.str()).append(" ms)");
23383 }
23384
23385 __android_log_print(ANDROID_LOG_INFO, appTag, "%s", result.c_str());
23386 };
23387};
23388
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023389static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023390
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023391static void processCommand(struct android_app *app, int32_t cmd) {
23392 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023393 case APP_CMD_INIT_WINDOW: {
23394 if (app->window) {
23395 initialized = true;
23396 }
23397 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023398 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023399 case APP_CMD_GAINED_FOCUS: {
23400 active = true;
23401 break;
23402 }
23403 case APP_CMD_LOST_FOCUS: {
23404 active = false;
23405 break;
23406 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023407 }
23408}
23409
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023410void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023411 app_dummy();
23412
Cody Northrop1242dfd2016-07-13 17:24:59 -060023413
23414 int vulkanSupport = InitVulkan();
23415 if (vulkanSupport == 0) {
23416 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23417 return;
23418 }
23419
23420 app->onAppCmd = processCommand;
23421 app->onInputEvent = processInput;
23422
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023423 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023424 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023425 struct android_poll_source *source;
23426 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023427 if (source) {
23428 source->process(app, source);
23429 }
23430
23431 if (app->destroyRequested != 0) {
23432 VkTestFramework::Finish();
23433 return;
23434 }
23435 }
23436
23437 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023438 // Use the following key to send arguments to gtest, i.e.
23439 // --es args "--gtest_filter=-VkLayerTest.foo"
23440 const char key[] = "args";
23441 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023443 std::string filter = "";
23444 if (args.size() > 0) {
23445 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23446 filter += args[0];
23447 } else {
23448 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23449 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023450
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023451 int argc = 2;
23452 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23453 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023454
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023455 // Route output to files until we can override the gtest output
23456 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23457 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023458
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023459 ::testing::InitGoogleTest(&argc, argv);
Cody Northropb94529f2017-04-05 13:05:51 -060023460
23461 ::testing::TestEventListeners& listeners = ::testing::UnitTest::GetInstance()->listeners();
23462 listeners.Append(new LogcatPrinter);
23463
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023464 VkTestFramework::InitArgs(&argc, argv);
23465 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023467 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023468
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023469 if (result != 0) {
23470 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23471 } else {
23472 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23473 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023474
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023475 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023476
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023477 fclose(stdout);
23478 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023479
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023480 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023481 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023482 }
23483 }
23484}
23485#endif
23486
Tony Barbour300a6082015-04-07 13:44:53 -060023487int main(int argc, char **argv) {
23488 int result;
23489
Cody Northrop8e54a402016-03-08 22:25:52 -070023490#ifdef ANDROID
23491 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023492 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023493#endif
23494
Tony Barbour300a6082015-04-07 13:44:53 -060023495 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023496 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023497
23498 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23499
23500 result = RUN_ALL_TESTS();
23501
Tony Barbour6918cd52015-04-09 12:58:51 -060023502 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023503 return result;
23504}