blob: b4ea72e9e432f33e01f905fbc30d1e66d49414d3 [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
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600103static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
104 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
105 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600106
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600107// ErrorMonitor Usage:
108//
Dave Houltonfbf52152017-01-06 12:55:29 -0700109// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600110// encountered log messages, or a validation error enum identifying
111// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
112// will match all log messages. logMsg will return true for skipCall
113// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600114//
Dave Houltonfbf52152017-01-06 12:55:29 -0700115// Call VerifyFound to determine if all desired failure messages
116// were encountered. Call VerifyNotFound to determine if any unexpected
117// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600118class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700119 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700120 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700121 test_platform_thread_create_mutex(&mutex_);
122 test_platform_thread_lock_mutex(&mutex_);
123 Reset();
124 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600125 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600126
Dave Houltonfbf52152017-01-06 12:55:29 -0700127 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600128
Dave Houltonfbf52152017-01-06 12:55:29 -0700129 // Set monitor to pristine state
130 void Reset() {
131 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
132 bailout_ = NULL;
133 message_found_ = VK_FALSE;
134 failure_message_strings_.clear();
135 desired_message_strings_.clear();
136 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700137 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700138 other_messages_.clear();
139 message_outstanding_count_ = 0;
140 }
141
142 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700143 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700144 test_platform_thread_lock_mutex(&mutex_);
145 desired_message_strings_.insert(msgString);
146 message_flags_ |= msgFlags;
147 message_outstanding_count_++;
148 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600149 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600150
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700151 // ErrorMonitor will look for an error message containing the specified string(s)
152 template <typename Iter>
153 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
154 for (; iter != end; ++iter) {
155 SetDesiredFailureMsg(msgFlags, *iter);
156 }
157 }
158
Dave Houltonfbf52152017-01-06 12:55:29 -0700159 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700160 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700161 test_platform_thread_lock_mutex(&mutex_);
162 desired_message_ids_.insert(msg_id);
163 message_flags_ |= msgFlags;
164 message_outstanding_count_++;
165 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600166 }
167
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700168 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
169 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
170 // function and its definition.
171 void SetUnexpectedError(const char *const msg) {
172 test_platform_thread_lock_mutex(&mutex_);
173
174 ignore_message_strings_.emplace_back(msg);
175
176 test_platform_thread_unlock_mutex(&mutex_);
177 }
178
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700179 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600180 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700181 test_platform_thread_lock_mutex(&mutex_);
182 if (bailout_ != NULL) {
183 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600184 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600185 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600186 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600187
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700188 if (!IgnoreMessage(errorString)) {
189 for (auto desired_msg : desired_message_strings_) {
190 if (desired_msg.length() == 0) {
191 // An empty desired_msg string "" indicates a positive test - not expecting an error.
192 // Return true to avoid calling layers/driver with this error.
193 // And don't erase the "" string, so it remains if another error is found.
194 result = VK_TRUE;
195 found_expected = true;
196 message_found_ = VK_TRUE;
197 failure_message_strings_.insert(errorString);
198 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600199 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700200 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700201 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700202 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700203 result = VK_TRUE;
204 // We only want one match for each expected error so remove from set here
205 // Since we're about the break the loop it's ok to remove from set we're iterating over
206 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600207 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600208 }
209 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700210 for (auto desired_id : desired_message_ids_) {
211 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
212 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
213 // Return true to avoid calling layers/driver with this error.
214 result = VK_TRUE;
215 } else if (desired_id == message_code) {
216 // Double-check that the string matches the error enum
217 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
218 found_expected = true;
219 message_outstanding_count_--;
220 result = VK_TRUE;
221 message_found_ = VK_TRUE;
222 desired_message_ids_.erase(desired_id);
223 break;
224 } else {
225 // Treat this message as a regular unexpected error, but print a warning jic
226 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
227 errorString.c_str(), desired_id, validation_error_map[desired_id]);
228 }
229 }
230 }
231
232 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600233 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700234 other_messages_.push_back(errorString);
235 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600236 }
237
Dave Houltonfbf52152017-01-06 12:55:29 -0700238 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600239 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600240 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600241
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600242 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
243
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700244 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600245
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700246 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600247
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700248 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700249
250 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600251
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600252 void DumpFailureMsgs(void) const {
253 vector<string> otherMsgs = GetOtherFailureMsgs();
254 if (otherMsgs.size()) {
255 cout << "Other error messages logged for this test were:" << endl;
256 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
257 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600258 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600259 }
260 }
261
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600262 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200263
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600264 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700265 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600266 // Match ANY message matching specified type
267 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700268 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200269 }
270
271 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600272 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700273 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600274 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700275 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700276 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600277 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700278 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700279 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600280 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200281 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700282 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200283 }
284
285 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600286 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700287 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600288 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700289 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700290 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600291 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200292 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700293 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200294 }
295
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700296 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700297 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
298 // function and its definition.
299 bool IgnoreMessage(std::string const &msg) const {
300 if (ignore_message_strings_.empty()) {
301 return false;
302 }
303
304 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
305 return msg.find(str) != std::string::npos;
306 }) != ignore_message_strings_.end();
307 }
308
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700309 VkFlags message_flags_;
310 std::unordered_set<uint32_t> desired_message_ids_;
311 std::unordered_set<string> desired_message_strings_;
312 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700313 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700314 vector<string> other_messages_;
315 test_platform_thread_mutex mutex_;
316 bool *bailout_;
317 VkBool32 message_found_;
318 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600319};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500320
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600321static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
322 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
323 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600324 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
325 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600326 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600327 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600328 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600329}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500330
Karl Schultz6addd812016-02-02 17:17:23 -0700331class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700332 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600333 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
334 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700335 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600336 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
337 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700338 }
Tony Barbour300a6082015-04-07 13:44:53 -0600339
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600340 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
341 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700342 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600343 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700344 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600345 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700346 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600347 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
348 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
349 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700350 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
351 }
352 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
353 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
354 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600355 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
356 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
357 InitState(features, flags);
358 }
359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700360 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700361 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600362 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600363 std::vector<const char *> instance_layer_names;
364 std::vector<const char *> instance_extension_names;
365 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600366
367 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700368 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600369 /*
370 * Since CreateDbgMsgCallback is an instance level extension call
371 * any extension / layer that utilizes that feature also needs
372 * to be enabled at create instance time.
373 */
Karl Schultz6addd812016-02-02 17:17:23 -0700374 // Use Threading layer first to protect others from
375 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700376 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600377 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800378 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700379 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600380 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700381 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600382
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 if (m_enableWSI) {
384 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
385 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
386#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
387#if defined(VK_USE_PLATFORM_ANDROID_KHR)
388 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700389#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600390#if defined(VK_USE_PLATFORM_MIR_KHR)
391 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700392#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600393#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
394 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700395#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600396#if defined(VK_USE_PLATFORM_WIN32_KHR)
397 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700398#endif // VK_USE_PLATFORM_WIN32_KHR
399#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600400#if defined(VK_USE_PLATFORM_XCB_KHR)
401 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
402#elif defined(VK_USE_PLATFORM_XLIB_KHR)
403 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405 }
406
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600407 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600408 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 this->app_info.pApplicationName = "layer_tests";
410 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600411 this->app_info.pEngineName = "unittest";
412 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600413 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600414
Tony Barbour15524c32015-04-29 17:34:29 -0600415 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600416 }
417
418 virtual void TearDown() {
419 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600420 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600421 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600422 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600423
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600424 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600425};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600427void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428 // Create identity matrix
429 int i;
430 struct vktriangle_vs_uniform data;
431
432 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700433 glm::mat4 View = glm::mat4(1.0f);
434 glm::mat4 Model = glm::mat4(1.0f);
435 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700437 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500438
439 memcpy(&data.mvp, &MVP[0][0], matrixSize);
440
Karl Schultz6addd812016-02-02 17:17:23 -0700441 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442 {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 -0500443 };
444
Karl Schultz6addd812016-02-02 17:17:23 -0700445 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 data.position[i][0] = tri_data[i].posX;
447 data.position[i][1] = tri_data[i].posY;
448 data.position[i][2] = tri_data[i].posZ;
449 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700450 data.color[i][0] = tri_data[i].r;
451 data.color[i][1] = tri_data[i].g;
452 data.color[i][2] = tri_data[i].b;
453 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454 }
455
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 ASSERT_NO_FATAL_FAILURE(InitViewport());
457
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200458 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
459 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Karl Schultz6addd812016-02-02 17:17:23 -0700461 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600462 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500463
464 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800465 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500466 pipelineobj.AddShader(&vs);
467 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600468 if (failMask & BsoFailLineWidth) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600470 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600471 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600472 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
473 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600474 }
475 if (failMask & BsoFailDepthBias) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600477 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600478 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600479 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600480 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600481 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600482 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700483 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700484 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600485 if (failMask & BsoFailViewport) {
486 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
487 }
488 if (failMask & BsoFailScissor) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
490 }
491 if (failMask & BsoFailBlend) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 VkPipelineColorBlendAttachmentState att_state = {};
494 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
495 att_state.blendEnable = VK_TRUE;
496 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
498 if (failMask & BsoFailDepthBounds) {
499 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
500 }
501 if (failMask & BsoFailStencilReadMask) {
502 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
503 }
504 if (failMask & BsoFailStencilWriteMask) {
505 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
506 }
507 if (failMask & BsoFailStencilReference) {
508 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
509 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510
511 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600512 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513
514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700515 m_commandBuffer->BeginCommandBuffer();
516 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517
Tony Barbourfe3351b2015-07-28 10:17:20 -0600518 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500519
520 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600521 if (failMask & BsoFailIndexBuffer) {
522 // Use DrawIndexed w/o an index buffer bound
523 DrawIndexed(3, 1, 0, 0, 0);
524 } else {
525 Draw(3, 1, 0, 0);
526 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500527
Mark Muellerd4914412016-06-13 17:52:06 -0600528 if (failMask & BsoFailCmdClearAttachments) {
529 VkClearAttachment color_attachment = {};
530 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700531 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600532 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
533
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600534 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600535 }
536
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500537 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700538 m_commandBuffer->EndRenderPass();
539 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600540 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500541}
542
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600543void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
544 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500545 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600546 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500547 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600548 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500549 }
550
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700552 // Make sure depthWriteEnable is set so that Depth fail test will work
553 // correctly
554 // Make sure stencilTestEnable is set so that Stencil fail test will work
555 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600556 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800557 stencil.failOp = VK_STENCIL_OP_KEEP;
558 stencil.passOp = VK_STENCIL_OP_KEEP;
559 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
560 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600561
562 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
563 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600564 ds_ci.pNext = NULL;
565 ds_ci.depthTestEnable = VK_FALSE;
566 ds_ci.depthWriteEnable = VK_TRUE;
567 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
568 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600569 if (failMask & BsoFailDepthBounds) {
570 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600571 ds_ci.maxDepthBounds = 0.0f;
572 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600573 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600574 ds_ci.stencilTestEnable = VK_TRUE;
575 ds_ci.front = stencil;
576 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600577
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600578 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600579 pipelineobj.SetViewport(m_viewports);
580 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800581 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600582 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600583 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800584 commandBuffer->BindPipeline(pipelineobj);
585 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500586}
587
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600588class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700589 public:
590 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600591};
592
Ian Elliott2c1daf52016-05-12 09:41:46 -0600593class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700594 public:
595 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600596 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600597};
598
Mark Muellerdfe37552016-07-07 14:47:42 -0600599class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700600 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600601 enum eTestEnFlags {
602 eDoubleDelete,
603 eInvalidDeviceOffset,
604 eInvalidMemoryOffset,
605 eBindNullBuffer,
606 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600607 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600608 };
609
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600610 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600611
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600612 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
613 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600614 return true;
615 }
616 VkDeviceSize offset_limit = 0;
617 if (eInvalidMemoryOffset == aTestFlag) {
618 VkBuffer vulkanBuffer;
619 VkBufferCreateInfo buffer_create_info = {};
620 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
621 buffer_create_info.size = 32;
622 buffer_create_info.usage = aBufferUsage;
623
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600625 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600628 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
629 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
631 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600632 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600634 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600635 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600636 }
637 if (eOffsetAlignment < offset_limit) {
638 return true;
639 }
640 return false;
641 }
642
643 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600644 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
645 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600646 if (eBindNullBuffer == aTestFlag) {
647 VulkanMemory = 0;
648 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
649 } else {
650 VkBufferCreateInfo buffer_create_info = {};
651 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
652 buffer_create_info.size = 32;
653 buffer_create_info.usage = aBufferUsage;
654
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600656
657 CreateCurrent = true;
658
659 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600660 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600661
662 VkMemoryAllocateInfo memory_allocate_info = {};
663 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800664 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
666 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (!pass) {
668 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
669 return;
670 }
671
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600673 AllocateCurrent = true;
674 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
676 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677 BoundCurrent = true;
678
679 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
680 }
681 }
682
683 ~VkBufferTest() {
684 if (CreateCurrent) {
685 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
686 }
687 if (AllocateCurrent) {
688 if (InvalidDeleteEn) {
689 union {
690 VkDeviceMemory device_memory;
691 unsigned long long index_access;
692 } bad_index;
693
694 bad_index.device_memory = VulkanMemory;
695 bad_index.index_access++;
696
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600697 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 }
699 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
700 }
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600704
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600705 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600706
707 void TestDoubleDestroy() {
708 // Destroy the buffer but leave the flag set, which will cause
709 // the buffer to be destroyed again in the destructor.
710 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
711 }
712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700713 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600714 bool AllocateCurrent;
715 bool BoundCurrent;
716 bool CreateCurrent;
717 bool InvalidDeleteEn;
718
719 VkBuffer VulkanBuffer;
720 VkDevice VulkanDevice;
721 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600722};
723
724class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700725 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600727 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 : BoundCurrent(false),
729 AttributeCount(aAttributeCount),
730 BindingCount(aBindingCount),
731 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600732 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600733 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
734 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700735 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600736
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
738 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600739
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600740 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
741 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
742 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
743 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
744 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600745
746 unsigned i = 0;
747 do {
748 VertexInputAttributeDescription[i].binding = BindId;
749 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600750 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
751 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600752 i++;
753 } while (AttributeCount < i);
754
755 i = 0;
756 do {
757 VertexInputBindingDescription[i].binding = BindId;
758 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600759 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760 i++;
761 } while (BindingCount < i);
762 }
763
764 ~VkVerticesObj() {
765 if (VertexInputAttributeDescription) {
766 delete[] VertexInputAttributeDescription;
767 }
768 if (VertexInputBindingDescription) {
769 delete[] VertexInputBindingDescription;
770 }
771 }
772
773 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
775 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600776 return true;
777 }
778
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600779 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600780 VkDeviceSize *offsetList;
781 unsigned offsetCount;
782
783 if (aOffsetCount) {
784 offsetList = aOffsetList;
785 offsetCount = aOffsetCount;
786 } else {
787 offsetList = new VkDeviceSize[1]();
788 offsetCount = 1;
789 }
790
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600791 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600792 BoundCurrent = true;
793
794 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600796 }
797 }
798
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700799 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600800 static uint32_t BindIdGenerator;
801
802 bool BoundCurrent;
803 unsigned AttributeCount;
804 unsigned BindingCount;
805 uint32_t BindId;
806
807 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
808 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
809 VkVertexInputBindingDescription *VertexInputBindingDescription;
810 VkConstantBufferObj VulkanMemoryBuffer;
811};
812
813uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500814// ********************************************************************************************************************
815// ********************************************************************************************************************
816// ********************************************************************************************************************
817// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600818TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700819 TEST_DESCRIPTION(
820 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
821 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600822
Tony Barbour1fa09702017-03-16 12:09:08 -0600823 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600826 // Specify NULL for a pointer to a handle
827 // Expected to trigger an error with
828 // parameter_validation::validate_required_pointer
829 vkGetPhysicalDeviceFeatures(gpu(), NULL);
830 m_errorMonitor->VerifyFound();
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
833 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for pointer to array count
835 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600836 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify 0 for a required array count
841 // Expected to trigger an error with parameter_validation::validate_array
842 VkViewport view_port = {};
843 m_commandBuffer->SetViewport(0, 0, &view_port);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a required array
848 // Expected to trigger an error with parameter_validation::validate_array
849 m_commandBuffer->SetViewport(0, 1, NULL);
850 m_errorMonitor->VerifyFound();
851
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600853 // Specify VK_NULL_HANDLE for a required handle
854 // Expected to trigger an error with
855 // parameter_validation::validate_required_handle
856 vkUnmapMemory(device(), VK_NULL_HANDLE);
857 m_errorMonitor->VerifyFound();
858
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
860 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify VK_NULL_HANDLE for a required handle array entry
862 // Expected to trigger an error with
863 // parameter_validation::validate_required_handle_array
864 VkFence fence = VK_NULL_HANDLE;
865 vkResetFences(device(), 1, &fence);
866 m_errorMonitor->VerifyFound();
867
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600869 // Specify NULL for a required struct pointer
870 // Expected to trigger an error with
871 // parameter_validation::validate_struct_type
872 VkDeviceMemory memory = VK_NULL_HANDLE;
873 vkAllocateMemory(device(), NULL, NULL, &memory);
874 m_errorMonitor->VerifyFound();
875
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600877 // Specify 0 for a required VkFlags parameter
878 // Expected to trigger an error with parameter_validation::validate_flags
879 m_commandBuffer->SetStencilReference(0, 0);
880 m_errorMonitor->VerifyFound();
881
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600882 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 -0600883 // Specify 0 for a required VkFlags array entry
884 // Expected to trigger an error with
885 // parameter_validation::validate_flags_array
886 VkSemaphore semaphore = VK_NULL_HANDLE;
887 VkPipelineStageFlags stageFlags = 0;
888 VkSubmitInfo submitInfo = {};
889 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
890 submitInfo.waitSemaphoreCount = 1;
891 submitInfo.pWaitSemaphores = &semaphore;
892 submitInfo.pWaitDstStageMask = &stageFlags;
893 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
894 m_errorMonitor->VerifyFound();
895}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600896
Dustin Gravesfce74c02016-05-10 11:42:58 -0600897TEST_F(VkLayerTest, ReservedParameter) {
898 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
899
Tony Barbour1fa09702017-03-16 12:09:08 -0600900 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600901
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600903 // Specify 0 for a reserved VkFlags parameter
904 // Expected to trigger an error with
905 // parameter_validation::validate_reserved_flags
906 VkEvent event_handle = VK_NULL_HANDLE;
907 VkEventCreateInfo event_info = {};
908 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
909 event_info.flags = 1;
910 vkCreateEvent(device(), &event_info, NULL, &event_handle);
911 m_errorMonitor->VerifyFound();
912}
913
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600914TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700915 TEST_DESCRIPTION(
916 "Specify an invalid VkStructureType for a Vulkan "
917 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918
Tony Barbour1fa09702017-03-16 12:09:08 -0600919 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600922 // Zero struct memory, effectively setting sType to
923 // VK_STRUCTURE_TYPE_APPLICATION_INFO
924 // Expected to trigger an error with
925 // parameter_validation::validate_struct_type
926 VkMemoryAllocateInfo alloc_info = {};
927 VkDeviceMemory memory = VK_NULL_HANDLE;
928 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
929 m_errorMonitor->VerifyFound();
930
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600932 // Zero struct memory, effectively setting sType to
933 // VK_STRUCTURE_TYPE_APPLICATION_INFO
934 // Expected to trigger an error with
935 // parameter_validation::validate_struct_type_array
936 VkSubmitInfo submit_info = {};
937 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
938 m_errorMonitor->VerifyFound();
939}
940
941TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943
Tony Barbour1fa09702017-03-16 12:09:08 -0600944 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600948 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600949 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600950 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600951 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600952 // Zero-initialization will provide the correct sType
953 VkApplicationInfo app_info = {};
954 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
955 event_alloc_info.pNext = &app_info;
956 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
957 m_errorMonitor->VerifyFound();
958
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
960 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600961 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
962 // a function that has allowed pNext structure types and specify
963 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600965 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600966 VkMemoryAllocateInfo memory_alloc_info = {};
967 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
968 memory_alloc_info.pNext = &app_info;
969 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600970 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600971}
Dustin Graves5d33d532016-05-09 16:21:12 -0600972
973TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600975
Tony Barbour1fa09702017-03-16 12:09:08 -0600976 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600977
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
979 "does not fall within the begin..end "
980 "range of the core VkFormat "
981 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600982 // Specify an invalid VkFormat value
983 // Expected to trigger an error with
984 // parameter_validation::validate_ranged_enum
985 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600986 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600987 m_errorMonitor->VerifyFound();
988
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 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 -0600990 // Specify an invalid VkFlags bitmask value
991 // Expected to trigger an error with parameter_validation::validate_flags
992 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600993 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
994 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600995 m_errorMonitor->VerifyFound();
996
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600997 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 -0600998 // Specify an invalid VkFlags array entry
999 // Expected to trigger an error with
1000 // parameter_validation::validate_flags_array
1001 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001002 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 VkSubmitInfo submit_info = {};
1004 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1005 submit_info.waitSemaphoreCount = 1;
1006 submit_info.pWaitSemaphores = &semaphore;
1007 submit_info.pWaitDstStageMask = &stage_flags;
1008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1009 m_errorMonitor->VerifyFound();
1010
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001012 // Specify an invalid VkBool32 value
1013 // Expected to trigger a warning with
1014 // parameter_validation::validate_bool32
1015 VkSampler sampler = VK_NULL_HANDLE;
1016 VkSamplerCreateInfo sampler_info = {};
1017 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1018 sampler_info.pNext = NULL;
1019 sampler_info.magFilter = VK_FILTER_NEAREST;
1020 sampler_info.minFilter = VK_FILTER_NEAREST;
1021 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1022 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1023 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1024 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1025 sampler_info.mipLodBias = 1.0;
1026 sampler_info.maxAnisotropy = 1;
1027 sampler_info.compareEnable = VK_FALSE;
1028 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1029 sampler_info.minLod = 1.0;
1030 sampler_info.maxLod = 1.0;
1031 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1032 sampler_info.unnormalizedCoordinates = VK_FALSE;
1033 // Not VK_TRUE or VK_FALSE
1034 sampler_info.anisotropyEnable = 3;
1035 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1036 m_errorMonitor->VerifyFound();
1037}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001038
1039TEST_F(VkLayerTest, FailedReturnValue) {
1040 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1041
Tony Barbour1fa09702017-03-16 12:09:08 -06001042 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001043
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001044 // Find an unsupported image format
1045 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1046 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1047 VkFormat format = static_cast<VkFormat>(f);
1048 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001049 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 unsupported = format;
1051 break;
1052 }
1053 }
1054
1055 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1057 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001058 // Specify an unsupported VkFormat value to generate a
1059 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1060 // Expected to trigger a warning from
1061 // parameter_validation::validate_result
1062 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001063 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1064 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1066 m_errorMonitor->VerifyFound();
1067 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001068}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001069
1070TEST_F(VkLayerTest, UpdateBufferAlignment) {
1071 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073
Tony Barbour1fa09702017-03-16 12:09:08 -06001074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001075
1076 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1077 vk_testing::Buffer buffer;
1078 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1079
Tony Barbour552f6c02016-12-21 14:34:07 -07001080 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001081 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001083 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1084 m_errorMonitor->VerifyFound();
1085
1086 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1089 m_errorMonitor->VerifyFound();
1090
1091 // Introduce failure by using dataSize that is < 0
1092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1095 m_errorMonitor->VerifyFound();
1096
1097 // Introduce failure by using dataSize that is > 65536
1098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001099 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1101 m_errorMonitor->VerifyFound();
1102
Tony Barbour552f6c02016-12-21 14:34:07 -07001103 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104}
1105
1106TEST_F(VkLayerTest, FillBufferAlignment) {
1107 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1108
Tony Barbour1fa09702017-03-16 12:09:08 -06001109 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001110
1111 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1112 vk_testing::Buffer buffer;
1113 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1114
Tony Barbour552f6c02016-12-21 14:34:07 -07001115 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001116
1117 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
1122 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001124 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1125 m_errorMonitor->VerifyFound();
1126
1127 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001129 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1130 m_errorMonitor->VerifyFound();
1131
Tony Barbour552f6c02016-12-21 14:34:07 -07001132 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001133}
Dustin Graves40f35822016-06-23 11:12:53 -06001134
Cortd889ff92016-07-27 09:51:27 -07001135TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1136 VkResult err;
1137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001138 TEST_DESCRIPTION(
1139 "Attempt to use a non-solid polygon fill mode in a "
1140 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001141
Tony Barbour1fa09702017-03-16 12:09:08 -06001142 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1144
1145 std::vector<const char *> device_extension_names;
1146 auto features = m_device->phy().features();
1147 // Artificially disable support for non-solid fill modes
1148 features.fillModeNonSolid = false;
1149 // The sacrificial device object
1150 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1151
1152 VkRenderpassObj render_pass(&test_device);
1153
1154 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1155 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1156 pipeline_layout_ci.setLayoutCount = 0;
1157 pipeline_layout_ci.pSetLayouts = NULL;
1158
1159 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001160 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001161 ASSERT_VK_SUCCESS(err);
1162
1163 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1164 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1165 rs_ci.pNext = nullptr;
1166 rs_ci.lineWidth = 1.0f;
1167 rs_ci.rasterizerDiscardEnable = true;
1168
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001169 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1170 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001171
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001172 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1174 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001175 {
1176 VkPipelineObj pipe(&test_device);
1177 pipe.AddShader(&vs);
1178 pipe.AddShader(&fs);
1179 pipe.AddColorAttachment();
1180 // Introduce failure by setting unsupported polygon mode
1181 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1182 pipe.SetRasterization(&rs_ci);
1183 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1184 }
1185 m_errorMonitor->VerifyFound();
1186
1187 // Try again with polygonMode=LINE, 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_LINE;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
Cortd889ff92016-07-27 09:51:27 -07001202 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1203}
1204
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001205#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001206TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001207{
1208 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001209 VkFenceCreateInfo fenceInfo = {};
1210 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1211 fenceInfo.pNext = NULL;
1212 fenceInfo.flags = 0;
1213
Mike Weiblencce7ec72016-10-17 19:33:05 -06001214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001215
Tony Barbour1fa09702017-03-16 12:09:08 -06001216 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001217
1218 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1219 vk_testing::Buffer buffer;
1220 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001221
Tony Barbourfe3351b2015-07-28 10:17:20 -06001222 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001223 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001224 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001225
1226 testFence.init(*m_device, fenceInfo);
1227
1228 // Bypass framework since it does the waits automatically
1229 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242 ASSERT_VK_SUCCESS( err );
1243
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001244 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001245 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001247 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001248}
1249
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001250TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251{
1252 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001253 VkFenceCreateInfo fenceInfo = {};
1254 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1255 fenceInfo.pNext = NULL;
1256 fenceInfo.flags = 0;
1257
Mike Weiblencce7ec72016-10-17 19:33:05 -06001258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259
Tony Barbour1fa09702017-03-16 12:09:08 -06001260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261 ASSERT_NO_FATAL_FAILURE(InitViewport());
1262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1263
Tony Barbourfe3351b2015-07-28 10:17:20 -06001264 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001266 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
1268 testFence.init(*m_device, fenceInfo);
1269
1270 // Bypass framework since it does the waits automatically
1271 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001272 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1274 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001275 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001276 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001277 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001278 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001279 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001280 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001281 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001282
1283 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001284 ASSERT_VK_SUCCESS( err );
1285
Jon Ashburnf19916e2016-01-11 13:12:43 -07001286 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001287 VkCommandBufferBeginInfo info = {};
1288 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1289 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001290 info.renderPass = VK_NULL_HANDLE;
1291 info.subpass = 0;
1292 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001293 info.occlusionQueryEnable = VK_FALSE;
1294 info.queryFlags = 0;
1295 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001296
1297 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001298 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001300 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001301}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001302#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001303
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001304TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1305 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1306
Tony Barbour1fa09702017-03-16 12:09:08 -06001307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001308
1309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1310 VkBuffer buffer;
1311 VkBufferCreateInfo buf_info = {};
1312 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1313 buf_info.pNext = NULL;
1314 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1315 buf_info.size = 2048;
1316 buf_info.queueFamilyIndexCount = 0;
1317 buf_info.pQueueFamilyIndices = NULL;
1318 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1319 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1320 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1321 m_errorMonitor->VerifyFound();
1322
1323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1324 VkImage image;
1325 VkImageCreateInfo image_create_info = {};
1326 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1327 image_create_info.pNext = NULL;
1328 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1329 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1330 image_create_info.extent.width = 512;
1331 image_create_info.extent.height = 64;
1332 image_create_info.extent.depth = 1;
1333 image_create_info.mipLevels = 1;
1334 image_create_info.arrayLayers = 1;
1335 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1336 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1337 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1338 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1339 image_create_info.queueFamilyIndexCount = 0;
1340 image_create_info.pQueueFamilyIndices = NULL;
1341 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1342 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1343 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1344 m_errorMonitor->VerifyFound();
1345}
1346
Dave Houlton829c0d82017-01-24 15:09:17 -07001347TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1348 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
Dave Houlton3c9fca72017-03-27 17:25:54 -06001349 ASSERT_NO_FATAL_FAILURE(
1350 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001351
1352 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001353 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001354 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1355
1356 // Mask out device features we don't want
1357 VkPhysicalDeviceFeatures desired_features = available_features;
1358 desired_features.sparseResidencyImage2D = VK_FALSE;
1359 desired_features.sparseResidencyImage3D = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001360 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001361
1362 VkImage image = VK_NULL_HANDLE;
1363 VkResult result = VK_RESULT_MAX_ENUM;
1364 VkImageCreateInfo image_create_info = {};
1365 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1366 image_create_info.pNext = NULL;
1367 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1368 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1369 image_create_info.extent.width = 512;
1370 image_create_info.extent.height = 1;
1371 image_create_info.extent.depth = 1;
1372 image_create_info.mipLevels = 1;
1373 image_create_info.arrayLayers = 1;
1374 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1375 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1376 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1377 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1378 image_create_info.queueFamilyIndexCount = 0;
1379 image_create_info.pQueueFamilyIndices = NULL;
1380 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1381 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1382
1383 // 1D image w/ sparse residency is an error
1384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1385 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1386 m_errorMonitor->VerifyFound();
1387 if (VK_SUCCESS == result) {
1388 vkDestroyImage(m_device->device(), image, NULL);
1389 image = VK_NULL_HANDLE;
1390 }
1391
1392 // 2D image w/ sparse residency when feature isn't available
1393 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1394 image_create_info.extent.height = 64;
1395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1396 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1397 m_errorMonitor->VerifyFound();
1398 if (VK_SUCCESS == result) {
1399 vkDestroyImage(m_device->device(), image, NULL);
1400 image = VK_NULL_HANDLE;
1401 }
1402
1403 // 3D image w/ sparse residency when feature isn't available
1404 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1405 image_create_info.extent.depth = 8;
1406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1407 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1408 m_errorMonitor->VerifyFound();
1409 if (VK_SUCCESS == result) {
1410 vkDestroyImage(m_device->device(), image, NULL);
1411 image = VK_NULL_HANDLE;
1412 }
1413}
1414
1415TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1416 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
Dave Houlton3c9fca72017-03-27 17:25:54 -06001417 ASSERT_NO_FATAL_FAILURE(
1418 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001419
1420 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001421 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001422 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1423
1424 // These tests all require that the device support sparse residency for 2D images
1425 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1426 return;
1427 }
1428
1429 // Mask out device features we don't want
1430 VkPhysicalDeviceFeatures desired_features = available_features;
1431 desired_features.sparseResidency2Samples = VK_FALSE;
1432 desired_features.sparseResidency4Samples = VK_FALSE;
1433 desired_features.sparseResidency8Samples = VK_FALSE;
1434 desired_features.sparseResidency16Samples = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001435 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001436
1437 VkImage image = VK_NULL_HANDLE;
1438 VkResult result = VK_RESULT_MAX_ENUM;
1439 VkImageCreateInfo image_create_info = {};
1440 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1441 image_create_info.pNext = NULL;
1442 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1443 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1444 image_create_info.extent.width = 64;
1445 image_create_info.extent.height = 64;
1446 image_create_info.extent.depth = 1;
1447 image_create_info.mipLevels = 1;
1448 image_create_info.arrayLayers = 1;
1449 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1450 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1451 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1452 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1453 image_create_info.queueFamilyIndexCount = 0;
1454 image_create_info.pQueueFamilyIndices = NULL;
1455 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1456 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1457
1458 // 2D image w/ sparse residency and linear tiling is an error
1459 m_errorMonitor->SetDesiredFailureMsg(
1460 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1461 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1462 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1463 m_errorMonitor->VerifyFound();
1464 if (VK_SUCCESS == result) {
1465 vkDestroyImage(m_device->device(), image, NULL);
1466 image = VK_NULL_HANDLE;
1467 }
1468 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1469
1470 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1471 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1473 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1474 m_errorMonitor->VerifyFound();
1475 if (VK_SUCCESS == result) {
1476 vkDestroyImage(m_device->device(), image, NULL);
1477 image = VK_NULL_HANDLE;
1478 }
1479
1480 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1482 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1483 m_errorMonitor->VerifyFound();
1484 if (VK_SUCCESS == result) {
1485 vkDestroyImage(m_device->device(), image, NULL);
1486 image = VK_NULL_HANDLE;
1487 }
1488
1489 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1491 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1492 m_errorMonitor->VerifyFound();
1493 if (VK_SUCCESS == result) {
1494 vkDestroyImage(m_device->device(), image, NULL);
1495 image = VK_NULL_HANDLE;
1496 }
1497
1498 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1500 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1501 m_errorMonitor->VerifyFound();
1502 if (VK_SUCCESS == result) {
1503 vkDestroyImage(m_device->device(), image, NULL);
1504 image = VK_NULL_HANDLE;
1505 }
1506}
1507
Tobin Ehlisf11be982016-05-11 13:52:53 -06001508TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001509 TEST_DESCRIPTION(
1510 "Create a buffer and image, allocate memory, and bind the "
1511 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001512 VkResult err;
1513 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001514 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001515
Tobin Ehlis077ded32016-05-12 17:39:13 -06001516 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001517 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001518 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001519 VkDeviceMemory mem; // buffer will be bound first
1520 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001521 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001522 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001523
1524 VkBufferCreateInfo buf_info = {};
1525 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1526 buf_info.pNext = NULL;
1527 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1528 buf_info.size = 256;
1529 buf_info.queueFamilyIndexCount = 0;
1530 buf_info.pQueueFamilyIndices = NULL;
1531 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1532 buf_info.flags = 0;
1533 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1534 ASSERT_VK_SUCCESS(err);
1535
Tobin Ehlis077ded32016-05-12 17:39:13 -06001536 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001537
1538 VkImageCreateInfo image_create_info = {};
1539 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1540 image_create_info.pNext = NULL;
1541 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1542 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1543 image_create_info.extent.width = 64;
1544 image_create_info.extent.height = 64;
1545 image_create_info.extent.depth = 1;
1546 image_create_info.mipLevels = 1;
1547 image_create_info.arrayLayers = 1;
1548 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001549 // Image tiling must be optimal to trigger error when aliasing linear buffer
1550 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1552 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1553 image_create_info.queueFamilyIndexCount = 0;
1554 image_create_info.pQueueFamilyIndices = NULL;
1555 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1556 image_create_info.flags = 0;
1557
Tobin Ehlisf11be982016-05-11 13:52:53 -06001558 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1559 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001560 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1561 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001562
Tobin Ehlis077ded32016-05-12 17:39:13 -06001563 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1564
1565 VkMemoryAllocateInfo alloc_info = {};
1566 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1567 alloc_info.pNext = NULL;
1568 alloc_info.memoryTypeIndex = 0;
1569 // Ensure memory is big enough for both bindings
1570 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001571 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1572 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001573 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001574 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001575 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001576 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001577 return;
1578 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001579 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1580 ASSERT_VK_SUCCESS(err);
1581 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1582 ASSERT_VK_SUCCESS(err);
1583
Rene Lindsayd14f5572016-12-16 14:57:18 -07001584 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1585
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001587 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001588 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1589 m_errorMonitor->VerifyFound();
1590
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001591 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001592 // aliasing buffer2
1593 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1594 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1596 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001597 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001598 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001600 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001601 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001602 m_errorMonitor->VerifyFound();
1603
1604 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001605 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001606 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001607 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001608 vkFreeMemory(m_device->device(), mem, NULL);
1609 vkFreeMemory(m_device->device(), mem_img, NULL);
1610}
1611
Tobin Ehlis35372522016-05-12 08:32:31 -06001612TEST_F(VkLayerTest, InvalidMemoryMapping) {
1613 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1614 VkResult err;
1615 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001616 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001617
1618 VkBuffer buffer;
1619 VkDeviceMemory mem;
1620 VkMemoryRequirements mem_reqs;
1621
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001622 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1623
Tobin Ehlis35372522016-05-12 08:32:31 -06001624 VkBufferCreateInfo buf_info = {};
1625 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1626 buf_info.pNext = NULL;
1627 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1628 buf_info.size = 256;
1629 buf_info.queueFamilyIndexCount = 0;
1630 buf_info.pQueueFamilyIndices = NULL;
1631 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1632 buf_info.flags = 0;
1633 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1634 ASSERT_VK_SUCCESS(err);
1635
1636 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1637 VkMemoryAllocateInfo alloc_info = {};
1638 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1639 alloc_info.pNext = NULL;
1640 alloc_info.memoryTypeIndex = 0;
1641
1642 // Ensure memory is big enough for both bindings
1643 static const VkDeviceSize allocation_size = 0x10000;
1644 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001645 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 -06001646 if (!pass) {
1647 vkDestroyBuffer(m_device->device(), buffer, NULL);
1648 return;
1649 }
1650 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1651 ASSERT_VK_SUCCESS(err);
1652
1653 uint8_t *pData;
1654 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001655 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 -06001656 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1657 m_errorMonitor->VerifyFound();
1658 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001660 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1662 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1663 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001664 m_errorMonitor->VerifyFound();
1665
1666 // Unmap the memory to avoid re-map error
1667 vkUnmapMemory(m_device->device(), mem);
1668 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1670 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1671 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001672 m_errorMonitor->VerifyFound();
1673 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1675 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001676 m_errorMonitor->VerifyFound();
1677 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001679 vkUnmapMemory(m_device->device(), mem);
1680 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001683 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001684 ASSERT_VK_SUCCESS(err);
1685 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001686 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001687 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001688 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001690 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1691 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001692
Tobin Ehlis35372522016-05-12 08:32:31 -06001693 // Now flush range that oversteps mapped range
1694 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001696 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001697 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001698 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1700 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1701 m_errorMonitor->VerifyFound();
1702
1703 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1704 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001705 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001706 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001707 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001708 mmr.size = VK_WHOLE_SIZE;
1709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001710 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1711 m_errorMonitor->VerifyFound();
1712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001713#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001714 // Some platforms have an atomsize of 1 which makes the test meaningless
1715 if (atom_size > 3) {
1716 // Now with an offset NOT a multiple of the device limit
1717 vkUnmapMemory(m_device->device(), mem);
1718 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1719 ASSERT_VK_SUCCESS(err);
1720 mmr.offset = 3; // Not a multiple of atom_size
1721 mmr.size = VK_WHOLE_SIZE;
1722 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1723 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1724 m_errorMonitor->VerifyFound();
1725
1726 // Now with a size NOT a multiple of the device limit
1727 vkUnmapMemory(m_device->device(), mem);
1728 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1729 ASSERT_VK_SUCCESS(err);
1730 mmr.offset = atom_size;
1731 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1733 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1734 m_errorMonitor->VerifyFound();
1735 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001736#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001737 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1738 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001739 if (!pass) {
1740 vkFreeMemory(m_device->device(), mem, NULL);
1741 vkDestroyBuffer(m_device->device(), buffer, NULL);
1742 return;
1743 }
1744 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1745 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1746
1747 vkDestroyBuffer(m_device->device(), buffer, NULL);
1748 vkFreeMemory(m_device->device(), mem, NULL);
1749}
1750
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001751#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001752TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1753 VkResult err;
1754 bool pass;
1755
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001756 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1757 // following declaration (which is temporarily being moved below):
1758 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001759 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001760 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001762 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001763 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001764 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001765
Tony Barbour1fa09702017-03-16 12:09:08 -06001766 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001767
Ian Elliott3f06ce52016-04-29 14:46:21 -06001768#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1769#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1770 // Use the functions from the VK_KHR_android_surface extension without
1771 // enabling that extension:
1772
1773 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001774 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1776 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001777 pass = (err != VK_SUCCESS);
1778 ASSERT_TRUE(pass);
1779 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001780#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001781
Ian Elliott3f06ce52016-04-29 14:46:21 -06001782#if defined(VK_USE_PLATFORM_MIR_KHR)
1783 // Use the functions from the VK_KHR_mir_surface extension without enabling
1784 // that extension:
1785
1786 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001787 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001789 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1790 pass = (err != VK_SUCCESS);
1791 ASSERT_TRUE(pass);
1792 m_errorMonitor->VerifyFound();
1793
1794 // Tell whether an mir_connection supports presentation:
1795 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1797 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001799#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001800
Ian Elliott3f06ce52016-04-29 14:46:21 -06001801#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1802 // Use the functions from the VK_KHR_wayland_surface extension without
1803 // enabling that extension:
1804
1805 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001806 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1808 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001809 pass = (err != VK_SUCCESS);
1810 ASSERT_TRUE(pass);
1811 m_errorMonitor->VerifyFound();
1812
1813 // Tell whether an wayland_display supports presentation:
1814 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1816 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001817 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001818#endif // VK_USE_PLATFORM_WAYLAND_KHR
1819#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001820
Ian Elliott3f06ce52016-04-29 14:46:21 -06001821#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001822 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1823 // TO NON-LINUX PLATFORMS:
1824 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001825 // Use the functions from the VK_KHR_win32_surface extension without
1826 // enabling that extension:
1827
1828 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001829 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1831 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001832 pass = (err != VK_SUCCESS);
1833 ASSERT_TRUE(pass);
1834 m_errorMonitor->VerifyFound();
1835
1836 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001838 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001839 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001840// Set this (for now, until all platforms are supported and tested):
1841#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001842#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001843#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001844 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1845 // TO NON-LINUX PLATFORMS:
1846 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001847#endif
1848#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001849 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1850 // that extension:
1851
1852 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001853 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001855 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1856 pass = (err != VK_SUCCESS);
1857 ASSERT_TRUE(pass);
1858 m_errorMonitor->VerifyFound();
1859
1860 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001861 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001862 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1864 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001865 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001866// Set this (for now, until all platforms are supported and tested):
1867#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001868#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001869
Ian Elliott12630812016-04-29 14:35:43 -06001870#if defined(VK_USE_PLATFORM_XLIB_KHR)
1871 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1872 // that extension:
1873
1874 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001875 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001877 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1878 pass = (err != VK_SUCCESS);
1879 ASSERT_TRUE(pass);
1880 m_errorMonitor->VerifyFound();
1881
1882 // Tell whether an Xlib VisualID supports presentation:
1883 Display *dpy = NULL;
1884 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001886 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1887 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001888// Set this (for now, until all platforms are supported and tested):
1889#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001890#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001891
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001892// Use the functions from the VK_KHR_surface extension without enabling
1893// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001894
Ian Elliott489eec02016-05-05 14:12:44 -06001895#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001896 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001898 vkDestroySurfaceKHR(instance(), surface, NULL);
1899 m_errorMonitor->VerifyFound();
1900
1901 // Check if surface supports presentation:
1902 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001904 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1905 pass = (err != VK_SUCCESS);
1906 ASSERT_TRUE(pass);
1907 m_errorMonitor->VerifyFound();
1908
1909 // Check surface capabilities:
1910 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1912 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001913 pass = (err != VK_SUCCESS);
1914 ASSERT_TRUE(pass);
1915 m_errorMonitor->VerifyFound();
1916
1917 // Check surface formats:
1918 uint32_t format_count = 0;
1919 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1921 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001922 pass = (err != VK_SUCCESS);
1923 ASSERT_TRUE(pass);
1924 m_errorMonitor->VerifyFound();
1925
1926 // Check surface present modes:
1927 uint32_t present_mode_count = 0;
1928 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1930 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001931 pass = (err != VK_SUCCESS);
1932 ASSERT_TRUE(pass);
1933 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001934#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001935
Ian Elliott1c32c772016-04-28 14:47:13 -06001936 // Use the functions from the VK_KHR_swapchain extension without enabling
1937 // that extension:
1938
1939 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001941 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1942 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001943 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001944 pass = (err != VK_SUCCESS);
1945 ASSERT_TRUE(pass);
1946 m_errorMonitor->VerifyFound();
1947
1948 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1950 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001951 pass = (err != VK_SUCCESS);
1952 ASSERT_TRUE(pass);
1953 m_errorMonitor->VerifyFound();
1954
Chris Forbeseb7d5502016-09-13 18:19:21 +12001955 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1956 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1957 VkFence fence;
1958 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1959
Ian Elliott1c32c772016-04-28 14:47:13 -06001960 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001961 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001962 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001963 pass = (err != VK_SUCCESS);
1964 ASSERT_TRUE(pass);
1965 m_errorMonitor->VerifyFound();
1966
Chris Forbeseb7d5502016-09-13 18:19:21 +12001967 vkDestroyFence(m_device->device(), fence, nullptr);
1968
Ian Elliott1c32c772016-04-28 14:47:13 -06001969 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001970 //
1971 // NOTE: Currently can't test this because a real swapchain is needed (as
1972 // opposed to the fake one we created) in order for the layer to lookup the
1973 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001974
1975 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001977 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1978 m_errorMonitor->VerifyFound();
1979}
Chris Forbes09368e42016-10-13 11:59:22 +13001980#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001981
Karl Schultz6addd812016-02-02 17:17:23 -07001982TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1983 VkResult err;
1984 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001985
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1987 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001988
Tony Barbour1fa09702017-03-16 12:09:08 -06001989 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001990
1991 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001992 VkImage image;
1993 VkDeviceMemory mem;
1994 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001995
Karl Schultz6addd812016-02-02 17:17:23 -07001996 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1997 const int32_t tex_width = 32;
1998 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001999
Tony Barboureb254902015-07-15 12:50:33 -06002000 VkImageCreateInfo image_create_info = {};
2001 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002002 image_create_info.pNext = NULL;
2003 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2004 image_create_info.format = tex_format;
2005 image_create_info.extent.width = tex_width;
2006 image_create_info.extent.height = tex_height;
2007 image_create_info.extent.depth = 1;
2008 image_create_info.mipLevels = 1;
2009 image_create_info.arrayLayers = 1;
2010 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2011 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2012 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2013 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002014 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002015
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002016 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002017 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002018 mem_alloc.pNext = NULL;
2019 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002020
Chia-I Wuf7458c52015-10-26 21:10:41 +08002021 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002022 ASSERT_VK_SUCCESS(err);
2023
Karl Schultz6addd812016-02-02 17:17:23 -07002024 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002025
Mark Lobodzinski23065352015-05-29 09:32:35 -05002026 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002027
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002028 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 -07002029 if (!pass) { // If we can't find any unmappable memory this test doesn't
2030 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002031 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002032 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002033 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002034
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002036 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002037 ASSERT_VK_SUCCESS(err);
2038
2039 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002040 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002041 ASSERT_VK_SUCCESS(err);
2042
2043 // Map memory as if to initialize the image
2044 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002045 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002046
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002047 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002048
Chia-I Wuf7458c52015-10-26 21:10:41 +08002049 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002050 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002051}
2052
Karl Schultz6addd812016-02-02 17:17:23 -07002053TEST_F(VkLayerTest, RebindMemory) {
2054 VkResult err;
2055 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002056
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002058
Tony Barbour1fa09702017-03-16 12:09:08 -06002059 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002060
2061 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002062 VkImage image;
2063 VkDeviceMemory mem1;
2064 VkDeviceMemory mem2;
2065 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002066
Karl Schultz6addd812016-02-02 17:17:23 -07002067 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2068 const int32_t tex_width = 32;
2069 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002070
Tony Barboureb254902015-07-15 12:50:33 -06002071 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002072 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2073 image_create_info.pNext = NULL;
2074 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2075 image_create_info.format = tex_format;
2076 image_create_info.extent.width = tex_width;
2077 image_create_info.extent.height = tex_height;
2078 image_create_info.extent.depth = 1;
2079 image_create_info.mipLevels = 1;
2080 image_create_info.arrayLayers = 1;
2081 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2082 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2083 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2084 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002085
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002086 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002087 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2088 mem_alloc.pNext = NULL;
2089 mem_alloc.allocationSize = 0;
2090 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002091
Karl Schultz6addd812016-02-02 17:17:23 -07002092 // Introduce failure, do NOT set memProps to
2093 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002094 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002095 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002096 ASSERT_VK_SUCCESS(err);
2097
Karl Schultz6addd812016-02-02 17:17:23 -07002098 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002099
2100 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002101 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002102 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002103
2104 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002105 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002107 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002108 ASSERT_VK_SUCCESS(err);
2109
2110 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002111 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002112 ASSERT_VK_SUCCESS(err);
2113
Karl Schultz6addd812016-02-02 17:17:23 -07002114 // Introduce validation failure, try to bind a different memory object to
2115 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002116 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002117
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002118 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002119
Chia-I Wuf7458c52015-10-26 21:10:41 +08002120 vkDestroyImage(m_device->device(), image, NULL);
2121 vkFreeMemory(m_device->device(), mem1, NULL);
2122 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002123}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002124
Karl Schultz6addd812016-02-02 17:17:23 -07002125TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002126 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2129 "submitted in SIGNALED state. Fences "
2130 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002131
2132 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002133 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2134 fenceInfo.pNext = NULL;
2135 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002136
Tony Barbour1fa09702017-03-16 12:09:08 -06002137 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002138 ASSERT_NO_FATAL_FAILURE(InitViewport());
2139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2140
Tony Barbour552f6c02016-12-21 14:34:07 -07002141 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002142 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002143 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002144
2145 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002146
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002147 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002148 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2149 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002150 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002151 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002152 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002153 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002154 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002155 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002156 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002157
2158 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002159 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002160
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002161 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002162}
Chris Forbes4e44c912016-06-16 10:20:00 +12002163
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002164TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002165 TEST_DESCRIPTION(
2166 "Specify wrong usage for image then create conflicting view of image "
2167 "Initialize buffer with wrong usage then perform copy expecting errors "
2168 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002170
Tony Barbour1fa09702017-03-16 12:09:08 -06002171 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -06002172 auto format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07002173 if (!format) {
2174 printf(" No Depth + Stencil format found. Skipped.\n");
2175 return;
2176 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002177
Tony Barbourf92621a2016-05-02 14:28:12 -06002178 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002179 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002180 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002181 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002182
Tony Barbourf92621a2016-05-02 14:28:12 -06002183 VkImageView dsv;
2184 VkImageViewCreateInfo dsvci = {};
2185 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2186 dsvci.image = image.handle();
2187 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002188 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002189 dsvci.subresourceRange.layerCount = 1;
2190 dsvci.subresourceRange.baseMipLevel = 0;
2191 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002192 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002193
Tony Barbourf92621a2016-05-02 14:28:12 -06002194 // Create a view with depth / stencil aspect for image with different usage
2195 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002196
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002197 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002198
2199 // Initialize buffer with TRANSFER_DST usage
2200 vk_testing::Buffer buffer;
2201 VkMemoryPropertyFlags reqs = 0;
2202 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2203 VkBufferImageCopy region = {};
2204 region.bufferRowLength = 128;
2205 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002206 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002207 region.imageSubresource.layerCount = 1;
2208 region.imageExtent.height = 16;
2209 region.imageExtent.width = 16;
2210 region.imageExtent.depth = 1;
2211
Mark Lobodzinski80871462017-02-16 10:37:27 -07002212 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002213 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002214
Chris Forbesda581202016-10-06 18:25:26 +13002215 // two separate errors from this call:
2216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2218
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002219 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2220 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002221 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002222}
Tony Barbour75d79f02016-08-30 09:39:07 -06002223
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002224TEST_F(VkLayerTest, LeakAnObject) {
2225 VkResult err;
2226
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002227 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002228
2229 // Note that we have to create a new device since destroying the
2230 // framework's device causes Teardown() to fail and just calling Teardown
2231 // will destroy the errorMonitor.
2232
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002234
Tony Barbour1fa09702017-03-16 12:09:08 -06002235 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002236
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002237 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002238 std::vector<VkDeviceQueueCreateInfo> queue_info;
2239 queue_info.reserve(queue_props.size());
2240 std::vector<std::vector<float>> queue_priorities;
2241 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2242 VkDeviceQueueCreateInfo qi = {};
2243 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2244 qi.pNext = NULL;
2245 qi.queueFamilyIndex = i;
2246 qi.queueCount = queue_props[i].queueCount;
2247 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2248 qi.pQueuePriorities = queue_priorities[i].data();
2249 queue_info.push_back(qi);
2250 }
2251
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002253
2254 // The sacrificial device object
2255 VkDevice testDevice;
2256 VkDeviceCreateInfo device_create_info = {};
2257 auto features = m_device->phy().features();
2258 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2259 device_create_info.pNext = NULL;
2260 device_create_info.queueCreateInfoCount = queue_info.size();
2261 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002262 device_create_info.enabledLayerCount = 0;
2263 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002264 device_create_info.pEnabledFeatures = &features;
2265 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2266 ASSERT_VK_SUCCESS(err);
2267
2268 VkFence fence;
2269 VkFenceCreateInfo fence_create_info = {};
2270 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2271 fence_create_info.pNext = NULL;
2272 fence_create_info.flags = 0;
2273 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2274 ASSERT_VK_SUCCESS(err);
2275
2276 // Induce failure by not calling vkDestroyFence
2277 vkDestroyDevice(testDevice, NULL);
2278 m_errorMonitor->VerifyFound();
2279}
2280
2281TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002282 TEST_DESCRIPTION(
2283 "Allocate command buffers from one command pool and "
2284 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002285
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002287
Tony Barbour1fa09702017-03-16 12:09:08 -06002288 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002289 VkCommandPool command_pool_one;
2290 VkCommandPool command_pool_two;
2291
2292 VkCommandPoolCreateInfo pool_create_info{};
2293 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2294 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2295 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2296
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002297 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002298
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002299 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002300
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002301 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002302 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002303 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002304 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002305 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002306 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002307 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002308
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002309 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002310
2311 m_errorMonitor->VerifyFound();
2312
2313 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2314 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2315}
2316
2317TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2318 VkResult err;
2319
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002320 TEST_DESCRIPTION(
2321 "Allocate descriptor sets from one DS pool and "
2322 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002323
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002325
Tony Barbour1fa09702017-03-16 12:09:08 -06002326 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002327 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2328
2329 VkDescriptorPoolSize ds_type_count = {};
2330 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2331 ds_type_count.descriptorCount = 1;
2332
2333 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2334 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2335 ds_pool_ci.pNext = NULL;
2336 ds_pool_ci.flags = 0;
2337 ds_pool_ci.maxSets = 1;
2338 ds_pool_ci.poolSizeCount = 1;
2339 ds_pool_ci.pPoolSizes = &ds_type_count;
2340
2341 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002342 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002343 ASSERT_VK_SUCCESS(err);
2344
2345 // Create a second descriptor pool
2346 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002347 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002348 ASSERT_VK_SUCCESS(err);
2349
2350 VkDescriptorSetLayoutBinding dsl_binding = {};
2351 dsl_binding.binding = 0;
2352 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2353 dsl_binding.descriptorCount = 1;
2354 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2355 dsl_binding.pImmutableSamplers = NULL;
2356
2357 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2358 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2359 ds_layout_ci.pNext = NULL;
2360 ds_layout_ci.bindingCount = 1;
2361 ds_layout_ci.pBindings = &dsl_binding;
2362
2363 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002364 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002365 ASSERT_VK_SUCCESS(err);
2366
2367 VkDescriptorSet descriptorSet;
2368 VkDescriptorSetAllocateInfo alloc_info = {};
2369 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2370 alloc_info.descriptorSetCount = 1;
2371 alloc_info.descriptorPool = ds_pool_one;
2372 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002373 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002374 ASSERT_VK_SUCCESS(err);
2375
2376 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2377
2378 m_errorMonitor->VerifyFound();
2379
2380 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2381 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2382 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2383}
2384
2385TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002387
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002388 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002389
Tony Barbour1fa09702017-03-16 12:09:08 -06002390 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002391
2392 // Pass bogus handle into GetImageMemoryRequirements
2393 VkMemoryRequirements mem_reqs;
2394 uint64_t fakeImageHandle = 0xCADECADE;
2395 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2396
2397 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2398
2399 m_errorMonitor->VerifyFound();
2400}
2401
Mike Schuchardt17838902017-02-21 09:48:06 -07002402TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2403 TEST_DESCRIPTION(
2404 "Try to destroy a render pass object using a device other than the one it was created on. "
2405 "This should generate a distinct error from the invalid handle error.");
2406 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002407 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002408 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2409
2410 // Create second device
2411 float priorities[] = {1.0f};
2412 VkDeviceQueueCreateInfo queue_info{};
2413 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2414 queue_info.pNext = NULL;
2415 queue_info.flags = 0;
2416 queue_info.queueFamilyIndex = 0;
2417 queue_info.queueCount = 1;
2418 queue_info.pQueuePriorities = &priorities[0];
2419
2420 VkDeviceCreateInfo device_create_info = {};
2421 auto features = m_device->phy().features();
2422 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2423 device_create_info.pNext = NULL;
2424 device_create_info.queueCreateInfoCount = 1;
2425 device_create_info.pQueueCreateInfos = &queue_info;
2426 device_create_info.enabledLayerCount = 0;
2427 device_create_info.ppEnabledLayerNames = NULL;
2428 device_create_info.pEnabledFeatures = &features;
2429
2430 VkDevice second_device;
2431 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2432
2433 // Try to destroy the renderpass from the first device using the second device
2434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2435 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2436 m_errorMonitor->VerifyFound();
2437
2438 vkDestroyDevice(second_device, NULL);
2439}
2440
Karl Schultz6addd812016-02-02 17:17:23 -07002441TEST_F(VkLayerTest, PipelineNotBound) {
2442 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002443
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002444 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002445
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002447
Tony Barbour1fa09702017-03-16 12:09:08 -06002448 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002449 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002450
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002451 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002452 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2453 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002454
2455 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002456 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2457 ds_pool_ci.pNext = NULL;
2458 ds_pool_ci.maxSets = 1;
2459 ds_pool_ci.poolSizeCount = 1;
2460 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002461
2462 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002463 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002464 ASSERT_VK_SUCCESS(err);
2465
2466 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002467 dsl_binding.binding = 0;
2468 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2469 dsl_binding.descriptorCount = 1;
2470 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2471 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002472
2473 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002474 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2475 ds_layout_ci.pNext = NULL;
2476 ds_layout_ci.bindingCount = 1;
2477 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002478
2479 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002480 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002481 ASSERT_VK_SUCCESS(err);
2482
2483 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002484 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002485 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002486 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002487 alloc_info.descriptorPool = ds_pool;
2488 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002489 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002490 ASSERT_VK_SUCCESS(err);
2491
2492 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002493 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2494 pipeline_layout_ci.pNext = NULL;
2495 pipeline_layout_ci.setLayoutCount = 1;
2496 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002497
2498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002500 ASSERT_VK_SUCCESS(err);
2501
Mark Youngad779052016-01-06 14:26:04 -07002502 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002503
Tony Barbour552f6c02016-12-21 14:34:07 -07002504 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002505 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002506
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002507 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002508
Chia-I Wuf7458c52015-10-26 21:10:41 +08002509 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2510 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2511 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002512}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002513
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002514TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2515 VkResult err;
2516
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002517 TEST_DESCRIPTION(
2518 "Test validation check for an invalid memory type index "
2519 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002520
Tony Barbour1fa09702017-03-16 12:09:08 -06002521 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002522
2523 // Create an image, allocate memory, set a bad typeIndex and then try to
2524 // bind it
2525 VkImage image;
2526 VkDeviceMemory mem;
2527 VkMemoryRequirements mem_reqs;
2528 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2529 const int32_t tex_width = 32;
2530 const int32_t tex_height = 32;
2531
2532 VkImageCreateInfo image_create_info = {};
2533 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2534 image_create_info.pNext = NULL;
2535 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2536 image_create_info.format = tex_format;
2537 image_create_info.extent.width = tex_width;
2538 image_create_info.extent.height = tex_height;
2539 image_create_info.extent.depth = 1;
2540 image_create_info.mipLevels = 1;
2541 image_create_info.arrayLayers = 1;
2542 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2543 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2544 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2545 image_create_info.flags = 0;
2546
2547 VkMemoryAllocateInfo mem_alloc = {};
2548 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2549 mem_alloc.pNext = NULL;
2550 mem_alloc.allocationSize = 0;
2551 mem_alloc.memoryTypeIndex = 0;
2552
2553 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2554 ASSERT_VK_SUCCESS(err);
2555
2556 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2557 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002558
2559 // Introduce Failure, select invalid TypeIndex
2560 VkPhysicalDeviceMemoryProperties memory_info;
2561
2562 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2563 unsigned int i;
2564 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2565 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2566 mem_alloc.memoryTypeIndex = i;
2567 break;
2568 }
2569 }
2570 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002571 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002572 vkDestroyImage(m_device->device(), image, NULL);
2573 return;
2574 }
2575
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002576 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 -06002577
2578 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2579 ASSERT_VK_SUCCESS(err);
2580
2581 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2582 (void)err;
2583
2584 m_errorMonitor->VerifyFound();
2585
2586 vkDestroyImage(m_device->device(), image, NULL);
2587 vkFreeMemory(m_device->device(), mem, NULL);
2588}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002589
Karl Schultz6addd812016-02-02 17:17:23 -07002590TEST_F(VkLayerTest, BindInvalidMemory) {
2591 VkResult err;
2592 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002593
Tony Barbour1fa09702017-03-16 12:09:08 -06002594 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002595
Cortf801b982017-01-17 18:10:21 -08002596 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002597 const int32_t tex_width = 256;
2598 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002599
2600 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002601 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2602 image_create_info.pNext = NULL;
2603 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2604 image_create_info.format = tex_format;
2605 image_create_info.extent.width = tex_width;
2606 image_create_info.extent.height = tex_height;
2607 image_create_info.extent.depth = 1;
2608 image_create_info.mipLevels = 1;
2609 image_create_info.arrayLayers = 1;
2610 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002611 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002612 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2613 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002614
Cortf801b982017-01-17 18:10:21 -08002615 VkBufferCreateInfo buffer_create_info = {};
2616 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2617 buffer_create_info.pNext = NULL;
2618 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002619 buffer_create_info.size = 4 * 1024 * 1024;
2620 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002621 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002622
Cortf801b982017-01-17 18:10:21 -08002623 // Create an image/buffer, allocate memory, free it, and then try to bind it
2624 {
2625 VkImage image = VK_NULL_HANDLE;
2626 VkBuffer buffer = VK_NULL_HANDLE;
2627 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2628 ASSERT_VK_SUCCESS(err);
2629 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2630 ASSERT_VK_SUCCESS(err);
2631 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2632 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2633 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002634
Cortf801b982017-01-17 18:10:21 -08002635 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2636 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2637 image_mem_alloc.allocationSize = image_mem_reqs.size;
2638 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2639 ASSERT_TRUE(pass);
2640 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2641 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2642 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2643 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002644
Cortf801b982017-01-17 18:10:21 -08002645 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2646 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2647 ASSERT_VK_SUCCESS(err);
2648 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2649 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002650
Cortf801b982017-01-17 18:10:21 -08002651 vkFreeMemory(device(), image_mem, NULL);
2652 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002653
Cortf801b982017-01-17 18:10:21 -08002654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2655 err = vkBindImageMemory(device(), image, image_mem, 0);
2656 (void)err; // This may very well return an error.
2657 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002658
Cortf801b982017-01-17 18:10:21 -08002659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2660 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2661 (void)err; // This may very well return an error.
2662 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002663
Cortf801b982017-01-17 18:10:21 -08002664 vkDestroyImage(m_device->device(), image, NULL);
2665 vkDestroyBuffer(m_device->device(), buffer, NULL);
2666 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002667
2668 // Try to bind memory to an object that already has a memory binding
2669 {
2670 VkImage image = VK_NULL_HANDLE;
2671 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2672 ASSERT_VK_SUCCESS(err);
2673 VkBuffer buffer = VK_NULL_HANDLE;
2674 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2675 ASSERT_VK_SUCCESS(err);
2676 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2677 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2678 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2679 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2680 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2681 image_alloc_info.allocationSize = image_mem_reqs.size;
2682 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2683 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2684 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2685 ASSERT_TRUE(pass);
2686 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2687 ASSERT_TRUE(pass);
2688 VkDeviceMemory image_mem, buffer_mem;
2689 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2690 ASSERT_VK_SUCCESS(err);
2691 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2692 ASSERT_VK_SUCCESS(err);
2693
2694 err = vkBindImageMemory(device(), image, image_mem, 0);
2695 ASSERT_VK_SUCCESS(err);
2696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2697 err = vkBindImageMemory(device(), image, image_mem, 0);
2698 (void)err; // This may very well return an error.
2699 m_errorMonitor->VerifyFound();
2700
2701 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2702 ASSERT_VK_SUCCESS(err);
2703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2704 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2705 (void)err; // This may very well return an error.
2706 m_errorMonitor->VerifyFound();
2707
2708 vkFreeMemory(device(), image_mem, NULL);
2709 vkFreeMemory(device(), buffer_mem, NULL);
2710 vkDestroyImage(device(), image, NULL);
2711 vkDestroyBuffer(device(), buffer, NULL);
2712 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002713
Cort Strattonde748202017-02-17 12:50:01 -08002714 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002715 {
2716 VkImage image = VK_NULL_HANDLE;
2717 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2718 ASSERT_VK_SUCCESS(err);
2719 VkBuffer buffer = VK_NULL_HANDLE;
2720 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2721 ASSERT_VK_SUCCESS(err);
2722 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2723 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2724 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2725 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2726 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002727 // Leave some extra space for alignment wiggle room
2728 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002729 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002730 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002731 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2732 ASSERT_TRUE(pass);
2733 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2734 ASSERT_TRUE(pass);
2735 VkDeviceMemory image_mem, buffer_mem;
2736 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2737 ASSERT_VK_SUCCESS(err);
2738 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2739 ASSERT_VK_SUCCESS(err);
2740
Cort Strattonde748202017-02-17 12:50:01 -08002741 // Test unaligned memory offset
2742 {
2743 if (image_mem_reqs.alignment > 1) {
2744 VkDeviceSize image_offset = 1;
2745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2746 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2747 (void)err; // This may very well return an error.
2748 m_errorMonitor->VerifyFound();
2749 }
Cort6c7dff72017-01-27 18:34:50 -08002750
Cort Strattonde748202017-02-17 12:50:01 -08002751 if (buffer_mem_reqs.alignment > 1) {
2752 VkDeviceSize buffer_offset = 1;
2753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2754 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2755 (void)err; // This may very well return an error.
2756 m_errorMonitor->VerifyFound();
2757 }
2758 }
2759
2760 // Test memory offsets outside the memory allocation
2761 {
2762 VkDeviceSize image_offset =
2763 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2765 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2766 (void)err; // This may very well return an error.
2767 m_errorMonitor->VerifyFound();
2768
2769 VkDeviceSize buffer_offset =
2770 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2771 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2772 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2773 (void)err; // This may very well return an error.
2774 m_errorMonitor->VerifyFound();
2775 }
2776
2777 // Test memory offsets within the memory allocation, but which leave too little memory for
2778 // the resource.
2779 {
2780 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002781 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2783 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2784 (void)err; // This may very well return an error.
2785 m_errorMonitor->VerifyFound();
2786 }
2787
2788 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2789 if (buffer_offset > 0) {
2790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2791 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2792 (void)err; // This may very well return an error.
2793 m_errorMonitor->VerifyFound();
2794 }
2795 }
Cort6c7dff72017-01-27 18:34:50 -08002796
2797 vkFreeMemory(device(), image_mem, NULL);
2798 vkFreeMemory(device(), buffer_mem, NULL);
2799 vkDestroyImage(device(), image, NULL);
2800 vkDestroyBuffer(device(), buffer, NULL);
2801 }
2802
Cort Stratton4c38bb52017-01-28 13:33:10 -08002803 // Try to bind memory to an object with an invalid memory type
2804 {
2805 VkImage image = VK_NULL_HANDLE;
2806 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2807 ASSERT_VK_SUCCESS(err);
2808 VkBuffer buffer = VK_NULL_HANDLE;
2809 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2810 ASSERT_VK_SUCCESS(err);
2811 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2812 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2813 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2814 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2815 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2816 image_alloc_info.allocationSize = image_mem_reqs.size;
2817 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2818 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002819 // Create a mask of available memory types *not* supported by these resources,
2820 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002821 VkPhysicalDeviceMemoryProperties memory_properties = {};
2822 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002823 VkDeviceMemory image_mem, buffer_mem;
2824
Cort Stratton4c38bb52017-01-28 13:33:10 -08002825 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002826 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002827 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2828 ASSERT_TRUE(pass);
2829 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2830 ASSERT_VK_SUCCESS(err);
2831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2832 err = vkBindImageMemory(device(), image, image_mem, 0);
2833 (void)err; // This may very well return an error.
2834 m_errorMonitor->VerifyFound();
2835 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002836 }
2837
Cort Stratton4c38bb52017-01-28 13:33:10 -08002838 uint32_t buffer_unsupported_mem_type_bits =
2839 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002840 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002841 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2842 ASSERT_TRUE(pass);
2843 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2844 ASSERT_VK_SUCCESS(err);
2845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2846 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2847 (void)err; // This may very well return an error.
2848 m_errorMonitor->VerifyFound();
2849 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002850 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002851
Cort Stratton4c38bb52017-01-28 13:33:10 -08002852 vkDestroyImage(device(), image, NULL);
2853 vkDestroyBuffer(device(), buffer, NULL);
2854 }
2855
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002856 // Try to bind memory to an image created with sparse memory flags
2857 {
2858 VkImageCreateInfo sparse_image_create_info = image_create_info;
2859 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2860 VkImageFormatProperties image_format_properties = {};
2861 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2862 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2863 sparse_image_create_info.usage, sparse_image_create_info.flags,
2864 &image_format_properties);
2865 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2866 // most likely means sparse formats aren't supported here; skip this test.
2867 } else {
2868 ASSERT_VK_SUCCESS(err);
2869 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002870 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002871 return;
2872 } else {
2873 VkImage sparse_image = VK_NULL_HANDLE;
2874 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2875 ASSERT_VK_SUCCESS(err);
2876 VkMemoryRequirements sparse_mem_reqs = {};
2877 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2878 if (sparse_mem_reqs.memoryTypeBits != 0) {
2879 VkMemoryAllocateInfo sparse_mem_alloc = {};
2880 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2881 sparse_mem_alloc.pNext = NULL;
2882 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2883 sparse_mem_alloc.memoryTypeIndex = 0;
2884 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2885 ASSERT_TRUE(pass);
2886 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2887 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2888 ASSERT_VK_SUCCESS(err);
2889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2890 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2891 // This may very well return an error.
2892 (void)err;
2893 m_errorMonitor->VerifyFound();
2894 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2895 }
2896 vkDestroyImage(m_device->device(), sparse_image, NULL);
2897 }
2898 }
2899 }
2900
2901 // Try to bind memory to a buffer created with sparse memory flags
2902 {
2903 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2904 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2905 if (!m_device->phy().features().sparseResidencyBuffer) {
2906 // most likely means sparse formats aren't supported here; skip this test.
2907 } else {
2908 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2909 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2910 ASSERT_VK_SUCCESS(err);
2911 VkMemoryRequirements sparse_mem_reqs = {};
2912 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2913 if (sparse_mem_reqs.memoryTypeBits != 0) {
2914 VkMemoryAllocateInfo sparse_mem_alloc = {};
2915 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2916 sparse_mem_alloc.pNext = NULL;
2917 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2918 sparse_mem_alloc.memoryTypeIndex = 0;
2919 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2920 ASSERT_TRUE(pass);
2921 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2922 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2923 ASSERT_VK_SUCCESS(err);
2924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2925 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2926 // This may very well return an error.
2927 (void)err;
2928 m_errorMonitor->VerifyFound();
2929 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2930 }
2931 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2932 }
2933 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002934}
2935
Karl Schultz6addd812016-02-02 17:17:23 -07002936TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2937 VkResult err;
2938 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002939
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002941
Tony Barbour1fa09702017-03-16 12:09:08 -06002942 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002943
Karl Schultz6addd812016-02-02 17:17:23 -07002944 // Create an image object, allocate memory, destroy the object and then try
2945 // to bind it
2946 VkImage image;
2947 VkDeviceMemory mem;
2948 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002949
Karl Schultz6addd812016-02-02 17:17:23 -07002950 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2951 const int32_t tex_width = 32;
2952 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002953
2954 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002955 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2956 image_create_info.pNext = NULL;
2957 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2958 image_create_info.format = tex_format;
2959 image_create_info.extent.width = tex_width;
2960 image_create_info.extent.height = tex_height;
2961 image_create_info.extent.depth = 1;
2962 image_create_info.mipLevels = 1;
2963 image_create_info.arrayLayers = 1;
2964 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2965 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2966 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2967 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002969 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002970 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2971 mem_alloc.pNext = NULL;
2972 mem_alloc.allocationSize = 0;
2973 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002974
Chia-I Wuf7458c52015-10-26 21:10:41 +08002975 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002976 ASSERT_VK_SUCCESS(err);
2977
Karl Schultz6addd812016-02-02 17:17:23 -07002978 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002979
2980 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002981 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002982 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002983
2984 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002985 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002986 ASSERT_VK_SUCCESS(err);
2987
2988 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002989 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002990 ASSERT_VK_SUCCESS(err);
2991
2992 // Now Try to bind memory to this destroyed object
2993 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2994 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002995 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002996
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002997 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002998
Chia-I Wuf7458c52015-10-26 21:10:41 +08002999 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06003000}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003001
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003002TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3003 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3004
Tony Barbour1fa09702017-03-16 12:09:08 -06003005 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003006 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3007
3008 VkVertexInputBindingDescription input_binding;
3009 memset(&input_binding, 0, sizeof(input_binding));
3010
3011 VkVertexInputAttributeDescription input_attribs;
3012 memset(&input_attribs, 0, sizeof(input_attribs));
3013
3014 // Pick a really bad format for this purpose and make sure it should fail
3015 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3016 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3017 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003018 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003019 return;
3020 }
3021
3022 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003023 char const *vsSource =
3024 "#version 450\n"
3025 "\n"
3026 "out gl_PerVertex {\n"
3027 " vec4 gl_Position;\n"
3028 "};\n"
3029 "void main(){\n"
3030 " gl_Position = vec4(1);\n"
3031 "}\n";
3032 char const *fsSource =
3033 "#version 450\n"
3034 "\n"
3035 "layout(location=0) out vec4 color;\n"
3036 "void main(){\n"
3037 " color = vec4(1);\n"
3038 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003039
3040 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3041 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3042 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3043
3044 VkPipelineObj pipe(m_device);
3045 pipe.AddColorAttachment();
3046 pipe.AddShader(&vs);
3047 pipe.AddShader(&fs);
3048
3049 pipe.AddVertexInputBindings(&input_binding, 1);
3050 pipe.AddVertexInputAttribs(&input_attribs, 1);
3051
3052 VkDescriptorSetObj descriptorSet(m_device);
3053 descriptorSet.AppendDummy();
3054 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3055
3056 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3057
3058 m_errorMonitor->VerifyFound();
3059}
3060
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003061TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003062 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003063 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003064
3065 VkMemoryPropertyFlags reqs = 0;
3066 VkImageCreateInfo image_create_info = {};
3067 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3068 image_create_info.pNext = NULL;
3069 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3070 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3071 image_create_info.extent.width = 256;
3072 image_create_info.extent.height = 256;
3073 image_create_info.extent.depth = 1;
3074 image_create_info.mipLevels = 1;
3075 image_create_info.arrayLayers = 1;
3076 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3077 image_create_info.flags = 0;
3078
3079 VkImageBlit blit_region = {};
3080 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3081 blit_region.srcSubresource.baseArrayLayer = 0;
3082 blit_region.srcSubresource.layerCount = 1;
3083 blit_region.srcSubresource.mipLevel = 0;
3084 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3085 blit_region.dstSubresource.baseArrayLayer = 0;
3086 blit_region.dstSubresource.layerCount = 1;
3087 blit_region.dstSubresource.mipLevel = 0;
3088
3089 // Create two images, the source with sampleCount = 2, and attempt to blit
3090 // between them
3091 {
3092 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003093 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003094 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003095 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003096 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003097 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003098 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003099 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003100 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003101 m_errorMonitor->SetDesiredFailureMsg(
3102 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3103 "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 -06003104 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3105 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003106 m_errorMonitor->VerifyFound();
3107 m_commandBuffer->EndCommandBuffer();
3108 }
3109
3110 // Create two images, the dest with sampleCount = 4, and attempt to blit
3111 // between them
3112 {
3113 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003114 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003115 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003116 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003117 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003118 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003119 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003120 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003121 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003122 m_errorMonitor->SetDesiredFailureMsg(
3123 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3124 "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 -06003125 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3126 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003127 m_errorMonitor->VerifyFound();
3128 m_commandBuffer->EndCommandBuffer();
3129 }
3130
3131 VkBufferImageCopy copy_region = {};
3132 copy_region.bufferRowLength = 128;
3133 copy_region.bufferImageHeight = 128;
3134 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3135 copy_region.imageSubresource.layerCount = 1;
3136 copy_region.imageExtent.height = 64;
3137 copy_region.imageExtent.width = 64;
3138 copy_region.imageExtent.depth = 1;
3139
3140 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3141 // buffer to image
3142 {
3143 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003144 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3145 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003146 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003147 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003148 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003149 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003150 m_errorMonitor->SetDesiredFailureMsg(
3151 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3152 "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 -06003153 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3154 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003155 m_errorMonitor->VerifyFound();
3156 m_commandBuffer->EndCommandBuffer();
3157 }
3158
3159 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3160 // image to buffer
3161 {
3162 vk_testing::Buffer dst_buffer;
3163 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3164 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003165 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003166 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003167 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003168 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003169 m_errorMonitor->SetDesiredFailureMsg(
3170 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3171 "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 -06003172 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003173 dst_buffer.handle(), 1, &copy_region);
3174 m_errorMonitor->VerifyFound();
3175 m_commandBuffer->EndCommandBuffer();
3176 }
3177}
3178
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003179TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003180 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003181
3182 VkImageObj src_image(m_device);
3183 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3184 VkImageObj dst_image(m_device);
3185 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3186 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003187 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003188
3189 VkImageBlit blitRegion = {};
3190 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3191 blitRegion.srcSubresource.baseArrayLayer = 0;
3192 blitRegion.srcSubresource.layerCount = 1;
3193 blitRegion.srcSubresource.mipLevel = 0;
3194 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3195 blitRegion.dstSubresource.baseArrayLayer = 0;
3196 blitRegion.dstSubresource.layerCount = 1;
3197 blitRegion.dstSubresource.mipLevel = 0;
3198
Dave Houlton34df4cb2016-12-01 16:43:06 -07003199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3200
3201 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3202 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003203
3204 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003205 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003206 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3207 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003208
3209 m_errorMonitor->VerifyFound();
3210
Dave Houlton34df4cb2016-12-01 16:43:06 -07003211 // Test should generate 2 VU failures
3212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003214
3215 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003216 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3217 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003218
Dave Houlton34df4cb2016-12-01 16:43:06 -07003219 // TODO: Note that this only verifies that at least one of the VU enums was found
3220 // 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 -06003221 m_errorMonitor->VerifyFound();
3222
Tony Barbour552f6c02016-12-21 14:34:07 -07003223 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003224}
3225
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003226TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3227 VkResult err;
3228 bool pass;
3229
3230 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003231 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003232
3233 // If w/d/h granularity is 1, test is not meaningful
3234 // TODO: When virtual device limits are available, create a set of limits for this test that
3235 // will always have a granularity of > 1 for w, h, and d
3236 auto index = m_device->graphics_queue_node_index_;
3237 auto queue_family_properties = m_device->phy().queue_properties();
3238
3239 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3240 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3241 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3242 return;
3243 }
3244
3245 // Create two images of different types and try to copy between them
3246 VkImage srcImage;
3247 VkImage dstImage;
3248 VkDeviceMemory srcMem;
3249 VkDeviceMemory destMem;
3250 VkMemoryRequirements memReqs;
3251
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003252 VkImageCreateInfo image_create_info = {};
3253 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3254 image_create_info.pNext = NULL;
3255 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3256 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3257 image_create_info.extent.width = 32;
3258 image_create_info.extent.height = 32;
3259 image_create_info.extent.depth = 1;
3260 image_create_info.mipLevels = 1;
3261 image_create_info.arrayLayers = 4;
3262 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3263 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3264 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3265 image_create_info.flags = 0;
3266
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003267 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003268 ASSERT_VK_SUCCESS(err);
3269
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003270 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003271 ASSERT_VK_SUCCESS(err);
3272
3273 // Allocate memory
3274 VkMemoryAllocateInfo memAlloc = {};
3275 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3276 memAlloc.pNext = NULL;
3277 memAlloc.allocationSize = 0;
3278 memAlloc.memoryTypeIndex = 0;
3279
3280 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3281 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003282 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003283 ASSERT_TRUE(pass);
3284 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3285 ASSERT_VK_SUCCESS(err);
3286
3287 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3288 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003289 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003290 ASSERT_VK_SUCCESS(err);
3291 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3292 ASSERT_VK_SUCCESS(err);
3293
3294 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3295 ASSERT_VK_SUCCESS(err);
3296 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3297 ASSERT_VK_SUCCESS(err);
3298
Tony Barbour552f6c02016-12-21 14:34:07 -07003299 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003300 VkImageCopy copyRegion;
3301 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3302 copyRegion.srcSubresource.mipLevel = 0;
3303 copyRegion.srcSubresource.baseArrayLayer = 0;
3304 copyRegion.srcSubresource.layerCount = 1;
3305 copyRegion.srcOffset.x = 0;
3306 copyRegion.srcOffset.y = 0;
3307 copyRegion.srcOffset.z = 0;
3308 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3309 copyRegion.dstSubresource.mipLevel = 0;
3310 copyRegion.dstSubresource.baseArrayLayer = 0;
3311 copyRegion.dstSubresource.layerCount = 1;
3312 copyRegion.dstOffset.x = 0;
3313 copyRegion.dstOffset.y = 0;
3314 copyRegion.dstOffset.z = 0;
3315 copyRegion.extent.width = 1;
3316 copyRegion.extent.height = 1;
3317 copyRegion.extent.depth = 1;
3318
3319 // Introduce failure by setting srcOffset to a bad granularity value
3320 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3322 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003323 m_errorMonitor->VerifyFound();
3324
3325 // Introduce failure by setting extent to a bad granularity value
3326 copyRegion.srcOffset.y = 0;
3327 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3329 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003330 m_errorMonitor->VerifyFound();
3331
3332 // Now do some buffer/image copies
3333 vk_testing::Buffer buffer;
3334 VkMemoryPropertyFlags reqs = 0;
3335 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3336 VkBufferImageCopy region = {};
3337 region.bufferOffset = 0;
3338 region.bufferRowLength = 3;
3339 region.bufferImageHeight = 128;
3340 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3341 region.imageSubresource.layerCount = 1;
3342 region.imageExtent.height = 16;
3343 region.imageExtent.width = 16;
3344 region.imageExtent.depth = 1;
3345 region.imageOffset.x = 0;
3346 region.imageOffset.y = 0;
3347 region.imageOffset.z = 0;
3348
3349 // Introduce failure by setting bufferRowLength to a bad granularity value
3350 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3352 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3353 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003354 m_errorMonitor->VerifyFound();
3355 region.bufferRowLength = 128;
3356
3357 // Introduce failure by setting bufferOffset to a bad granularity value
3358 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003359 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3360 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3361 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003362 m_errorMonitor->VerifyFound();
3363 region.bufferOffset = 0;
3364
3365 // Introduce failure by setting bufferImageHeight to a bad granularity value
3366 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3368 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3369 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003370 m_errorMonitor->VerifyFound();
3371 region.bufferImageHeight = 128;
3372
3373 // Introduce failure by setting imageExtent to a bad granularity value
3374 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003375 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3376 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3377 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003378 m_errorMonitor->VerifyFound();
3379 region.imageExtent.width = 16;
3380
3381 // Introduce failure by setting imageOffset to a bad granularity value
3382 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3384 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3385 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003386 m_errorMonitor->VerifyFound();
3387
Tony Barbour552f6c02016-12-21 14:34:07 -07003388 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003389
3390 vkDestroyImage(m_device->device(), srcImage, NULL);
3391 vkDestroyImage(m_device->device(), dstImage, NULL);
3392 vkFreeMemory(m_device->device(), srcMem, NULL);
3393 vkFreeMemory(m_device->device(), destMem, NULL);
3394}
3395
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003396TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003397 TEST_DESCRIPTION(
3398 "Submit command buffer created using one queue family and "
3399 "attempt to submit them on a queue created in a different "
3400 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003401
Tony Barbour1fa09702017-03-16 12:09:08 -06003402 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003403
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003404 // This test is meaningless unless we have multiple queue families
3405 auto queue_family_properties = m_device->phy().queue_properties();
3406 if (queue_family_properties.size() < 2) {
3407 return;
3408 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003410 // Get safe index of another queue family
3411 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Tony Barbour1fa09702017-03-16 12:09:08 -06003412 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003413 // Create a second queue using a different queue family
3414 VkQueue other_queue;
3415 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3416
3417 // Record an empty cmd buffer
3418 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3419 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3420 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3421 vkEndCommandBuffer(m_commandBuffer->handle());
3422
3423 // And submit on the wrong queue
3424 VkSubmitInfo submit_info = {};
3425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3426 submit_info.commandBufferCount = 1;
3427 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003428 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003429
3430 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003431}
3432
Chris Forbes4c24a922016-11-16 08:59:10 +13003433TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003434 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003435
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003436 // There are no attachments, but refer to attachment 0.
3437 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003438 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003439 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003440 };
3441
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003442 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003443 VkRenderPass rp;
3444
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003445 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003447 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3448 m_errorMonitor->VerifyFound();
3449}
3450
Chris Forbesa58c4522016-09-28 15:19:39 +13003451TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3452 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003453 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003454
3455 // A renderpass with two subpasses, both writing the same attachment.
3456 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3458 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3459 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003460 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003461 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003462 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003463 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3464 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003465 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003466 VkSubpassDependency dep = {0,
3467 1,
3468 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3469 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3470 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3471 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3472 VK_DEPENDENCY_BY_REGION_BIT};
3473 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003474 VkRenderPass rp;
3475 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3476 ASSERT_VK_SUCCESS(err);
3477
3478 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003479 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003480 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3481
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003482 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003483 VkFramebuffer fb;
3484 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3485 ASSERT_VK_SUCCESS(err);
3486
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003487 char const *vsSource =
3488 "#version 450\n"
3489 "void main() { gl_Position = vec4(1); }\n";
3490 char const *fsSource =
3491 "#version 450\n"
3492 "layout(location=0) out vec4 color;\n"
3493 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003494
3495 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3496 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3497 VkPipelineObj pipe(m_device);
3498 pipe.AddColorAttachment();
3499 pipe.AddShader(&vs);
3500 pipe.AddShader(&fs);
3501 VkViewport view_port = {};
3502 m_viewports.push_back(view_port);
3503 pipe.SetViewport(m_viewports);
3504 VkRect2D rect = {};
3505 m_scissors.push_back(rect);
3506 pipe.SetScissor(m_scissors);
3507
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003508 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003509 VkPipelineLayout pl;
3510 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3511 ASSERT_VK_SUCCESS(err);
3512 pipe.CreateVKPipeline(pl, rp);
3513
Tony Barbour552f6c02016-12-21 14:34:07 -07003514 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003515
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003516 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3517 nullptr,
3518 rp,
3519 fb,
3520 {{
3521 0, 0,
3522 },
3523 {32, 32}},
3524 0,
3525 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003526
3527 // subtest 1: bind in the wrong subpass
3528 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3529 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003530 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 +13003531 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3532 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3533 m_errorMonitor->VerifyFound();
3534
3535 vkCmdEndRenderPass(m_commandBuffer->handle());
3536
3537 // subtest 2: bind in correct subpass, then transition to next subpass
3538 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3539 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3540 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003541 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 +13003542 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3543 m_errorMonitor->VerifyFound();
3544
3545 vkCmdEndRenderPass(m_commandBuffer->handle());
3546
Tony Barbour552f6c02016-12-21 14:34:07 -07003547 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003548
3549 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3550 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3551 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3552}
3553
Tony Barbour4e919972016-08-09 13:27:40 -06003554TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003555 TEST_DESCRIPTION(
3556 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3557 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003558 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003559 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3560
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3562 "Cannot execute a render pass with renderArea "
3563 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003564
3565 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3566 m_renderPassBeginInfo.renderArea.extent.width = 257;
3567 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003568 m_commandBuffer->BeginCommandBuffer();
3569 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003570 m_errorMonitor->VerifyFound();
3571}
3572
3573TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003574 TEST_DESCRIPTION(
3575 "Generate INDEPENDENT_BLEND by disabling independent "
3576 "blend and then specifying different blend states for two "
3577 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003578 VkPhysicalDeviceFeatures features = {};
3579 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003580 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003581
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003582 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3583 "Invalid Pipeline CreateInfo: If independent blend feature not "
3584 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003585
Cody Northropc31a84f2016-08-22 10:41:47 -06003586 VkDescriptorSetObj descriptorSet(m_device);
3587 descriptorSet.AppendDummy();
3588 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003589
Cody Northropc31a84f2016-08-22 10:41:47 -06003590 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003591 // Create a renderPass with two color attachments
3592 VkAttachmentReference attachments[2] = {};
3593 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003594 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003595 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3596
3597 VkSubpassDescription subpass = {};
3598 subpass.pColorAttachments = attachments;
3599 subpass.colorAttachmentCount = 2;
3600
3601 VkRenderPassCreateInfo rpci = {};
3602 rpci.subpassCount = 1;
3603 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003604 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003605
Tony Barbourffd60bd2017-03-09 12:04:55 -07003606 VkAttachmentDescription attach_desc[2] = {};
3607 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3608 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3609 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3610 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3611 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3612 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3613 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3614 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003615
Tony Barbourffd60bd2017-03-09 12:04:55 -07003616 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003617 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3618
3619 VkRenderPass renderpass;
3620 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003621 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003622 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003623
Cody Northropc31a84f2016-08-22 10:41:47 -06003624 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3625 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3626 att_state1.blendEnable = VK_TRUE;
3627 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3628 att_state2.blendEnable = VK_FALSE;
3629 pipeline.AddColorAttachment(0, &att_state1);
3630 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003631 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003632 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003633 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003634}
3635
Mike Weiblen40b160e2017-02-06 19:21:52 -07003636// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3637TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3638 TEST_DESCRIPTION(
3639 "Create a graphics pipeline that is incompatible with the requirements "
3640 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003641 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003642
3643 VkDescriptorSetObj ds_obj(m_device);
3644 ds_obj.AppendDummy();
3645 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3646
3647 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3648
3649 VkPipelineColorBlendAttachmentState att_state1 = {};
3650 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3651 att_state1.blendEnable = VK_TRUE;
3652
3653 VkRenderpassObj rp_obj(m_device);
3654
3655 {
3656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3657 VkPipelineObj pipeline(m_device);
3658 pipeline.AddShader(&vs_obj);
3659 pipeline.AddColorAttachment(0, &att_state1);
3660
3661 VkGraphicsPipelineCreateInfo info = {};
3662 pipeline.InitGraphicsPipelineCreateInfo(&info);
3663 info.pColorBlendState = nullptr;
3664
3665 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3666 m_errorMonitor->VerifyFound();
3667 }
3668}
3669
Chris Forbes26ec2122016-11-29 08:58:33 +13003670#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003671TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3672 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3673 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003674 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003675
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3677 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003678
3679 // Create a renderPass with a single color attachment
3680 VkAttachmentReference attach = {};
3681 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3682 VkSubpassDescription subpass = {};
3683 VkRenderPassCreateInfo rpci = {};
3684 rpci.subpassCount = 1;
3685 rpci.pSubpasses = &subpass;
3686 rpci.attachmentCount = 1;
3687 VkAttachmentDescription attach_desc = {};
3688 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3689 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3690 rpci.pAttachments = &attach_desc;
3691 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3692 VkRenderPass rp;
3693 subpass.pDepthStencilAttachment = &attach;
3694 subpass.pColorAttachments = NULL;
3695 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3696 m_errorMonitor->VerifyFound();
3697}
Chris Forbes26ec2122016-11-29 08:58:33 +13003698#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003699
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003700TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003701 TEST_DESCRIPTION(
3702 "Create a framebuffer where a subpass has a preserve "
3703 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003704
Tony Barbour1fa09702017-03-16 12:09:08 -06003705 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003706 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3707
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003709
3710 VkAttachmentReference color_attach = {};
3711 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3712 color_attach.attachment = 0;
3713 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3714 VkSubpassDescription subpass = {};
3715 subpass.colorAttachmentCount = 1;
3716 subpass.pColorAttachments = &color_attach;
3717 subpass.preserveAttachmentCount = 1;
3718 subpass.pPreserveAttachments = &preserve_attachment;
3719
3720 VkRenderPassCreateInfo rpci = {};
3721 rpci.subpassCount = 1;
3722 rpci.pSubpasses = &subpass;
3723 rpci.attachmentCount = 1;
3724 VkAttachmentDescription attach_desc = {};
3725 attach_desc.format = VK_FORMAT_UNDEFINED;
3726 rpci.pAttachments = &attach_desc;
3727 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3728 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003729 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003730
3731 m_errorMonitor->VerifyFound();
3732
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003733 if (result == VK_SUCCESS) {
3734 vkDestroyRenderPass(m_device->device(), rp, NULL);
3735 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003736}
3737
Chris Forbesc5389742016-06-29 11:49:23 +12003738TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003739 TEST_DESCRIPTION(
3740 "Ensure that CreateRenderPass produces a validation error "
3741 "when the source of a subpass multisample resolve "
3742 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003743
Tony Barbour1fa09702017-03-16 12:09:08 -06003744 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003745
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3747 "Subpass 0 requests multisample resolve from attachment 0 which has "
3748 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003749
3750 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003751 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3752 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3753 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3754 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3755 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3756 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003757 };
3758
3759 VkAttachmentReference color = {
3760 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3761 };
3762
3763 VkAttachmentReference resolve = {
3764 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3765 };
3766
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003767 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003768
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003769 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003770
3771 VkRenderPass rp;
3772 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3773
3774 m_errorMonitor->VerifyFound();
3775
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003776 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003777}
3778
3779TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003780 TEST_DESCRIPTION(
3781 "Ensure CreateRenderPass produces a validation error "
3782 "when a subpass multisample resolve operation is "
3783 "requested, and the destination of that resolve has "
3784 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003785
Tony Barbour1fa09702017-03-16 12:09:08 -06003786 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003787
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3789 "Subpass 0 requests multisample resolve into attachment 1, which "
3790 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003791
3792 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003793 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3794 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3795 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3796 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3797 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3798 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003799 };
3800
3801 VkAttachmentReference color = {
3802 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3803 };
3804
3805 VkAttachmentReference resolve = {
3806 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3807 };
3808
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003809 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003810
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003811 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003812
3813 VkRenderPass rp;
3814 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3815
3816 m_errorMonitor->VerifyFound();
3817
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003818 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003819}
3820
Chris Forbes3f128ef2016-06-29 14:58:53 +12003821TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003822 TEST_DESCRIPTION(
3823 "Ensure CreateRenderPass produces a validation error "
3824 "when the color and depth attachments used by a subpass "
3825 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003826
Tony Barbour1fa09702017-03-16 12:09:08 -06003827 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003828
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3830 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003831
3832 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003833 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3834 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3835 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3836 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3837 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3838 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003839 };
3840
3841 VkAttachmentReference color[] = {
3842 {
3843 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3844 },
3845 {
3846 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3847 },
3848 };
3849
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003850 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003851
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003852 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003853
3854 VkRenderPass rp;
3855 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3856
3857 m_errorMonitor->VerifyFound();
3858
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003859 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003860}
3861
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003862TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003863 TEST_DESCRIPTION(
3864 "Hit errors when attempting to create a framebuffer :\n"
3865 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3866 " 2. Use a color image as depthStencil attachment\n"
3867 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3868 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3869 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3870 " 6. Framebuffer attachment where dimensions don't match\n"
3871 " 7. Framebuffer attachment w/o identity swizzle\n"
3872 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003873
Tony Barbour1fa09702017-03-16 12:09:08 -06003874 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003875 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3876
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003877 m_errorMonitor->SetDesiredFailureMsg(
3878 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3879 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003880
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003881 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003882 VkAttachmentReference attach = {};
3883 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3884 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003885 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003886 VkRenderPassCreateInfo rpci = {};
3887 rpci.subpassCount = 1;
3888 rpci.pSubpasses = &subpass;
3889 rpci.attachmentCount = 1;
3890 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003891 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003892 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003893 rpci.pAttachments = &attach_desc;
3894 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3895 VkRenderPass rp;
3896 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3897 ASSERT_VK_SUCCESS(err);
3898
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003899 VkImageView ivs[2];
3900 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3901 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003902 VkFramebufferCreateInfo fb_info = {};
3903 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3904 fb_info.pNext = NULL;
3905 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003906 // Set mis-matching attachmentCount
3907 fb_info.attachmentCount = 2;
3908 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003909 fb_info.width = 100;
3910 fb_info.height = 100;
3911 fb_info.layers = 1;
3912
3913 VkFramebuffer fb;
3914 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3915
3916 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003917 if (err == VK_SUCCESS) {
3918 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3919 }
3920 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003921
3922 // Create a renderPass with a depth-stencil attachment created with
3923 // IMAGE_USAGE_COLOR_ATTACHMENT
3924 // Add our color attachment to pDepthStencilAttachment
3925 subpass.pDepthStencilAttachment = &attach;
3926 subpass.pColorAttachments = NULL;
3927 VkRenderPass rp_ds;
3928 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3929 ASSERT_VK_SUCCESS(err);
3930 // Set correct attachment count, but attachment has COLOR usage bit set
3931 fb_info.attachmentCount = 1;
3932 fb_info.renderPass = rp_ds;
3933
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003935 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3936
3937 m_errorMonitor->VerifyFound();
3938 if (err == VK_SUCCESS) {
3939 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3940 }
3941 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003942
3943 // Create new renderpass with alternate attachment format from fb
3944 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3945 subpass.pDepthStencilAttachment = NULL;
3946 subpass.pColorAttachments = &attach;
3947 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3948 ASSERT_VK_SUCCESS(err);
3949
3950 // Cause error due to mis-matched formats between rp & fb
3951 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3952 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3954 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003955 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3956
3957 m_errorMonitor->VerifyFound();
3958 if (err == VK_SUCCESS) {
3959 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3960 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003961 vkDestroyRenderPass(m_device->device(), rp, NULL);
3962
3963 // Create new renderpass with alternate sample count from fb
3964 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3965 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3966 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3967 ASSERT_VK_SUCCESS(err);
3968
3969 // Cause error due to mis-matched sample count between rp & fb
3970 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003972 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003973 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3974
3975 m_errorMonitor->VerifyFound();
3976 if (err == VK_SUCCESS) {
3977 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3978 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003979
3980 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003981
3982 // Create a custom imageView with non-1 mip levels
3983 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003984 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003985 ASSERT_TRUE(image.initialized());
3986
3987 VkImageView view;
3988 VkImageViewCreateInfo ivci = {};
3989 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3990 ivci.image = image.handle();
3991 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3992 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3993 ivci.subresourceRange.layerCount = 1;
3994 ivci.subresourceRange.baseMipLevel = 0;
3995 // Set level count 2 (only 1 is allowed for FB attachment)
3996 ivci.subresourceRange.levelCount = 2;
3997 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3998 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3999 ASSERT_VK_SUCCESS(err);
4000 // Re-create renderpass to have matching sample count
4001 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4002 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4003 ASSERT_VK_SUCCESS(err);
4004
4005 fb_info.renderPass = rp;
4006 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004008 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4009
4010 m_errorMonitor->VerifyFound();
4011 if (err == VK_SUCCESS) {
4012 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4013 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004014 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004015 // Update view to original color buffer and grow FB dimensions too big
4016 fb_info.pAttachments = ivs;
4017 fb_info.height = 1024;
4018 fb_info.width = 1024;
4019 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004021 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4022
4023 m_errorMonitor->VerifyFound();
4024 if (err == VK_SUCCESS) {
4025 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4026 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004027 // Create view attachment with non-identity swizzle
4028 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4029 ivci.image = image.handle();
4030 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4031 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4032 ivci.subresourceRange.layerCount = 1;
4033 ivci.subresourceRange.baseMipLevel = 0;
4034 ivci.subresourceRange.levelCount = 1;
4035 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4036 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4037 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4038 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4039 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4040 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4041 ASSERT_VK_SUCCESS(err);
4042
4043 fb_info.pAttachments = &view;
4044 fb_info.height = 100;
4045 fb_info.width = 100;
4046 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004047 m_errorMonitor->SetDesiredFailureMsg(
4048 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4049 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004050 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4051
4052 m_errorMonitor->VerifyFound();
4053 if (err == VK_SUCCESS) {
4054 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4055 }
4056 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004057 // reset attachment to color attachment
4058 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004059
4060 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004061 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004062 fb_info.height = 100;
4063 fb_info.layers = 1;
4064 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004065 m_errorMonitor->SetDesiredFailureMsg(
4066 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004067 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4068 "Here are the respective dimensions for attachment");
4069
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004070 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4071
4072 m_errorMonitor->VerifyFound();
4073 if (err == VK_SUCCESS) {
4074 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4075 }
4076
4077 // Request fb that exceeds max height
4078 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004079 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004080 fb_info.layers = 1;
4081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004082 m_errorMonitor->SetDesiredFailureMsg(
4083 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004084 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4085 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004086 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4087
4088 m_errorMonitor->VerifyFound();
4089 if (err == VK_SUCCESS) {
4090 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4091 }
4092
4093 // Request fb that exceeds max layers
4094 fb_info.width = 100;
4095 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004096 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004098 m_errorMonitor->SetDesiredFailureMsg(
4099 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004100 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4101 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004102 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4103
4104 m_errorMonitor->VerifyFound();
4105 if (err == VK_SUCCESS) {
4106 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4107 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004108
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004109 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004110}
4111
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004112TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004113 TEST_DESCRIPTION(
4114 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4115 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004116
Tony Barbour1fa09702017-03-16 12:09:08 -06004117 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004118 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004119 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4120 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004121 m_errorMonitor->VerifyFound();
4122}
4123
4124TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004125 TEST_DESCRIPTION(
4126 "Run a simple draw calls to validate failure when Line Width dynamic "
4127 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004128
Tony Barbour1fa09702017-03-16 12:09:08 -06004129 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004130 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4132 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004133 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004134}
4135
4136TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004137 TEST_DESCRIPTION(
4138 "Run a simple draw calls to validate failure when Viewport dynamic "
4139 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004140
Tony Barbour1fa09702017-03-16 12:09:08 -06004141 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004142 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4144 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004145 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004146 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004147}
4148
4149TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004150 TEST_DESCRIPTION(
4151 "Run a simple draw calls to validate failure when Scissor dynamic "
4152 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004153
Tony Barbour1fa09702017-03-16 12:09:08 -06004154 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004155 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4157 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004158 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004159 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004160}
4161
Cortd713fe82016-07-27 09:51:27 -07004162TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004163 TEST_DESCRIPTION(
4164 "Run a simple draw calls to validate failure when Blend Constants "
4165 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004166
Tony Barbour1fa09702017-03-16 12:09:08 -06004167 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004168 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4170 "Dynamic blend constants state not set for this command buffer");
4171 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004172 m_errorMonitor->VerifyFound();
4173}
4174
4175TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004176 TEST_DESCRIPTION(
4177 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4178 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004179
Tony Barbour1fa09702017-03-16 12:09:08 -06004180 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004181 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004182 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004183 return;
4184 }
4185 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4187 "Dynamic depth bounds state not set for this command buffer");
4188 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004189 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004190}
4191
4192TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004193 TEST_DESCRIPTION(
4194 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4195 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004196
Tony Barbour1fa09702017-03-16 12:09:08 -06004197 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004198 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4200 "Dynamic stencil read mask state not set for this command buffer");
4201 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004202 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004203}
4204
4205TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004206 TEST_DESCRIPTION(
4207 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4208 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004209
Tony Barbour1fa09702017-03-16 12:09:08 -06004210 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004211 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4213 "Dynamic stencil write mask state not set for this command buffer");
4214 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004215 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004216}
4217
4218TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004219 TEST_DESCRIPTION(
4220 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4221 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004222
Tony Barbour1fa09702017-03-16 12:09:08 -06004223 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004224 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4226 "Dynamic stencil reference state not set for this command buffer");
4227 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004228 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004229}
4230
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004231TEST_F(VkLayerTest, IndexBufferNotBound) {
4232 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004233
Tony Barbour1fa09702017-03-16 12:09:08 -06004234 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4236 "Index buffer object not bound to this command buffer when Indexed ");
4237 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004238 m_errorMonitor->VerifyFound();
4239}
4240
Karl Schultz6addd812016-02-02 17:17:23 -07004241TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4243 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4244 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004245
Tony Barbour1fa09702017-03-16 12:09:08 -06004246 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004247 ASSERT_NO_FATAL_FAILURE(InitViewport());
4248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4249
Karl Schultz6addd812016-02-02 17:17:23 -07004250 // We luck out b/c by default the framework creates CB w/ the
4251 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004252 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004253 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004254 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004256 // Bypass framework since it does the waits automatically
4257 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004258 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004259 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4260 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004261 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004262 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004263 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004264 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004265 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004266 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004267 submit_info.pSignalSemaphores = NULL;
4268
Chris Forbes40028e22016-06-13 09:59:34 +12004269 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004270 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004271 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004272
Karl Schultz6addd812016-02-02 17:17:23 -07004273 // Cause validation error by re-submitting cmd buffer that should only be
4274 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004275 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004276 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004277
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004278 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004279}
4280
Karl Schultz6addd812016-02-02 17:17:23 -07004281TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004282 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004283 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004284
Tony Barbour1fa09702017-03-16 12:09:08 -06004285 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004287
Karl Schultz6addd812016-02-02 17:17:23 -07004288 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4289 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004290 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004291 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004292 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004293
4294 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004295 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4296 ds_pool_ci.pNext = NULL;
4297 ds_pool_ci.flags = 0;
4298 ds_pool_ci.maxSets = 1;
4299 ds_pool_ci.poolSizeCount = 1;
4300 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004301
4302 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004303 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004304 ASSERT_VK_SUCCESS(err);
4305
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004306 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4307 dsl_binding_samp.binding = 0;
4308 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4309 dsl_binding_samp.descriptorCount = 1;
4310 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4311 dsl_binding_samp.pImmutableSamplers = NULL;
4312
4313 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4314 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4315 ds_layout_ci.pNext = NULL;
4316 ds_layout_ci.bindingCount = 1;
4317 ds_layout_ci.pBindings = &dsl_binding_samp;
4318
4319 VkDescriptorSetLayout ds_layout_samp;
4320 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4321 ASSERT_VK_SUCCESS(err);
4322
4323 // Try to allocate 2 sets when pool only has 1 set
4324 VkDescriptorSet descriptor_sets[2];
4325 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4326 VkDescriptorSetAllocateInfo alloc_info = {};
4327 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4328 alloc_info.descriptorSetCount = 2;
4329 alloc_info.descriptorPool = ds_pool;
4330 alloc_info.pSetLayouts = set_layouts;
4331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4332 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4333 m_errorMonitor->VerifyFound();
4334
4335 alloc_info.descriptorSetCount = 1;
4336 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004337 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004338 dsl_binding.binding = 0;
4339 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4340 dsl_binding.descriptorCount = 1;
4341 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4342 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004343
Karl Schultz6addd812016-02-02 17:17:23 -07004344 ds_layout_ci.bindingCount = 1;
4345 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004346
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004347 VkDescriptorSetLayout ds_layout_ub;
4348 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004349 ASSERT_VK_SUCCESS(err);
4350
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004351 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004352 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004353 alloc_info.pSetLayouts = &ds_layout_ub;
4354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4355 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004356
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004357 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004358
Karl Schultz2825ab92016-12-02 08:23:14 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004360 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004361 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004362}
4363
Karl Schultz6addd812016-02-02 17:17:23 -07004364TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4365 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004366
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004367 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004368
Tony Barbour1fa09702017-03-16 12:09:08 -06004369 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004371
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004372 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004373 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4374 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004375
4376 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004377 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4378 ds_pool_ci.pNext = NULL;
4379 ds_pool_ci.maxSets = 1;
4380 ds_pool_ci.poolSizeCount = 1;
4381 ds_pool_ci.flags = 0;
4382 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4383 // app can only call vkResetDescriptorPool on this pool.;
4384 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004385
4386 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004387 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004388 ASSERT_VK_SUCCESS(err);
4389
4390 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004391 dsl_binding.binding = 0;
4392 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4393 dsl_binding.descriptorCount = 1;
4394 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4395 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004396
4397 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004398 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4399 ds_layout_ci.pNext = NULL;
4400 ds_layout_ci.bindingCount = 1;
4401 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004402
4403 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004404 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004405 ASSERT_VK_SUCCESS(err);
4406
4407 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004408 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004409 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004410 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004411 alloc_info.descriptorPool = ds_pool;
4412 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004413 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004414 ASSERT_VK_SUCCESS(err);
4415
4416 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004417 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004418
Chia-I Wuf7458c52015-10-26 21:10:41 +08004419 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4420 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004421}
4422
Karl Schultz6addd812016-02-02 17:17:23 -07004423TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004424 // Attempt to clear Descriptor Pool with bad object.
4425 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004426
Tony Barbour1fa09702017-03-16 12:09:08 -06004427 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004429 uint64_t fake_pool_handle = 0xbaad6001;
4430 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4431 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004432 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004433}
4434
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004435TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004436 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4437 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004438 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004439 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004440
4441 uint64_t fake_set_handle = 0xbaad6001;
4442 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004443 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004444 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004445
Tony Barbour1fa09702017-03-16 12:09:08 -06004446 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004447
4448 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4449 layout_bindings[0].binding = 0;
4450 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4451 layout_bindings[0].descriptorCount = 1;
4452 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4453 layout_bindings[0].pImmutableSamplers = NULL;
4454
4455 VkDescriptorSetLayout descriptor_set_layout;
4456 VkDescriptorSetLayoutCreateInfo dslci = {};
4457 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4458 dslci.pNext = NULL;
4459 dslci.bindingCount = 1;
4460 dslci.pBindings = layout_bindings;
4461 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004462 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004463
4464 VkPipelineLayout pipeline_layout;
4465 VkPipelineLayoutCreateInfo plci = {};
4466 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4467 plci.pNext = NULL;
4468 plci.setLayoutCount = 1;
4469 plci.pSetLayouts = &descriptor_set_layout;
4470 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004471 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004472
Tony Barbour552f6c02016-12-21 14:34:07 -07004473 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004474 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4475 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004476 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004477 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004478 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4479 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004480}
4481
Karl Schultz6addd812016-02-02 17:17:23 -07004482TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004483 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4484 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004485 uint64_t fake_layout_handle = 0xbaad6001;
4486 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004488 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004489 VkPipelineLayout pipeline_layout;
4490 VkPipelineLayoutCreateInfo plci = {};
4491 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4492 plci.pNext = NULL;
4493 plci.setLayoutCount = 1;
4494 plci.pSetLayouts = &bad_layout;
4495 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4496
4497 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004498}
4499
Mark Muellerd4914412016-06-13 17:52:06 -06004500TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004501 TEST_DESCRIPTION(
4502 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4503 "1) A uniform buffer update must have a valid buffer index."
4504 "2) When using an array of descriptors in a single WriteDescriptor,"
4505 " the descriptor types and stageflags must all be the same."
4506 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004507
Mike Weiblena6666382017-01-05 15:16:11 -07004508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004509
Tony Barbour1fa09702017-03-16 12:09:08 -06004510 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004511 VkDescriptorPoolSize ds_type_count[4] = {};
4512 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4513 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004514 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004515 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004516 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004517 ds_type_count[2].descriptorCount = 1;
4518 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4519 ds_type_count[3].descriptorCount = 1;
4520
4521 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4522 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4523 ds_pool_ci.maxSets = 1;
4524 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4525 ds_pool_ci.pPoolSizes = ds_type_count;
4526
4527 VkDescriptorPool ds_pool;
4528 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4529 ASSERT_VK_SUCCESS(err);
4530
Mark Muellerb9896722016-06-16 09:54:29 -06004531 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004532 layout_binding[0].binding = 0;
4533 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4534 layout_binding[0].descriptorCount = 1;
4535 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4536 layout_binding[0].pImmutableSamplers = NULL;
4537
4538 layout_binding[1].binding = 1;
4539 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4540 layout_binding[1].descriptorCount = 1;
4541 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4542 layout_binding[1].pImmutableSamplers = NULL;
4543
4544 VkSamplerCreateInfo sampler_ci = {};
4545 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4546 sampler_ci.pNext = NULL;
4547 sampler_ci.magFilter = VK_FILTER_NEAREST;
4548 sampler_ci.minFilter = VK_FILTER_NEAREST;
4549 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4550 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4553 sampler_ci.mipLodBias = 1.0;
4554 sampler_ci.anisotropyEnable = VK_FALSE;
4555 sampler_ci.maxAnisotropy = 1;
4556 sampler_ci.compareEnable = VK_FALSE;
4557 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4558 sampler_ci.minLod = 1.0;
4559 sampler_ci.maxLod = 1.0;
4560 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4561 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4562 VkSampler sampler;
4563
4564 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4565 ASSERT_VK_SUCCESS(err);
4566
4567 layout_binding[2].binding = 2;
4568 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4569 layout_binding[2].descriptorCount = 1;
4570 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4571 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4572
Mark Muellerd4914412016-06-13 17:52:06 -06004573 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4574 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4575 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4576 ds_layout_ci.pBindings = layout_binding;
4577 VkDescriptorSetLayout ds_layout;
4578 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4579 ASSERT_VK_SUCCESS(err);
4580
4581 VkDescriptorSetAllocateInfo alloc_info = {};
4582 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4583 alloc_info.descriptorSetCount = 1;
4584 alloc_info.descriptorPool = ds_pool;
4585 alloc_info.pSetLayouts = &ds_layout;
4586 VkDescriptorSet descriptorSet;
4587 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4588 ASSERT_VK_SUCCESS(err);
4589
4590 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4591 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4592 pipeline_layout_ci.pNext = NULL;
4593 pipeline_layout_ci.setLayoutCount = 1;
4594 pipeline_layout_ci.pSetLayouts = &ds_layout;
4595
4596 VkPipelineLayout pipeline_layout;
4597 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4598 ASSERT_VK_SUCCESS(err);
4599
Mark Mueller5c838ce2016-06-16 09:54:29 -06004600 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004601 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4602 descriptor_write.dstSet = descriptorSet;
4603 descriptor_write.dstBinding = 0;
4604 descriptor_write.descriptorCount = 1;
4605 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4606
Mark Mueller5c838ce2016-06-16 09:54:29 -06004607 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004608 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4609 m_errorMonitor->VerifyFound();
4610
4611 // Create a buffer to update the descriptor with
4612 uint32_t qfi = 0;
4613 VkBufferCreateInfo buffCI = {};
4614 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4615 buffCI.size = 1024;
4616 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4617 buffCI.queueFamilyIndexCount = 1;
4618 buffCI.pQueueFamilyIndices = &qfi;
4619
4620 VkBuffer dyub;
4621 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4622 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004623
Tony Barboure132c5f2016-12-12 11:50:20 -07004624 VkDeviceMemory mem;
4625 VkMemoryRequirements mem_reqs;
4626 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4627
4628 VkMemoryAllocateInfo mem_alloc_info = {};
4629 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4630 mem_alloc_info.allocationSize = mem_reqs.size;
4631 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4632 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4633 ASSERT_VK_SUCCESS(err);
4634
4635 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4636 ASSERT_VK_SUCCESS(err);
4637
4638 VkDescriptorBufferInfo buffInfo[2] = {};
4639 buffInfo[0].buffer = dyub;
4640 buffInfo[0].offset = 0;
4641 buffInfo[0].range = 1024;
4642 buffInfo[1].buffer = dyub;
4643 buffInfo[1].offset = 0;
4644 buffInfo[1].range = 1024;
4645 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004646 descriptor_write.descriptorCount = 2;
4647
Mark Mueller5c838ce2016-06-16 09:54:29 -06004648 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004650 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4651 m_errorMonitor->VerifyFound();
4652
Mark Mueller5c838ce2016-06-16 09:54:29 -06004653 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4654 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004655 descriptor_write.dstBinding = 1;
4656 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657
Mark Mueller5c838ce2016-06-16 09:54:29 -06004658 // Make pImageInfo index non-null to avoid complaints of it missing
4659 VkDescriptorImageInfo imageInfo = {};
4660 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4661 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004663 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4664 m_errorMonitor->VerifyFound();
4665
Mark Muellerd4914412016-06-13 17:52:06 -06004666 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004667 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004668 vkDestroySampler(m_device->device(), sampler, NULL);
4669 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4670 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4671 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4672}
4673
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004674TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004675 TEST_DESCRIPTION(
4676 "Attempt to draw with a command buffer that is invalid "
4677 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004678 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004680 VkBuffer buffer;
4681 VkDeviceMemory mem;
4682 VkMemoryRequirements mem_reqs;
4683
4684 VkBufferCreateInfo buf_info = {};
4685 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004686 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004687 buf_info.size = 256;
4688 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4689 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4690 ASSERT_VK_SUCCESS(err);
4691
4692 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4693
4694 VkMemoryAllocateInfo alloc_info = {};
4695 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4696 alloc_info.allocationSize = 256;
4697 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004698 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 -06004699 if (!pass) {
4700 vkDestroyBuffer(m_device->device(), buffer, NULL);
4701 return;
4702 }
4703 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4704 ASSERT_VK_SUCCESS(err);
4705
4706 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4707 ASSERT_VK_SUCCESS(err);
4708
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004709 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004710 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004711 m_commandBuffer->EndCommandBuffer();
4712
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004714 // Destroy buffer dependency prior to submit to cause ERROR
4715 vkDestroyBuffer(m_device->device(), buffer, NULL);
4716
4717 VkSubmitInfo submit_info = {};
4718 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4719 submit_info.commandBufferCount = 1;
4720 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4721 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4722
4723 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004724 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004725 vkFreeMemory(m_device->handle(), mem, NULL);
4726}
4727
Tobin Ehlisea413442016-09-28 10:23:59 -06004728TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4729 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4730
Tony Barbour1fa09702017-03-16 12:09:08 -06004731 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004732 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4733
4734 VkDescriptorPoolSize ds_type_count;
4735 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4736 ds_type_count.descriptorCount = 1;
4737
4738 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4739 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4740 ds_pool_ci.maxSets = 1;
4741 ds_pool_ci.poolSizeCount = 1;
4742 ds_pool_ci.pPoolSizes = &ds_type_count;
4743
4744 VkDescriptorPool ds_pool;
4745 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4746 ASSERT_VK_SUCCESS(err);
4747
4748 VkDescriptorSetLayoutBinding layout_binding;
4749 layout_binding.binding = 0;
4750 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4751 layout_binding.descriptorCount = 1;
4752 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4753 layout_binding.pImmutableSamplers = NULL;
4754
4755 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4756 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4757 ds_layout_ci.bindingCount = 1;
4758 ds_layout_ci.pBindings = &layout_binding;
4759 VkDescriptorSetLayout ds_layout;
4760 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4761 ASSERT_VK_SUCCESS(err);
4762
4763 VkDescriptorSetAllocateInfo alloc_info = {};
4764 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4765 alloc_info.descriptorSetCount = 1;
4766 alloc_info.descriptorPool = ds_pool;
4767 alloc_info.pSetLayouts = &ds_layout;
4768 VkDescriptorSet descriptor_set;
4769 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4770 ASSERT_VK_SUCCESS(err);
4771
4772 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4773 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4774 pipeline_layout_ci.pNext = NULL;
4775 pipeline_layout_ci.setLayoutCount = 1;
4776 pipeline_layout_ci.pSetLayouts = &ds_layout;
4777
4778 VkPipelineLayout pipeline_layout;
4779 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4780 ASSERT_VK_SUCCESS(err);
4781
4782 VkBuffer buffer;
4783 uint32_t queue_family_index = 0;
4784 VkBufferCreateInfo buffer_create_info = {};
4785 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4786 buffer_create_info.size = 1024;
4787 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4788 buffer_create_info.queueFamilyIndexCount = 1;
4789 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4790
4791 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4792 ASSERT_VK_SUCCESS(err);
4793
4794 VkMemoryRequirements memory_reqs;
4795 VkDeviceMemory buffer_memory;
4796
4797 VkMemoryAllocateInfo memory_info = {};
4798 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4799 memory_info.allocationSize = 0;
4800 memory_info.memoryTypeIndex = 0;
4801
4802 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4803 memory_info.allocationSize = memory_reqs.size;
4804 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4805 ASSERT_TRUE(pass);
4806
4807 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4808 ASSERT_VK_SUCCESS(err);
4809 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4810 ASSERT_VK_SUCCESS(err);
4811
4812 VkBufferView view;
4813 VkBufferViewCreateInfo bvci = {};
4814 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4815 bvci.buffer = buffer;
4816 bvci.format = VK_FORMAT_R8_UNORM;
4817 bvci.range = VK_WHOLE_SIZE;
4818
4819 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4820 ASSERT_VK_SUCCESS(err);
4821
4822 VkWriteDescriptorSet descriptor_write = {};
4823 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4824 descriptor_write.dstSet = descriptor_set;
4825 descriptor_write.dstBinding = 0;
4826 descriptor_write.descriptorCount = 1;
4827 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4828 descriptor_write.pTexelBufferView = &view;
4829
4830 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4831
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004832 char const *vsSource =
4833 "#version 450\n"
4834 "\n"
4835 "out gl_PerVertex { \n"
4836 " vec4 gl_Position;\n"
4837 "};\n"
4838 "void main(){\n"
4839 " gl_Position = vec4(1);\n"
4840 "}\n";
4841 char const *fsSource =
4842 "#version 450\n"
4843 "\n"
4844 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4845 "layout(location=0) out vec4 x;\n"
4846 "void main(){\n"
4847 " x = imageLoad(s, 0);\n"
4848 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004849 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4850 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4851 VkPipelineObj pipe(m_device);
4852 pipe.AddShader(&vs);
4853 pipe.AddShader(&fs);
4854 pipe.AddColorAttachment();
4855 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4856
Tobin Ehlisea413442016-09-28 10:23:59 -06004857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4858
Tony Barbour552f6c02016-12-21 14:34:07 -07004859 m_commandBuffer->BeginCommandBuffer();
4860 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4861
Tobin Ehlisea413442016-09-28 10:23:59 -06004862 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4863 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4864 VkRect2D scissor = {{0, 0}, {16, 16}};
4865 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4866 // Bind pipeline to cmd buffer
4867 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4868 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4869 &descriptor_set, 0, nullptr);
4870 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004871 m_commandBuffer->EndRenderPass();
4872 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004873
4874 // Delete BufferView in order to invalidate cmd buffer
4875 vkDestroyBufferView(m_device->device(), view, NULL);
4876 // Now attempt submit of cmd buffer
4877 VkSubmitInfo submit_info = {};
4878 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4879 submit_info.commandBufferCount = 1;
4880 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4881 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4882 m_errorMonitor->VerifyFound();
4883
4884 // Clean-up
4885 vkDestroyBuffer(m_device->device(), buffer, NULL);
4886 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4887 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4888 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4889 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4890}
4891
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004892TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004893 TEST_DESCRIPTION(
4894 "Attempt to draw with a command buffer that is invalid "
4895 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004896 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004897
4898 VkImage image;
4899 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4900 VkImageCreateInfo image_create_info = {};
4901 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4902 image_create_info.pNext = NULL;
4903 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4904 image_create_info.format = tex_format;
4905 image_create_info.extent.width = 32;
4906 image_create_info.extent.height = 32;
4907 image_create_info.extent.depth = 1;
4908 image_create_info.mipLevels = 1;
4909 image_create_info.arrayLayers = 1;
4910 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4911 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004912 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004913 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004914 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004915 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004916 // Have to bind memory to image before recording cmd in cmd buffer using it
4917 VkMemoryRequirements mem_reqs;
4918 VkDeviceMemory image_mem;
4919 bool pass;
4920 VkMemoryAllocateInfo mem_alloc = {};
4921 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4922 mem_alloc.pNext = NULL;
4923 mem_alloc.memoryTypeIndex = 0;
4924 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4925 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004926 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004927 ASSERT_TRUE(pass);
4928 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4929 ASSERT_VK_SUCCESS(err);
4930 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4931 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004933 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004934 VkClearColorValue ccv;
4935 ccv.float32[0] = 1.0f;
4936 ccv.float32[1] = 1.0f;
4937 ccv.float32[2] = 1.0f;
4938 ccv.float32[3] = 1.0f;
4939 VkImageSubresourceRange isr = {};
4940 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004941 isr.baseArrayLayer = 0;
4942 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004943 isr.layerCount = 1;
4944 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004945 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004946 m_commandBuffer->EndCommandBuffer();
4947
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004949 // Destroy image dependency prior to submit to cause ERROR
4950 vkDestroyImage(m_device->device(), image, NULL);
4951
4952 VkSubmitInfo submit_info = {};
4953 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4954 submit_info.commandBufferCount = 1;
4955 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4956 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4957
4958 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004959 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004960}
4961
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004962TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004963 TEST_DESCRIPTION(
4964 "Attempt to draw with a command buffer that is invalid "
4965 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004966 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004967 VkFormatProperties format_properties;
4968 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004969 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4970 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004971 return;
4972 }
4973
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4975
4976 VkImageCreateInfo image_ci = {};
4977 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4978 image_ci.pNext = NULL;
4979 image_ci.imageType = VK_IMAGE_TYPE_2D;
4980 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4981 image_ci.extent.width = 32;
4982 image_ci.extent.height = 32;
4983 image_ci.extent.depth = 1;
4984 image_ci.mipLevels = 1;
4985 image_ci.arrayLayers = 1;
4986 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4987 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004988 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004989 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4990 image_ci.flags = 0;
4991 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004992 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004993
4994 VkMemoryRequirements memory_reqs;
4995 VkDeviceMemory image_memory;
4996 bool pass;
4997 VkMemoryAllocateInfo memory_info = {};
4998 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4999 memory_info.pNext = NULL;
5000 memory_info.allocationSize = 0;
5001 memory_info.memoryTypeIndex = 0;
5002 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5003 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005004 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005005 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005006 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005007 ASSERT_VK_SUCCESS(err);
5008 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5009 ASSERT_VK_SUCCESS(err);
5010
5011 VkImageViewCreateInfo ivci = {
5012 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5013 nullptr,
5014 0,
5015 image,
5016 VK_IMAGE_VIEW_TYPE_2D,
5017 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005018 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005019 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5020 };
5021 VkImageView view;
5022 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5023 ASSERT_VK_SUCCESS(err);
5024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005025 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005026 VkFramebuffer fb;
5027 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5028 ASSERT_VK_SUCCESS(err);
5029
5030 // Just use default renderpass with our framebuffer
5031 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005032 m_renderPassBeginInfo.renderArea.extent.width = 32;
5033 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005034 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005035 m_commandBuffer->BeginCommandBuffer();
5036 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5037 m_commandBuffer->EndRenderPass();
5038 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005039 // Destroy image attached to framebuffer to invalidate cmd buffer
5040 vkDestroyImage(m_device->device(), image, NULL);
5041 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005043 QueueCommandBuffer(false);
5044 m_errorMonitor->VerifyFound();
5045
5046 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5047 vkDestroyImageView(m_device->device(), view, nullptr);
5048 vkFreeMemory(m_device->device(), image_memory, nullptr);
5049}
5050
Tobin Ehlisb329f992016-10-12 13:20:29 -06005051TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5052 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005053 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005054 VkFormatProperties format_properties;
5055 VkResult err = VK_SUCCESS;
5056 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5057
Tobin Ehlisb329f992016-10-12 13:20:29 -06005058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5059
5060 VkImageObj image(m_device);
5061 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5062 ASSERT_TRUE(image.initialized());
5063 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5064
5065 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5066 VkFramebuffer fb;
5067 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5068 ASSERT_VK_SUCCESS(err);
5069
5070 // Just use default renderpass with our framebuffer
5071 m_renderPassBeginInfo.framebuffer = fb;
5072 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005073 m_commandBuffer->BeginCommandBuffer();
5074 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5075 m_commandBuffer->EndRenderPass();
5076 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005077 // Submit cmd buffer to put it in-flight
5078 VkSubmitInfo submit_info = {};
5079 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5080 submit_info.commandBufferCount = 1;
5081 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5082 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5083 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005085 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5086 m_errorMonitor->VerifyFound();
5087 // Wait for queue to complete so we can safely destroy everything
5088 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005089 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5090 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005091 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5092}
5093
Tobin Ehlis88becd72016-09-21 14:33:41 -06005094TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5095 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005096 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005097 VkFormatProperties format_properties;
5098 VkResult err = VK_SUCCESS;
5099 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100
Tobin Ehlis88becd72016-09-21 14:33:41 -06005101 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5102
5103 VkImageCreateInfo image_ci = {};
5104 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5105 image_ci.pNext = NULL;
5106 image_ci.imageType = VK_IMAGE_TYPE_2D;
5107 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5108 image_ci.extent.width = 256;
5109 image_ci.extent.height = 256;
5110 image_ci.extent.depth = 1;
5111 image_ci.mipLevels = 1;
5112 image_ci.arrayLayers = 1;
5113 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5114 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005115 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005116 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5117 image_ci.flags = 0;
5118 VkImage image;
5119 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5120
5121 VkMemoryRequirements memory_reqs;
5122 VkDeviceMemory image_memory;
5123 bool pass;
5124 VkMemoryAllocateInfo memory_info = {};
5125 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5126 memory_info.pNext = NULL;
5127 memory_info.allocationSize = 0;
5128 memory_info.memoryTypeIndex = 0;
5129 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5130 memory_info.allocationSize = memory_reqs.size;
5131 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5132 ASSERT_TRUE(pass);
5133 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5134 ASSERT_VK_SUCCESS(err);
5135 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5136 ASSERT_VK_SUCCESS(err);
5137
5138 VkImageViewCreateInfo ivci = {
5139 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5140 nullptr,
5141 0,
5142 image,
5143 VK_IMAGE_VIEW_TYPE_2D,
5144 VK_FORMAT_B8G8R8A8_UNORM,
5145 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5146 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5147 };
5148 VkImageView view;
5149 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5150 ASSERT_VK_SUCCESS(err);
5151
5152 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5153 VkFramebuffer fb;
5154 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5155 ASSERT_VK_SUCCESS(err);
5156
5157 // Just use default renderpass with our framebuffer
5158 m_renderPassBeginInfo.framebuffer = fb;
5159 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005160 m_commandBuffer->BeginCommandBuffer();
5161 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5162 m_commandBuffer->EndRenderPass();
5163 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005164 // Submit cmd buffer to put it (and attached imageView) in-flight
5165 VkSubmitInfo submit_info = {};
5166 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5167 submit_info.commandBufferCount = 1;
5168 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5169 // Submit cmd buffer to put framebuffer and children in-flight
5170 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5171 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005173 vkDestroyImage(m_device->device(), image, NULL);
5174 m_errorMonitor->VerifyFound();
5175 // Wait for queue to complete so we can safely destroy image and other objects
5176 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005177 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5178 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005179 vkDestroyImage(m_device->device(), image, NULL);
5180 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5181 vkDestroyImageView(m_device->device(), view, nullptr);
5182 vkFreeMemory(m_device->device(), image_memory, nullptr);
5183}
5184
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005185TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5186 TEST_DESCRIPTION("Delete in-use renderPass.");
5187
Tony Barbour1fa09702017-03-16 12:09:08 -06005188 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5190
5191 // Create simple renderpass
5192 VkAttachmentReference attach = {};
5193 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5194 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005195 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005196 subpass.pColorAttachments = &attach;
5197 VkRenderPassCreateInfo rpci = {};
5198 rpci.subpassCount = 1;
5199 rpci.pSubpasses = &subpass;
5200 rpci.attachmentCount = 1;
5201 VkAttachmentDescription attach_desc = {};
5202 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5203 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5204 rpci.pAttachments = &attach_desc;
5205 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5206 VkRenderPass rp;
5207 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5208 ASSERT_VK_SUCCESS(err);
5209
5210 // Create a pipeline that uses the given renderpass
5211 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5212 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5213
5214 VkPipelineLayout pipeline_layout;
5215 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5216 ASSERT_VK_SUCCESS(err);
5217
5218 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5219 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5220 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005221 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005222 vp_state_ci.pViewports = &vp;
5223 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005224 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005225 vp_state_ci.pScissors = &scissors;
5226
5227 VkPipelineShaderStageCreateInfo shaderStages[2];
5228 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5229
5230 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005231 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 -06005232 // but add it to be able to run on more devices
5233 shaderStages[0] = vs.GetStageCreateInfo();
5234 shaderStages[1] = fs.GetStageCreateInfo();
5235
5236 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5237 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5238
5239 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5240 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5241 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5242
5243 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5244 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5245 rs_ci.rasterizerDiscardEnable = true;
5246 rs_ci.lineWidth = 1.0f;
5247
5248 VkPipelineColorBlendAttachmentState att = {};
5249 att.blendEnable = VK_FALSE;
5250 att.colorWriteMask = 0xf;
5251
5252 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5253 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5254 cb_ci.attachmentCount = 1;
5255 cb_ci.pAttachments = &att;
5256
5257 VkGraphicsPipelineCreateInfo gp_ci = {};
5258 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5259 gp_ci.stageCount = 2;
5260 gp_ci.pStages = shaderStages;
5261 gp_ci.pVertexInputState = &vi_ci;
5262 gp_ci.pInputAssemblyState = &ia_ci;
5263 gp_ci.pViewportState = &vp_state_ci;
5264 gp_ci.pRasterizationState = &rs_ci;
5265 gp_ci.pColorBlendState = &cb_ci;
5266 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5267 gp_ci.layout = pipeline_layout;
5268 gp_ci.renderPass = rp;
5269
5270 VkPipelineCacheCreateInfo pc_ci = {};
5271 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5272
Dave Houlton756e6742017-03-23 14:33:22 -06005273 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005274 VkPipeline pipeline;
5275 VkPipelineCache pipe_cache;
5276 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5277 ASSERT_VK_SUCCESS(err);
5278
5279 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5280 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005281
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005282 // Bind pipeline to cmd buffer, will also bind renderpass
5283 m_commandBuffer->BeginCommandBuffer();
5284 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5285 m_commandBuffer->EndCommandBuffer();
5286
5287 VkSubmitInfo submit_info = {};
5288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5289 submit_info.commandBufferCount = 1;
5290 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5291 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005292 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005293
5294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5295 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5296 m_errorMonitor->VerifyFound();
5297
5298 // Wait for queue to complete so we can safely destroy everything
5299 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005300 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5301 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005302 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5303 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5304 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5305 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5306}
5307
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005308TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005309 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005310 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005311
5312 VkImage image;
5313 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5314 VkImageCreateInfo image_create_info = {};
5315 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5316 image_create_info.pNext = NULL;
5317 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5318 image_create_info.format = tex_format;
5319 image_create_info.extent.width = 32;
5320 image_create_info.extent.height = 32;
5321 image_create_info.extent.depth = 1;
5322 image_create_info.mipLevels = 1;
5323 image_create_info.arrayLayers = 1;
5324 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5325 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005326 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005327 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005328 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005329 ASSERT_VK_SUCCESS(err);
5330 // Have to bind memory to image before recording cmd in cmd buffer using it
5331 VkMemoryRequirements mem_reqs;
5332 VkDeviceMemory image_mem;
5333 bool pass;
5334 VkMemoryAllocateInfo mem_alloc = {};
5335 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5336 mem_alloc.pNext = NULL;
5337 mem_alloc.memoryTypeIndex = 0;
5338 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5339 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005340 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005341 ASSERT_TRUE(pass);
5342 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5343 ASSERT_VK_SUCCESS(err);
5344
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005345 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5346 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005347 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005348
5349 m_commandBuffer->BeginCommandBuffer();
5350 VkClearColorValue ccv;
5351 ccv.float32[0] = 1.0f;
5352 ccv.float32[1] = 1.0f;
5353 ccv.float32[2] = 1.0f;
5354 ccv.float32[3] = 1.0f;
5355 VkImageSubresourceRange isr = {};
5356 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5357 isr.baseArrayLayer = 0;
5358 isr.baseMipLevel = 0;
5359 isr.layerCount = 1;
5360 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005361 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005362 m_commandBuffer->EndCommandBuffer();
5363
5364 m_errorMonitor->VerifyFound();
5365 vkDestroyImage(m_device->device(), image, NULL);
5366 vkFreeMemory(m_device->device(), image_mem, nullptr);
5367}
5368
5369TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005370 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005371 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005372
5373 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005374 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005375 VK_IMAGE_TILING_OPTIMAL, 0);
5376 ASSERT_TRUE(image.initialized());
5377
5378 VkBuffer buffer;
5379 VkDeviceMemory mem;
5380 VkMemoryRequirements mem_reqs;
5381
5382 VkBufferCreateInfo buf_info = {};
5383 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005384 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005385 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005386 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5387 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5388 ASSERT_VK_SUCCESS(err);
5389
5390 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5391
5392 VkMemoryAllocateInfo alloc_info = {};
5393 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005394 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005395 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005396 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 -06005397 if (!pass) {
5398 vkDestroyBuffer(m_device->device(), buffer, NULL);
5399 return;
5400 }
5401 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5402 ASSERT_VK_SUCCESS(err);
5403
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005404 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005406 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005407 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005408 region.bufferRowLength = 16;
5409 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005410 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5411
5412 region.imageSubresource.layerCount = 1;
5413 region.imageExtent.height = 4;
5414 region.imageExtent.width = 4;
5415 region.imageExtent.depth = 1;
5416 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005417 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5418 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005419 m_commandBuffer->EndCommandBuffer();
5420
5421 m_errorMonitor->VerifyFound();
5422
5423 vkDestroyBuffer(m_device->device(), buffer, NULL);
5424 vkFreeMemory(m_device->handle(), mem, NULL);
5425}
5426
Tobin Ehlis85940f52016-07-07 16:57:21 -06005427TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005428 TEST_DESCRIPTION(
5429 "Attempt to draw with a command buffer that is invalid "
5430 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005431 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005432
5433 VkEvent event;
5434 VkEventCreateInfo evci = {};
5435 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5436 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5437 ASSERT_VK_SUCCESS(result);
5438
5439 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005440 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005441 m_commandBuffer->EndCommandBuffer();
5442
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005444 // Destroy event dependency prior to submit to cause ERROR
5445 vkDestroyEvent(m_device->device(), event, NULL);
5446
5447 VkSubmitInfo submit_info = {};
5448 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5449 submit_info.commandBufferCount = 1;
5450 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5451 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5452
5453 m_errorMonitor->VerifyFound();
5454}
5455
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005456TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005457 TEST_DESCRIPTION(
5458 "Attempt to draw with a command buffer that is invalid "
5459 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005460 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005461
5462 VkQueryPool query_pool;
5463 VkQueryPoolCreateInfo qpci{};
5464 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5465 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5466 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005467 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005468 ASSERT_VK_SUCCESS(result);
5469
5470 m_commandBuffer->BeginCommandBuffer();
5471 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5472 m_commandBuffer->EndCommandBuffer();
5473
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005475 // Destroy query pool dependency prior to submit to cause ERROR
5476 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5477
5478 VkSubmitInfo submit_info = {};
5479 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5480 submit_info.commandBufferCount = 1;
5481 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5482 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5483
5484 m_errorMonitor->VerifyFound();
5485}
5486
Tobin Ehlis24130d92016-07-08 15:50:53 -06005487TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005488 TEST_DESCRIPTION(
5489 "Attempt to draw with a command buffer that is invalid "
5490 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005491 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5493
5494 VkResult err;
5495
5496 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5497 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5498
5499 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005500 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005501 ASSERT_VK_SUCCESS(err);
5502
5503 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5504 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5505 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005506 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005507 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005508 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005509 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005511
5512 VkPipelineShaderStageCreateInfo shaderStages[2];
5513 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5514
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005515 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005516 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 -06005517 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005518 shaderStages[0] = vs.GetStageCreateInfo();
5519 shaderStages[1] = fs.GetStageCreateInfo();
5520
5521 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5522 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5523
5524 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5525 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5526 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5527
5528 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5529 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005530 rs_ci.rasterizerDiscardEnable = true;
5531 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005532
5533 VkPipelineColorBlendAttachmentState att = {};
5534 att.blendEnable = VK_FALSE;
5535 att.colorWriteMask = 0xf;
5536
5537 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5538 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5539 cb_ci.attachmentCount = 1;
5540 cb_ci.pAttachments = &att;
5541
5542 VkGraphicsPipelineCreateInfo gp_ci = {};
5543 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5544 gp_ci.stageCount = 2;
5545 gp_ci.pStages = shaderStages;
5546 gp_ci.pVertexInputState = &vi_ci;
5547 gp_ci.pInputAssemblyState = &ia_ci;
5548 gp_ci.pViewportState = &vp_state_ci;
5549 gp_ci.pRasterizationState = &rs_ci;
5550 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005551 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5552 gp_ci.layout = pipeline_layout;
5553 gp_ci.renderPass = renderPass();
5554
5555 VkPipelineCacheCreateInfo pc_ci = {};
5556 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5557
5558 VkPipeline pipeline;
5559 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005560 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005561 ASSERT_VK_SUCCESS(err);
5562
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005563 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005564 ASSERT_VK_SUCCESS(err);
5565
5566 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005567 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005568 m_commandBuffer->EndCommandBuffer();
5569 // Now destroy pipeline in order to cause error when submitting
5570 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5571
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005573
5574 VkSubmitInfo submit_info = {};
5575 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5576 submit_info.commandBufferCount = 1;
5577 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5578 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5579
5580 m_errorMonitor->VerifyFound();
5581 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5582 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5583}
5584
Tobin Ehlis31289162016-08-17 14:57:58 -06005585TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005586 TEST_DESCRIPTION(
5587 "Attempt to draw with a command buffer that is invalid "
5588 "due to a bound descriptor set with a buffer dependency "
5589 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005590 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005591 ASSERT_NO_FATAL_FAILURE(InitViewport());
5592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5593
5594 VkDescriptorPoolSize ds_type_count = {};
5595 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5596 ds_type_count.descriptorCount = 1;
5597
5598 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5599 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5600 ds_pool_ci.pNext = NULL;
5601 ds_pool_ci.maxSets = 1;
5602 ds_pool_ci.poolSizeCount = 1;
5603 ds_pool_ci.pPoolSizes = &ds_type_count;
5604
5605 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005606 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005607 ASSERT_VK_SUCCESS(err);
5608
5609 VkDescriptorSetLayoutBinding dsl_binding = {};
5610 dsl_binding.binding = 0;
5611 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5612 dsl_binding.descriptorCount = 1;
5613 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5614 dsl_binding.pImmutableSamplers = NULL;
5615
5616 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5617 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5618 ds_layout_ci.pNext = NULL;
5619 ds_layout_ci.bindingCount = 1;
5620 ds_layout_ci.pBindings = &dsl_binding;
5621 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005622 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005623 ASSERT_VK_SUCCESS(err);
5624
5625 VkDescriptorSet descriptorSet;
5626 VkDescriptorSetAllocateInfo alloc_info = {};
5627 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5628 alloc_info.descriptorSetCount = 1;
5629 alloc_info.descriptorPool = ds_pool;
5630 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005631 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005632 ASSERT_VK_SUCCESS(err);
5633
5634 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5635 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5636 pipeline_layout_ci.pNext = NULL;
5637 pipeline_layout_ci.setLayoutCount = 1;
5638 pipeline_layout_ci.pSetLayouts = &ds_layout;
5639
5640 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005641 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005642 ASSERT_VK_SUCCESS(err);
5643
5644 // Create a buffer to update the descriptor with
5645 uint32_t qfi = 0;
5646 VkBufferCreateInfo buffCI = {};
5647 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5648 buffCI.size = 1024;
5649 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5650 buffCI.queueFamilyIndexCount = 1;
5651 buffCI.pQueueFamilyIndices = &qfi;
5652
5653 VkBuffer buffer;
5654 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5655 ASSERT_VK_SUCCESS(err);
5656 // Allocate memory and bind to buffer so we can make it to the appropriate
5657 // error
5658 VkMemoryAllocateInfo mem_alloc = {};
5659 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5660 mem_alloc.pNext = NULL;
5661 mem_alloc.allocationSize = 1024;
5662 mem_alloc.memoryTypeIndex = 0;
5663
5664 VkMemoryRequirements memReqs;
5665 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005666 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005667 if (!pass) {
5668 vkDestroyBuffer(m_device->device(), buffer, NULL);
5669 return;
5670 }
5671
5672 VkDeviceMemory mem;
5673 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5674 ASSERT_VK_SUCCESS(err);
5675 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5676 ASSERT_VK_SUCCESS(err);
5677 // Correctly update descriptor to avoid "NOT_UPDATED" error
5678 VkDescriptorBufferInfo buffInfo = {};
5679 buffInfo.buffer = buffer;
5680 buffInfo.offset = 0;
5681 buffInfo.range = 1024;
5682
5683 VkWriteDescriptorSet descriptor_write;
5684 memset(&descriptor_write, 0, sizeof(descriptor_write));
5685 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5686 descriptor_write.dstSet = descriptorSet;
5687 descriptor_write.dstBinding = 0;
5688 descriptor_write.descriptorCount = 1;
5689 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5690 descriptor_write.pBufferInfo = &buffInfo;
5691
5692 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5693
5694 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005695 char const *vsSource =
5696 "#version 450\n"
5697 "\n"
5698 "out gl_PerVertex { \n"
5699 " vec4 gl_Position;\n"
5700 "};\n"
5701 "void main(){\n"
5702 " gl_Position = vec4(1);\n"
5703 "}\n";
5704 char const *fsSource =
5705 "#version 450\n"
5706 "\n"
5707 "layout(location=0) out vec4 x;\n"
5708 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5709 "void main(){\n"
5710 " x = vec4(bar.y);\n"
5711 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005712 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5713 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5714 VkPipelineObj pipe(m_device);
5715 pipe.AddShader(&vs);
5716 pipe.AddShader(&fs);
5717 pipe.AddColorAttachment();
5718 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5719
Tony Barbour552f6c02016-12-21 14:34:07 -07005720 m_commandBuffer->BeginCommandBuffer();
5721 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005722 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5723 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5724 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005725
5726 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5727 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5728
Tobin Ehlis31289162016-08-17 14:57:58 -06005729 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005730 m_commandBuffer->EndRenderPass();
5731 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005733 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5734 vkDestroyBuffer(m_device->device(), buffer, NULL);
5735 // Attempt to submit cmd buffer
5736 VkSubmitInfo submit_info = {};
5737 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5738 submit_info.commandBufferCount = 1;
5739 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5740 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5741 m_errorMonitor->VerifyFound();
5742 // Cleanup
5743 vkFreeMemory(m_device->device(), mem, NULL);
5744
5745 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5746 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5747 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5748}
5749
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005750TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005751 TEST_DESCRIPTION(
5752 "Attempt to draw with a command buffer that is invalid "
5753 "due to a bound descriptor sets with a combined image "
5754 "sampler having their image, sampler, and descriptor set "
5755 "each respectively destroyed and then attempting to "
5756 "submit associated cmd buffers. Attempt to destroy a "
5757 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005758 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005759 ASSERT_NO_FATAL_FAILURE(InitViewport());
5760 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5761
5762 VkDescriptorPoolSize ds_type_count = {};
5763 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5764 ds_type_count.descriptorCount = 1;
5765
5766 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5767 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5768 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005769 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005770 ds_pool_ci.maxSets = 1;
5771 ds_pool_ci.poolSizeCount = 1;
5772 ds_pool_ci.pPoolSizes = &ds_type_count;
5773
5774 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005775 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005776 ASSERT_VK_SUCCESS(err);
5777
5778 VkDescriptorSetLayoutBinding dsl_binding = {};
5779 dsl_binding.binding = 0;
5780 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5781 dsl_binding.descriptorCount = 1;
5782 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5783 dsl_binding.pImmutableSamplers = NULL;
5784
5785 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5786 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5787 ds_layout_ci.pNext = NULL;
5788 ds_layout_ci.bindingCount = 1;
5789 ds_layout_ci.pBindings = &dsl_binding;
5790 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005791 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005792 ASSERT_VK_SUCCESS(err);
5793
5794 VkDescriptorSet descriptorSet;
5795 VkDescriptorSetAllocateInfo alloc_info = {};
5796 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5797 alloc_info.descriptorSetCount = 1;
5798 alloc_info.descriptorPool = ds_pool;
5799 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005800 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005801 ASSERT_VK_SUCCESS(err);
5802
5803 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5804 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5805 pipeline_layout_ci.pNext = NULL;
5806 pipeline_layout_ci.setLayoutCount = 1;
5807 pipeline_layout_ci.pSetLayouts = &ds_layout;
5808
5809 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005810 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005811 ASSERT_VK_SUCCESS(err);
5812
5813 // Create images to update the descriptor with
5814 VkImage image;
5815 VkImage image2;
5816 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5817 const int32_t tex_width = 32;
5818 const int32_t tex_height = 32;
5819 VkImageCreateInfo image_create_info = {};
5820 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5821 image_create_info.pNext = NULL;
5822 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5823 image_create_info.format = tex_format;
5824 image_create_info.extent.width = tex_width;
5825 image_create_info.extent.height = tex_height;
5826 image_create_info.extent.depth = 1;
5827 image_create_info.mipLevels = 1;
5828 image_create_info.arrayLayers = 1;
5829 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5830 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5831 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5832 image_create_info.flags = 0;
5833 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5834 ASSERT_VK_SUCCESS(err);
5835 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5836 ASSERT_VK_SUCCESS(err);
5837
5838 VkMemoryRequirements memory_reqs;
5839 VkDeviceMemory image_memory;
5840 bool pass;
5841 VkMemoryAllocateInfo memory_info = {};
5842 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5843 memory_info.pNext = NULL;
5844 memory_info.allocationSize = 0;
5845 memory_info.memoryTypeIndex = 0;
5846 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5847 // Allocate enough memory for both images
5848 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005849 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005850 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005851 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005852 ASSERT_VK_SUCCESS(err);
5853 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5854 ASSERT_VK_SUCCESS(err);
5855 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005856 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005857 ASSERT_VK_SUCCESS(err);
5858
5859 VkImageViewCreateInfo image_view_create_info = {};
5860 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5861 image_view_create_info.image = image;
5862 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5863 image_view_create_info.format = tex_format;
5864 image_view_create_info.subresourceRange.layerCount = 1;
5865 image_view_create_info.subresourceRange.baseMipLevel = 0;
5866 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005867 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005868
5869 VkImageView view;
5870 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005871 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005872 ASSERT_VK_SUCCESS(err);
5873 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005874 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005875 ASSERT_VK_SUCCESS(err);
5876 // Create Samplers
5877 VkSamplerCreateInfo sampler_ci = {};
5878 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5879 sampler_ci.pNext = NULL;
5880 sampler_ci.magFilter = VK_FILTER_NEAREST;
5881 sampler_ci.minFilter = VK_FILTER_NEAREST;
5882 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5883 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5886 sampler_ci.mipLodBias = 1.0;
5887 sampler_ci.anisotropyEnable = VK_FALSE;
5888 sampler_ci.maxAnisotropy = 1;
5889 sampler_ci.compareEnable = VK_FALSE;
5890 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5891 sampler_ci.minLod = 1.0;
5892 sampler_ci.maxLod = 1.0;
5893 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5894 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5895 VkSampler sampler;
5896 VkSampler sampler2;
5897 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5898 ASSERT_VK_SUCCESS(err);
5899 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5900 ASSERT_VK_SUCCESS(err);
5901 // Update descriptor with image and sampler
5902 VkDescriptorImageInfo img_info = {};
5903 img_info.sampler = sampler;
5904 img_info.imageView = view;
5905 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5906
5907 VkWriteDescriptorSet descriptor_write;
5908 memset(&descriptor_write, 0, sizeof(descriptor_write));
5909 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5910 descriptor_write.dstSet = descriptorSet;
5911 descriptor_write.dstBinding = 0;
5912 descriptor_write.descriptorCount = 1;
5913 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5914 descriptor_write.pImageInfo = &img_info;
5915
5916 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5917
5918 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005919 char const *vsSource =
5920 "#version 450\n"
5921 "\n"
5922 "out gl_PerVertex { \n"
5923 " vec4 gl_Position;\n"
5924 "};\n"
5925 "void main(){\n"
5926 " gl_Position = vec4(1);\n"
5927 "}\n";
5928 char const *fsSource =
5929 "#version 450\n"
5930 "\n"
5931 "layout(set=0, binding=0) uniform sampler2D s;\n"
5932 "layout(location=0) out vec4 x;\n"
5933 "void main(){\n"
5934 " x = texture(s, vec2(1));\n"
5935 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005936 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5937 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5938 VkPipelineObj pipe(m_device);
5939 pipe.AddShader(&vs);
5940 pipe.AddShader(&fs);
5941 pipe.AddColorAttachment();
5942 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5943
5944 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005946 m_commandBuffer->BeginCommandBuffer();
5947 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005948 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5949 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5950 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005951 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5952 VkRect2D scissor = {{0, 0}, {16, 16}};
5953 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5954 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005955 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005956 m_commandBuffer->EndRenderPass();
5957 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005958 // Destroy sampler invalidates the cmd buffer, causing error on submit
5959 vkDestroySampler(m_device->device(), sampler, NULL);
5960 // Attempt to submit cmd buffer
5961 VkSubmitInfo submit_info = {};
5962 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5963 submit_info.commandBufferCount = 1;
5964 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5965 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5966 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005967
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005968 // Now re-update descriptor with valid sampler and delete image
5969 img_info.sampler = sampler2;
5970 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005971
5972 VkCommandBufferBeginInfo info = {};
5973 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5974 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5975
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005977 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005978 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005979 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5980 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5981 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005982 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 image invalidates the cmd buffer, causing error on submit
5988 vkDestroyImage(m_device->device(), image, NULL);
5989 // Attempt to submit cmd buffer
5990 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();
5996 // Now update descriptor to be valid, but then free descriptor
5997 img_info.imageView = view2;
5998 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005999 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07006000 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006001 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6002 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6003 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006004 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6005 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006006 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006007 m_commandBuffer->EndRenderPass();
6008 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006009 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006010
6011 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006013 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006014 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006015
6016 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006017 // 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 -07006018 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006019 m_errorMonitor->SetUnexpectedError(
6020 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6021 "either be a valid handle or VK_NULL_HANDLE");
6022 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006023 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6024
6025 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006026 submit_info = {};
6027 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6028 submit_info.commandBufferCount = 1;
6029 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006031 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6032 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006033
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006034 // Cleanup
6035 vkFreeMemory(m_device->device(), image_memory, NULL);
6036 vkDestroySampler(m_device->device(), sampler2, NULL);
6037 vkDestroyImage(m_device->device(), image2, NULL);
6038 vkDestroyImageView(m_device->device(), view, NULL);
6039 vkDestroyImageView(m_device->device(), view2, NULL);
6040 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6041 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6042 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6043}
6044
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006045TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6046 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006047 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006048 ASSERT_NO_FATAL_FAILURE(InitViewport());
6049 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6050
6051 VkDescriptorPoolSize ds_type_count = {};
6052 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6053 ds_type_count.descriptorCount = 1;
6054
6055 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6056 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6057 ds_pool_ci.pNext = NULL;
6058 ds_pool_ci.maxSets = 1;
6059 ds_pool_ci.poolSizeCount = 1;
6060 ds_pool_ci.pPoolSizes = &ds_type_count;
6061
6062 VkDescriptorPool ds_pool;
6063 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6064 ASSERT_VK_SUCCESS(err);
6065
6066 VkDescriptorSetLayoutBinding dsl_binding = {};
6067 dsl_binding.binding = 0;
6068 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6069 dsl_binding.descriptorCount = 1;
6070 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6071 dsl_binding.pImmutableSamplers = NULL;
6072
6073 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6074 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6075 ds_layout_ci.pNext = NULL;
6076 ds_layout_ci.bindingCount = 1;
6077 ds_layout_ci.pBindings = &dsl_binding;
6078 VkDescriptorSetLayout ds_layout;
6079 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6080 ASSERT_VK_SUCCESS(err);
6081
6082 VkDescriptorSet descriptor_set;
6083 VkDescriptorSetAllocateInfo alloc_info = {};
6084 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6085 alloc_info.descriptorSetCount = 1;
6086 alloc_info.descriptorPool = ds_pool;
6087 alloc_info.pSetLayouts = &ds_layout;
6088 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6089 ASSERT_VK_SUCCESS(err);
6090
6091 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6092 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6093 pipeline_layout_ci.pNext = NULL;
6094 pipeline_layout_ci.setLayoutCount = 1;
6095 pipeline_layout_ci.pSetLayouts = &ds_layout;
6096
6097 VkPipelineLayout pipeline_layout;
6098 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6099 ASSERT_VK_SUCCESS(err);
6100
6101 // Create image to update the descriptor with
6102 VkImageObj image(m_device);
6103 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6104 ASSERT_TRUE(image.initialized());
6105
6106 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6107 // Create Sampler
6108 VkSamplerCreateInfo sampler_ci = {};
6109 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6110 sampler_ci.pNext = NULL;
6111 sampler_ci.magFilter = VK_FILTER_NEAREST;
6112 sampler_ci.minFilter = VK_FILTER_NEAREST;
6113 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6114 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6115 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6116 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6117 sampler_ci.mipLodBias = 1.0;
6118 sampler_ci.anisotropyEnable = VK_FALSE;
6119 sampler_ci.maxAnisotropy = 1;
6120 sampler_ci.compareEnable = VK_FALSE;
6121 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6122 sampler_ci.minLod = 1.0;
6123 sampler_ci.maxLod = 1.0;
6124 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6125 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6126 VkSampler sampler;
6127 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6128 ASSERT_VK_SUCCESS(err);
6129 // Update descriptor with image and sampler
6130 VkDescriptorImageInfo img_info = {};
6131 img_info.sampler = sampler;
6132 img_info.imageView = view;
6133 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6134
6135 VkWriteDescriptorSet descriptor_write;
6136 memset(&descriptor_write, 0, sizeof(descriptor_write));
6137 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6138 descriptor_write.dstSet = descriptor_set;
6139 descriptor_write.dstBinding = 0;
6140 descriptor_write.descriptorCount = 1;
6141 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6142 descriptor_write.pImageInfo = &img_info;
6143
6144 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6145
6146 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006147 char const *vsSource =
6148 "#version 450\n"
6149 "\n"
6150 "out gl_PerVertex { \n"
6151 " vec4 gl_Position;\n"
6152 "};\n"
6153 "void main(){\n"
6154 " gl_Position = vec4(1);\n"
6155 "}\n";
6156 char const *fsSource =
6157 "#version 450\n"
6158 "\n"
6159 "layout(set=0, binding=0) uniform sampler2D s;\n"
6160 "layout(location=0) out vec4 x;\n"
6161 "void main(){\n"
6162 " x = texture(s, vec2(1));\n"
6163 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006164 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6165 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6166 VkPipelineObj pipe(m_device);
6167 pipe.AddShader(&vs);
6168 pipe.AddShader(&fs);
6169 pipe.AddColorAttachment();
6170 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6171
Tony Barbour552f6c02016-12-21 14:34:07 -07006172 m_commandBuffer->BeginCommandBuffer();
6173 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006174 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6175 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6176 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006177
6178 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6179 VkRect2D scissor = {{0, 0}, {16, 16}};
6180 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6181 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6182
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006183 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006184 m_commandBuffer->EndRenderPass();
6185 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006186 // Submit cmd buffer to put pool in-flight
6187 VkSubmitInfo submit_info = {};
6188 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6189 submit_info.commandBufferCount = 1;
6190 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6191 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6192 // Destroy pool while in-flight, causing error
6193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6194 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6195 m_errorMonitor->VerifyFound();
6196 vkQueueWaitIdle(m_device->m_queue);
6197 // Cleanup
6198 vkDestroySampler(m_device->device(), sampler, NULL);
6199 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6200 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006201 m_errorMonitor->SetUnexpectedError(
6202 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6203 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006204 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006205 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006206}
6207
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006208TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6209 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006210 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006211 ASSERT_NO_FATAL_FAILURE(InitViewport());
6212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6213
6214 VkDescriptorPoolSize ds_type_count = {};
6215 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6216 ds_type_count.descriptorCount = 1;
6217
6218 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6219 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6220 ds_pool_ci.pNext = NULL;
6221 ds_pool_ci.maxSets = 1;
6222 ds_pool_ci.poolSizeCount = 1;
6223 ds_pool_ci.pPoolSizes = &ds_type_count;
6224
6225 VkDescriptorPool ds_pool;
6226 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6227 ASSERT_VK_SUCCESS(err);
6228
6229 VkDescriptorSetLayoutBinding dsl_binding = {};
6230 dsl_binding.binding = 0;
6231 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6232 dsl_binding.descriptorCount = 1;
6233 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6234 dsl_binding.pImmutableSamplers = NULL;
6235
6236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6238 ds_layout_ci.pNext = NULL;
6239 ds_layout_ci.bindingCount = 1;
6240 ds_layout_ci.pBindings = &dsl_binding;
6241 VkDescriptorSetLayout ds_layout;
6242 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6243 ASSERT_VK_SUCCESS(err);
6244
6245 VkDescriptorSet descriptorSet;
6246 VkDescriptorSetAllocateInfo alloc_info = {};
6247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6248 alloc_info.descriptorSetCount = 1;
6249 alloc_info.descriptorPool = ds_pool;
6250 alloc_info.pSetLayouts = &ds_layout;
6251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6252 ASSERT_VK_SUCCESS(err);
6253
6254 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6255 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6256 pipeline_layout_ci.pNext = NULL;
6257 pipeline_layout_ci.setLayoutCount = 1;
6258 pipeline_layout_ci.pSetLayouts = &ds_layout;
6259
6260 VkPipelineLayout pipeline_layout;
6261 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6262 ASSERT_VK_SUCCESS(err);
6263
6264 // Create images to update the descriptor with
6265 VkImage image;
6266 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6267 const int32_t tex_width = 32;
6268 const int32_t tex_height = 32;
6269 VkImageCreateInfo image_create_info = {};
6270 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6271 image_create_info.pNext = NULL;
6272 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6273 image_create_info.format = tex_format;
6274 image_create_info.extent.width = tex_width;
6275 image_create_info.extent.height = tex_height;
6276 image_create_info.extent.depth = 1;
6277 image_create_info.mipLevels = 1;
6278 image_create_info.arrayLayers = 1;
6279 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6280 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6281 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6282 image_create_info.flags = 0;
6283 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6284 ASSERT_VK_SUCCESS(err);
6285 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6286 VkMemoryRequirements memory_reqs;
6287 VkDeviceMemory image_memory;
6288 bool pass;
6289 VkMemoryAllocateInfo memory_info = {};
6290 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6291 memory_info.pNext = NULL;
6292 memory_info.allocationSize = 0;
6293 memory_info.memoryTypeIndex = 0;
6294 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6295 // Allocate enough memory for image
6296 memory_info.allocationSize = memory_reqs.size;
6297 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6298 ASSERT_TRUE(pass);
6299 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6300 ASSERT_VK_SUCCESS(err);
6301 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6302 ASSERT_VK_SUCCESS(err);
6303
6304 VkImageViewCreateInfo image_view_create_info = {};
6305 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6306 image_view_create_info.image = image;
6307 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6308 image_view_create_info.format = tex_format;
6309 image_view_create_info.subresourceRange.layerCount = 1;
6310 image_view_create_info.subresourceRange.baseMipLevel = 0;
6311 image_view_create_info.subresourceRange.levelCount = 1;
6312 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6313
6314 VkImageView view;
6315 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6316 ASSERT_VK_SUCCESS(err);
6317 // Create Samplers
6318 VkSamplerCreateInfo sampler_ci = {};
6319 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6320 sampler_ci.pNext = NULL;
6321 sampler_ci.magFilter = VK_FILTER_NEAREST;
6322 sampler_ci.minFilter = VK_FILTER_NEAREST;
6323 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6324 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6325 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6326 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6327 sampler_ci.mipLodBias = 1.0;
6328 sampler_ci.anisotropyEnable = VK_FALSE;
6329 sampler_ci.maxAnisotropy = 1;
6330 sampler_ci.compareEnable = VK_FALSE;
6331 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6332 sampler_ci.minLod = 1.0;
6333 sampler_ci.maxLod = 1.0;
6334 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6335 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6336 VkSampler sampler;
6337 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6338 ASSERT_VK_SUCCESS(err);
6339 // Update descriptor with image and sampler
6340 VkDescriptorImageInfo img_info = {};
6341 img_info.sampler = sampler;
6342 img_info.imageView = view;
6343 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6344
6345 VkWriteDescriptorSet descriptor_write;
6346 memset(&descriptor_write, 0, sizeof(descriptor_write));
6347 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6348 descriptor_write.dstSet = descriptorSet;
6349 descriptor_write.dstBinding = 0;
6350 descriptor_write.descriptorCount = 1;
6351 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6352 descriptor_write.pImageInfo = &img_info;
6353 // Break memory binding and attempt update
6354 vkFreeMemory(m_device->device(), image_memory, nullptr);
6355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006356 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6358 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6359 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6360 m_errorMonitor->VerifyFound();
6361 // Cleanup
6362 vkDestroyImage(m_device->device(), image, NULL);
6363 vkDestroySampler(m_device->device(), sampler, NULL);
6364 vkDestroyImageView(m_device->device(), view, NULL);
6365 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6366 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6367 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6368}
6369
Karl Schultz6addd812016-02-02 17:17:23 -07006370TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006371 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6372 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006373 // Create a valid cmd buffer
6374 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006375 uint64_t fake_pipeline_handle = 0xbaad6001;
6376 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006377 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6379
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006381 m_commandBuffer->BeginCommandBuffer();
6382 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006383 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006384 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006385
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006386 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006387 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 -06006388 Draw(1, 0, 0, 0);
6389 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006390
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006391 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006392 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 -07006393 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006394 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6395 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006396}
6397
Karl Schultz6addd812016-02-02 17:17:23 -07006398TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006399 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006400 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006401
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006403
Tony Barbour1fa09702017-03-16 12:09:08 -06006404 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006405 ASSERT_NO_FATAL_FAILURE(InitViewport());
6406 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006407 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006408 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6409 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006410
6411 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006412 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6413 ds_pool_ci.pNext = NULL;
6414 ds_pool_ci.maxSets = 1;
6415 ds_pool_ci.poolSizeCount = 1;
6416 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006417
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006418 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006419 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006420 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006421
Tony Barboureb254902015-07-15 12:50:33 -06006422 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006423 dsl_binding.binding = 0;
6424 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6425 dsl_binding.descriptorCount = 1;
6426 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6427 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006428
Tony Barboureb254902015-07-15 12:50:33 -06006429 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006430 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6431 ds_layout_ci.pNext = NULL;
6432 ds_layout_ci.bindingCount = 1;
6433 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006434 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006435 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006436 ASSERT_VK_SUCCESS(err);
6437
6438 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006439 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006440 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006441 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006442 alloc_info.descriptorPool = ds_pool;
6443 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006444 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006445 ASSERT_VK_SUCCESS(err);
6446
Tony Barboureb254902015-07-15 12:50:33 -06006447 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006448 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6449 pipeline_layout_ci.pNext = NULL;
6450 pipeline_layout_ci.setLayoutCount = 1;
6451 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006452
6453 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006454 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006455 ASSERT_VK_SUCCESS(err);
6456
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006457 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006458 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006459 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006460 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006461
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006462 VkPipelineObj pipe(m_device);
6463 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006464 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006465 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006466 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006467
Tony Barbour552f6c02016-12-21 14:34:07 -07006468 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006469 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6470 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6471 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006472
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006473 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006474
Chia-I Wuf7458c52015-10-26 21:10:41 +08006475 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6476 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6477 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006478}
6479
Karl Schultz6addd812016-02-02 17:17:23 -07006480TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006481 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006482 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006483
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006484 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006485
Tony Barbour1fa09702017-03-16 12:09:08 -06006486 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006487 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006488 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6489 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006490
6491 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006492 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6493 ds_pool_ci.pNext = NULL;
6494 ds_pool_ci.maxSets = 1;
6495 ds_pool_ci.poolSizeCount = 1;
6496 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006497
6498 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006499 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006500 ASSERT_VK_SUCCESS(err);
6501
6502 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006503 dsl_binding.binding = 0;
6504 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6505 dsl_binding.descriptorCount = 1;
6506 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6507 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006508
6509 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006510 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6511 ds_layout_ci.pNext = NULL;
6512 ds_layout_ci.bindingCount = 1;
6513 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006514 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006515 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006516 ASSERT_VK_SUCCESS(err);
6517
6518 VkDescriptorSet descriptorSet;
6519 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006520 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006521 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006522 alloc_info.descriptorPool = ds_pool;
6523 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006524 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006525 ASSERT_VK_SUCCESS(err);
6526
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006527 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006528 VkWriteDescriptorSet descriptor_write;
6529 memset(&descriptor_write, 0, sizeof(descriptor_write));
6530 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6531 descriptor_write.dstSet = descriptorSet;
6532 descriptor_write.dstBinding = 0;
6533 descriptor_write.descriptorCount = 1;
6534 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6535 descriptor_write.pTexelBufferView = &view;
6536
6537 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6538
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006539 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006540
6541 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6542 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6543}
6544
Mark Youngd339ba32016-05-30 13:28:35 -06006545TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006546 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 -06006547
6548 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006550 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006551
Tony Barbour1fa09702017-03-16 12:09:08 -06006552 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006553
6554 // Create a buffer with no bound memory and then attempt to create
6555 // a buffer view.
6556 VkBufferCreateInfo buff_ci = {};
6557 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006558 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006559 buff_ci.size = 256;
6560 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6561 VkBuffer buffer;
6562 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6563 ASSERT_VK_SUCCESS(err);
6564
6565 VkBufferViewCreateInfo buff_view_ci = {};
6566 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6567 buff_view_ci.buffer = buffer;
6568 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6569 buff_view_ci.range = VK_WHOLE_SIZE;
6570 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006571 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006572
6573 m_errorMonitor->VerifyFound();
6574 vkDestroyBuffer(m_device->device(), buffer, NULL);
6575 // If last error is success, it still created the view, so delete it.
6576 if (err == VK_SUCCESS) {
6577 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6578 }
6579}
6580
Karl Schultz6addd812016-02-02 17:17:23 -07006581TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6582 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6583 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006584 // 1. No dynamicOffset supplied
6585 // 2. Too many dynamicOffsets supplied
6586 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006587 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6589 " requires 1 dynamicOffsets, but only "
6590 "0 dynamicOffsets are left in "
6591 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006592
Tony Barbour1fa09702017-03-16 12:09:08 -06006593 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006594 ASSERT_NO_FATAL_FAILURE(InitViewport());
6595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6596
6597 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006598 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6599 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006600
6601 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006602 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6603 ds_pool_ci.pNext = NULL;
6604 ds_pool_ci.maxSets = 1;
6605 ds_pool_ci.poolSizeCount = 1;
6606 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006607
6608 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006609 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006610 ASSERT_VK_SUCCESS(err);
6611
6612 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006613 dsl_binding.binding = 0;
6614 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6615 dsl_binding.descriptorCount = 1;
6616 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6617 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006618
6619 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006620 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6621 ds_layout_ci.pNext = NULL;
6622 ds_layout_ci.bindingCount = 1;
6623 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006624 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006625 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006626 ASSERT_VK_SUCCESS(err);
6627
6628 VkDescriptorSet descriptorSet;
6629 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006630 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006631 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006632 alloc_info.descriptorPool = ds_pool;
6633 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006634 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006635 ASSERT_VK_SUCCESS(err);
6636
6637 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006638 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6639 pipeline_layout_ci.pNext = NULL;
6640 pipeline_layout_ci.setLayoutCount = 1;
6641 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006642
6643 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006644 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006645 ASSERT_VK_SUCCESS(err);
6646
6647 // Create a buffer to update the descriptor with
6648 uint32_t qfi = 0;
6649 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006650 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6651 buffCI.size = 1024;
6652 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6653 buffCI.queueFamilyIndexCount = 1;
6654 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006655
6656 VkBuffer dyub;
6657 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6658 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006659 // Allocate memory and bind to buffer so we can make it to the appropriate
6660 // error
6661 VkMemoryAllocateInfo mem_alloc = {};
6662 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6663 mem_alloc.pNext = NULL;
6664 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006665 mem_alloc.memoryTypeIndex = 0;
6666
6667 VkMemoryRequirements memReqs;
6668 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006669 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006670 if (!pass) {
6671 vkDestroyBuffer(m_device->device(), dyub, NULL);
6672 return;
6673 }
6674
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006675 VkDeviceMemory mem;
6676 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6677 ASSERT_VK_SUCCESS(err);
6678 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6679 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006680 // Correctly update descriptor to avoid "NOT_UPDATED" error
6681 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006682 buffInfo.buffer = dyub;
6683 buffInfo.offset = 0;
6684 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006685
6686 VkWriteDescriptorSet descriptor_write;
6687 memset(&descriptor_write, 0, sizeof(descriptor_write));
6688 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6689 descriptor_write.dstSet = descriptorSet;
6690 descriptor_write.dstBinding = 0;
6691 descriptor_write.descriptorCount = 1;
6692 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6693 descriptor_write.pBufferInfo = &buffInfo;
6694
6695 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6696
Tony Barbour552f6c02016-12-21 14:34:07 -07006697 m_commandBuffer->BeginCommandBuffer();
6698 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006699 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6700 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006701 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006702 uint32_t pDynOff[2] = {512, 756};
6703 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6705 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6706 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6707 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006708 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006709 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6711 " dynamic offset 512 combined with "
6712 "offset 0 and range 1024 that "
6713 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006714 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006715 char const *vsSource =
6716 "#version 450\n"
6717 "\n"
6718 "out gl_PerVertex { \n"
6719 " vec4 gl_Position;\n"
6720 "};\n"
6721 "void main(){\n"
6722 " gl_Position = vec4(1);\n"
6723 "}\n";
6724 char const *fsSource =
6725 "#version 450\n"
6726 "\n"
6727 "layout(location=0) out vec4 x;\n"
6728 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6729 "void main(){\n"
6730 " x = vec4(bar.y);\n"
6731 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006732 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6733 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6734 VkPipelineObj pipe(m_device);
6735 pipe.AddShader(&vs);
6736 pipe.AddShader(&fs);
6737 pipe.AddColorAttachment();
6738 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6739
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006740 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6741 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6742 VkRect2D scissor = {{0, 0}, {16, 16}};
6743 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006745 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006746 // This update should succeed, but offset size of 512 will overstep buffer
6747 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006748 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6749 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006750 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006751 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006752
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006753 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006754 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006755
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006756 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006757 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006758 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6759}
6760
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006761TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006762 TEST_DESCRIPTION(
6763 "Attempt to update a descriptor with a non-sparse buffer "
6764 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006765 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006767 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6769 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006770
Tony Barbour1fa09702017-03-16 12:09:08 -06006771 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006772 ASSERT_NO_FATAL_FAILURE(InitViewport());
6773 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6774
6775 VkDescriptorPoolSize ds_type_count = {};
6776 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6777 ds_type_count.descriptorCount = 1;
6778
6779 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6780 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6781 ds_pool_ci.pNext = NULL;
6782 ds_pool_ci.maxSets = 1;
6783 ds_pool_ci.poolSizeCount = 1;
6784 ds_pool_ci.pPoolSizes = &ds_type_count;
6785
6786 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006787 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006788 ASSERT_VK_SUCCESS(err);
6789
6790 VkDescriptorSetLayoutBinding dsl_binding = {};
6791 dsl_binding.binding = 0;
6792 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6793 dsl_binding.descriptorCount = 1;
6794 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6795 dsl_binding.pImmutableSamplers = NULL;
6796
6797 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6798 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6799 ds_layout_ci.pNext = NULL;
6800 ds_layout_ci.bindingCount = 1;
6801 ds_layout_ci.pBindings = &dsl_binding;
6802 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006803 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006804 ASSERT_VK_SUCCESS(err);
6805
6806 VkDescriptorSet descriptorSet;
6807 VkDescriptorSetAllocateInfo alloc_info = {};
6808 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6809 alloc_info.descriptorSetCount = 1;
6810 alloc_info.descriptorPool = ds_pool;
6811 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006812 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006813 ASSERT_VK_SUCCESS(err);
6814
6815 // Create a buffer to update the descriptor with
6816 uint32_t qfi = 0;
6817 VkBufferCreateInfo buffCI = {};
6818 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6819 buffCI.size = 1024;
6820 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6821 buffCI.queueFamilyIndexCount = 1;
6822 buffCI.pQueueFamilyIndices = &qfi;
6823
6824 VkBuffer dyub;
6825 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6826 ASSERT_VK_SUCCESS(err);
6827
6828 // Attempt to update descriptor without binding memory to it
6829 VkDescriptorBufferInfo buffInfo = {};
6830 buffInfo.buffer = dyub;
6831 buffInfo.offset = 0;
6832 buffInfo.range = 1024;
6833
6834 VkWriteDescriptorSet descriptor_write;
6835 memset(&descriptor_write, 0, sizeof(descriptor_write));
6836 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6837 descriptor_write.dstSet = descriptorSet;
6838 descriptor_write.dstBinding = 0;
6839 descriptor_write.descriptorCount = 1;
6840 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6841 descriptor_write.pBufferInfo = &buffInfo;
6842
6843 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6844 m_errorMonitor->VerifyFound();
6845
6846 vkDestroyBuffer(m_device->device(), dyub, NULL);
6847 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6848 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6849}
6850
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006851TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006852 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006853 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006854 ASSERT_NO_FATAL_FAILURE(InitViewport());
6855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6856
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006857 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006858 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006859 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6860 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6861 pipeline_layout_ci.pushConstantRangeCount = 1;
6862 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6863
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006864 //
6865 // Check for invalid push constant ranges in pipeline layouts.
6866 //
6867 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006868 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006869 char const *msg;
6870 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006871
Karl Schultzc81037d2016-05-12 08:11:23 -06006872 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6873 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6874 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6875 "vkCreatePipelineLayout() call has push constants index 0 with "
6876 "size 0."},
6877 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6878 "vkCreatePipelineLayout() call has push constants index 0 with "
6879 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006880 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006881 "vkCreatePipelineLayout() call has push constants index 0 with "
6882 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006883 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006884 "vkCreatePipelineLayout() call has push constants index 0 with "
6885 "size 0."},
6886 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6887 "vkCreatePipelineLayout() call has push constants index 0 with "
6888 "offset 1. Offset must"},
6889 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6890 "vkCreatePipelineLayout() call has push constants index 0 "
6891 "with offset "},
6892 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6893 "vkCreatePipelineLayout() call has push constants "
6894 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006895 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006896 "vkCreatePipelineLayout() call has push constants index 0 "
6897 "with offset "},
6898 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6899 "vkCreatePipelineLayout() call has push "
6900 "constants index 0 with offset "},
6901 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6902 "vkCreatePipelineLayout() call has push "
6903 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006904 }};
6905
6906 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006907 for (const auto &iter : range_tests) {
6908 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6910 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006911 m_errorMonitor->VerifyFound();
6912 if (VK_SUCCESS == err) {
6913 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6914 }
6915 }
6916
6917 // Check for invalid stage flag
6918 pc_range.offset = 0;
6919 pc_range.size = 16;
6920 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006921 m_errorMonitor->SetDesiredFailureMsg(
6922 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6923 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006924 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006925 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006926 if (VK_SUCCESS == err) {
6927 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6928 }
6929
Karl Schultzc59b72d2017-02-24 15:45:05 -07006930 // Check for duplicate stage flags in a list of push constant ranges.
6931 // A shader can only have one push constant block and that block is mapped
6932 // to the push constant range that has that shader's stage flag set.
6933 // The shader's stage flag can only appear once in all the ranges, so the
6934 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006935 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006936 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006937 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006938 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006939 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006940 // Overlapping ranges are OK, but a stage flag can appear only once.
6941 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6942 {
6943 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6944 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6945 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6946 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006947 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006948 {
6949 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6950 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6951 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6952 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6953 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6954 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6955 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6956 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6957 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6958 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6959 }},
6960 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6961 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6962 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6963 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6964 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6965 {
6966 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6967 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6968 }},
6969 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6970 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6971 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6972 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6973 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6974 {
6975 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6976 }},
6977 },
6978 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006979
Karl Schultzc59b72d2017-02-24 15:45:05 -07006980 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006981 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006982 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006984 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006985 m_errorMonitor->VerifyFound();
6986 if (VK_SUCCESS == err) {
6987 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6988 }
6989 }
6990
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006991 //
6992 // CmdPushConstants tests
6993 //
6994
Karl Schultzc59b72d2017-02-24 15:45:05 -07006995 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006996 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07006997 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006998 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006999 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007000 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007001 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007002 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007003
7004 const uint8_t dummy_values[100] = {};
7005
7006 m_commandBuffer->BeginCommandBuffer();
7007 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007008
7009 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007010 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007012 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007013 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007014
Karl Schultzc59b72d2017-02-24 15:45:05 -07007015 m_errorMonitor->ExpectSuccess();
7016 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7017 m_errorMonitor->VerifyNotFound();
7018 m_errorMonitor->ExpectSuccess();
7019 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7020 m_errorMonitor->VerifyNotFound();
7021 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7022 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7023 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7024 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7025 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7026 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7027 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007028 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007029 for (const auto &iter : cmd_range_tests) {
7030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7031 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7032 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007033 m_errorMonitor->VerifyFound();
7034 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007035
Tony Barbour552f6c02016-12-21 14:34:07 -07007036 m_commandBuffer->EndRenderPass();
7037 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007038 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007039}
7040
Karl Schultz6addd812016-02-02 17:17:23 -07007041TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007042 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007043 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007044
Tony Barbour1fa09702017-03-16 12:09:08 -06007045 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007046 ASSERT_NO_FATAL_FAILURE(InitViewport());
7047 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7048
7049 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7050 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007051 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7052 ds_type_count[0].descriptorCount = 10;
7053 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7054 ds_type_count[1].descriptorCount = 2;
7055 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7056 ds_type_count[2].descriptorCount = 2;
7057 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7058 ds_type_count[3].descriptorCount = 5;
7059 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7060 // type
7061 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7062 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7063 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007064
7065 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007066 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7067 ds_pool_ci.pNext = NULL;
7068 ds_pool_ci.maxSets = 5;
7069 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7070 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007071
7072 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007073 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007074 ASSERT_VK_SUCCESS(err);
7075
7076 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7077 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007078 dsl_binding[0].binding = 0;
7079 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7080 dsl_binding[0].descriptorCount = 5;
7081 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7082 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007083
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007084 // Create layout identical to set0 layout but w/ different stageFlags
7085 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007086 dsl_fs_stage_only.binding = 0;
7087 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7088 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007089 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7090 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007091 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007092 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007093 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7094 ds_layout_ci.pNext = NULL;
7095 ds_layout_ci.bindingCount = 1;
7096 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007097 static const uint32_t NUM_LAYOUTS = 4;
7098 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007099 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007100 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7101 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007103 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007104 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007105 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007106 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007107 dsl_binding[0].binding = 0;
7108 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007109 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007110 dsl_binding[1].binding = 1;
7111 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7112 dsl_binding[1].descriptorCount = 2;
7113 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7114 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007115 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007116 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007117 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007118 ASSERT_VK_SUCCESS(err);
7119 dsl_binding[0].binding = 0;
7120 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007121 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007122 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007123 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007124 ASSERT_VK_SUCCESS(err);
7125 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007126 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007127 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007128 ASSERT_VK_SUCCESS(err);
7129
7130 static const uint32_t NUM_SETS = 4;
7131 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7132 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007133 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007134 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007135 alloc_info.descriptorPool = ds_pool;
7136 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007137 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007138 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007139 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007140 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007141 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007142 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007143 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007144
7145 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007146 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7147 pipeline_layout_ci.pNext = NULL;
7148 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7149 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007150
7151 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007152 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007153 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007154 // Create pipelineLayout with only one setLayout
7155 pipeline_layout_ci.setLayoutCount = 1;
7156 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007157 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007158 ASSERT_VK_SUCCESS(err);
7159 // Create pipelineLayout with 2 descriptor setLayout at index 0
7160 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7161 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007162 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007163 ASSERT_VK_SUCCESS(err);
7164 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7165 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7166 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007167 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007168 ASSERT_VK_SUCCESS(err);
7169 // Create pipelineLayout with UB type, but stageFlags for FS only
7170 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7171 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007172 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007173 ASSERT_VK_SUCCESS(err);
7174 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7175 VkDescriptorSetLayout pl_bad_s0[2] = {};
7176 pl_bad_s0[0] = ds_layout_fs_only;
7177 pl_bad_s0[1] = ds_layout[1];
7178 pipeline_layout_ci.setLayoutCount = 2;
7179 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7180 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007181 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007182 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007183
Tobin Ehlis88452832015-12-03 09:40:56 -07007184 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007185 char const *vsSource =
7186 "#version 450\n"
7187 "\n"
7188 "out gl_PerVertex {\n"
7189 " vec4 gl_Position;\n"
7190 "};\n"
7191 "void main(){\n"
7192 " gl_Position = vec4(1);\n"
7193 "}\n";
7194 char const *fsSource =
7195 "#version 450\n"
7196 "\n"
7197 "layout(location=0) out vec4 x;\n"
7198 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7199 "void main(){\n"
7200 " x = vec4(bar.y);\n"
7201 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007202 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7203 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007204 VkPipelineObj pipe(m_device);
7205 pipe.AddShader(&vs);
7206 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007207 pipe.AddColorAttachment();
7208 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007209
Tony Barbour552f6c02016-12-21 14:34:07 -07007210 m_commandBuffer->BeginCommandBuffer();
7211 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007212
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007213 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007214 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7215 // of PSO
7216 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7217 // cmd_pipeline.c
7218 // due to the fact that cmd_alloc_dset_data() has not been called in
7219 // cmd_bind_graphics_pipeline()
7220 // TODO : Want to cause various binding incompatibility issues here to test
7221 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007222 // First cause various verify_layout_compatibility() fails
7223 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007224 // verify_set_layout_compatibility fail cases:
7225 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007227 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7228 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007229 m_errorMonitor->VerifyFound();
7230
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007231 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7233 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7234 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007235 m_errorMonitor->VerifyFound();
7236
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007237 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007238 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7239 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7241 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7242 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007243 m_errorMonitor->VerifyFound();
7244
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007245 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7246 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7248 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7249 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007250 m_errorMonitor->VerifyFound();
7251
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007252 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7253 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7255 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7256 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7257 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007258 m_errorMonitor->VerifyFound();
7259
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007260 // Cause INFO messages due to disturbing previously bound Sets
7261 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007262 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7263 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007264 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7266 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7267 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007268 m_errorMonitor->VerifyFound();
7269
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007270 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7271 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007272 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7274 " newly bound as set #0 so set #1 and "
7275 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007276 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7277 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007278 m_errorMonitor->VerifyFound();
7279
Tobin Ehlis10fad692016-07-07 12:00:36 -06007280 // Now that we're done actively using the pipelineLayout that gfx pipeline
7281 // was created with, we should be able to delete it. Do that now to verify
7282 // that validation obeys pipelineLayout lifetime
7283 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7284
Tobin Ehlis88452832015-12-03 09:40:56 -07007285 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007286 // 1. Error due to not binding required set (we actually use same code as
7287 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007288 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7289 &descriptorSet[0], 0, NULL);
7290 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7291 &descriptorSet[1], 0, NULL);
7292 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 -07007293
7294 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7295 VkRect2D scissor = {{0, 0}, {16, 16}};
7296 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7297 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7298
Tobin Ehlis88452832015-12-03 09:40:56 -07007299 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007300 m_errorMonitor->VerifyFound();
7301
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007302 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007303 // 2. Error due to bound set not being compatible with PSO's
7304 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007305 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7306 &descriptorSet[0], 0, NULL);
7307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007308 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007309 m_errorMonitor->VerifyFound();
7310
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007311 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007312 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7314 }
7315 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007316 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7317 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7318}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007319
Karl Schultz6addd812016-02-02 17:17:23 -07007320TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7322 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007323
Tony Barbour1fa09702017-03-16 12:09:08 -06007324 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007325 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007326 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007327 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007328
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007329 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007330}
7331
Karl Schultz6addd812016-02-02 17:17:23 -07007332TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7333 VkResult err;
7334 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007335
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007337
Tony Barbour1fa09702017-03-16 12:09:08 -06007338 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007339
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007340 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007341 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007342 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007343 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007344 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007345 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007346
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007347 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007348 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007349
7350 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007351 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007352 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7353
7354 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007355 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007356 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007357 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 -07007358 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007359
7360 // The error should be caught by validation of the BeginCommandBuffer call
7361 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7362
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007363 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007364 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007365}
7366
Karl Schultz6addd812016-02-02 17:17:23 -07007367TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007368 // Cause error due to Begin while recording CB
7369 // Then cause 2 errors for attempting to reset CB w/o having
7370 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7371 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007373
Tony Barbour1fa09702017-03-16 12:09:08 -06007374 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007375
7376 // Calls AllocateCommandBuffers
7377 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7378
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007379 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007380 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007381 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7382 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007383 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7384 cmd_buf_info.pNext = NULL;
7385 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007386 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007387
7388 // Begin CB to transition to recording state
7389 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7390 // Can't re-begin. This should trigger error
7391 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007392 m_errorMonitor->VerifyFound();
7393
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007395 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007396 // Reset attempt will trigger error due to incorrect CommandPool state
7397 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007398 m_errorMonitor->VerifyFound();
7399
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007401 // Transition CB to RECORDED state
7402 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7403 // Now attempting to Begin will implicitly reset, which triggers error
7404 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007405 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007406}
7407
Karl Schultz6addd812016-02-02 17:17:23 -07007408TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007409 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007410 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007411
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7413 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007414
Tony Barbour1fa09702017-03-16 12:09:08 -06007415 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007417
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007418 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007419 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7420 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007421
7422 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007423 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7424 ds_pool_ci.pNext = NULL;
7425 ds_pool_ci.maxSets = 1;
7426 ds_pool_ci.poolSizeCount = 1;
7427 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007428
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007429 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007430 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007431 ASSERT_VK_SUCCESS(err);
7432
Tony Barboureb254902015-07-15 12:50:33 -06007433 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007434 dsl_binding.binding = 0;
7435 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7436 dsl_binding.descriptorCount = 1;
7437 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7438 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007439
Tony Barboureb254902015-07-15 12:50:33 -06007440 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007441 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7442 ds_layout_ci.pNext = NULL;
7443 ds_layout_ci.bindingCount = 1;
7444 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007445
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007446 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007447 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007448 ASSERT_VK_SUCCESS(err);
7449
7450 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007451 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007452 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007453 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007454 alloc_info.descriptorPool = ds_pool;
7455 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007456 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007457 ASSERT_VK_SUCCESS(err);
7458
Tony Barboureb254902015-07-15 12:50:33 -06007459 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007460 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7461 pipeline_layout_ci.setLayoutCount = 1;
7462 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007463
7464 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007465 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007466 ASSERT_VK_SUCCESS(err);
7467
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007468 VkViewport vp = {}; // Just need dummy vp to point to
7469 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007470
7471 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007472 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7473 vp_state_ci.scissorCount = 1;
7474 vp_state_ci.pScissors = &sc;
7475 vp_state_ci.viewportCount = 1;
7476 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007477
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007478 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7479 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7480 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7481 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7482 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7483 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007484 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007485 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007486 rs_state_ci.lineWidth = 1.0f;
7487
7488 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7489 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7490 vi_ci.pNext = nullptr;
7491 vi_ci.vertexBindingDescriptionCount = 0;
7492 vi_ci.pVertexBindingDescriptions = nullptr;
7493 vi_ci.vertexAttributeDescriptionCount = 0;
7494 vi_ci.pVertexAttributeDescriptions = nullptr;
7495
7496 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7497 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7498 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7499
7500 VkPipelineShaderStageCreateInfo shaderStages[2];
7501 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7502
7503 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7504 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007505 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007506 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007507
Tony Barboureb254902015-07-15 12:50:33 -06007508 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007509 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7510 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007511 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007512 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7513 gp_ci.layout = pipeline_layout;
7514 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007515 gp_ci.pVertexInputState = &vi_ci;
7516 gp_ci.pInputAssemblyState = &ia_ci;
7517
7518 gp_ci.stageCount = 1;
7519 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007520
7521 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007522 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7523 pc_ci.initialDataSize = 0;
7524 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007525
7526 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007527 VkPipelineCache pipelineCache;
7528
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007529 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007530 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007531 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007532 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007533
Chia-I Wuf7458c52015-10-26 21:10:41 +08007534 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7535 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7536 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7537 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007538}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007539
Tobin Ehlis912df022015-09-17 08:46:18 -06007540/*// TODO : This test should be good, but needs Tess support in compiler to run
7541TEST_F(VkLayerTest, InvalidPatchControlPoints)
7542{
7543 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007544 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007545
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007547 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7548primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007549
Tony Barbour1fa09702017-03-16 12:09:08 -06007550 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007551 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007552
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007553 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007554 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007555 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007556
7557 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7558 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7559 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007560 ds_pool_ci.poolSizeCount = 1;
7561 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007562
7563 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007564 err = vkCreateDescriptorPool(m_device->device(),
7565VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007566 ASSERT_VK_SUCCESS(err);
7567
7568 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007569 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007570 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007571 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007572 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7573 dsl_binding.pImmutableSamplers = NULL;
7574
7575 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007576 ds_layout_ci.sType =
7577VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007578 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007579 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007580 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007581
7582 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007583 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7584&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007585 ASSERT_VK_SUCCESS(err);
7586
7587 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007588 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7589VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007590 ASSERT_VK_SUCCESS(err);
7591
7592 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007593 pipeline_layout_ci.sType =
7594VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007595 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007596 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007597 pipeline_layout_ci.pSetLayouts = &ds_layout;
7598
7599 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007600 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7601&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007602 ASSERT_VK_SUCCESS(err);
7603
7604 VkPipelineShaderStageCreateInfo shaderStages[3];
7605 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7606
Karl Schultz6addd812016-02-02 17:17:23 -07007607 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7608this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007609 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007610 VkShaderObj
7611tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7612this);
7613 VkShaderObj
7614te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7615this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007616
Karl Schultz6addd812016-02-02 17:17:23 -07007617 shaderStages[0].sType =
7618VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007619 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007620 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007621 shaderStages[1].sType =
7622VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007623 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007624 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007625 shaderStages[2].sType =
7626VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007627 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007628 shaderStages[2].shader = te.handle();
7629
7630 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007631 iaCI.sType =
7632VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007633 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007634
7635 VkPipelineTessellationStateCreateInfo tsCI = {};
7636 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7637 tsCI.patchControlPoints = 0; // This will cause an error
7638
7639 VkGraphicsPipelineCreateInfo gp_ci = {};
7640 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7641 gp_ci.pNext = NULL;
7642 gp_ci.stageCount = 3;
7643 gp_ci.pStages = shaderStages;
7644 gp_ci.pVertexInputState = NULL;
7645 gp_ci.pInputAssemblyState = &iaCI;
7646 gp_ci.pTessellationState = &tsCI;
7647 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007648 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007649 gp_ci.pMultisampleState = NULL;
7650 gp_ci.pDepthStencilState = NULL;
7651 gp_ci.pColorBlendState = NULL;
7652 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7653 gp_ci.layout = pipeline_layout;
7654 gp_ci.renderPass = renderPass();
7655
7656 VkPipelineCacheCreateInfo pc_ci = {};
7657 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7658 pc_ci.pNext = NULL;
7659 pc_ci.initialSize = 0;
7660 pc_ci.initialData = 0;
7661 pc_ci.maxSize = 0;
7662
7663 VkPipeline pipeline;
7664 VkPipelineCache pipelineCache;
7665
Karl Schultz6addd812016-02-02 17:17:23 -07007666 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7667&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007668 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007669 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7670&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007671
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007672 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007673
Chia-I Wuf7458c52015-10-26 21:10:41 +08007674 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7675 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7676 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7677 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007678}
7679*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007680
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007681TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007682 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007683
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007684 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007685
Tony Barbour1fa09702017-03-16 12:09:08 -06007686 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007687 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007688
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007689 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007690 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7691 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007692
7693 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007694 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7695 ds_pool_ci.maxSets = 1;
7696 ds_pool_ci.poolSizeCount = 1;
7697 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007698
7699 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007700 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007701 ASSERT_VK_SUCCESS(err);
7702
7703 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007704 dsl_binding.binding = 0;
7705 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7706 dsl_binding.descriptorCount = 1;
7707 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007708
7709 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007710 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7711 ds_layout_ci.bindingCount = 1;
7712 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007713
7714 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007715 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007716 ASSERT_VK_SUCCESS(err);
7717
7718 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007719 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007720 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007721 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007722 alloc_info.descriptorPool = ds_pool;
7723 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007724 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007725 ASSERT_VK_SUCCESS(err);
7726
7727 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007728 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7729 pipeline_layout_ci.setLayoutCount = 1;
7730 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007731
7732 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007733 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007734 ASSERT_VK_SUCCESS(err);
7735
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007736 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007737 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007738 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007739 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007740 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007741 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007742
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007743 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7744 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7745 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7746 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7747 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7748 rs_state_ci.depthClampEnable = VK_FALSE;
7749 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7750 rs_state_ci.depthBiasEnable = VK_FALSE;
7751
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007752 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7753 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7754 vi_ci.pNext = nullptr;
7755 vi_ci.vertexBindingDescriptionCount = 0;
7756 vi_ci.pVertexBindingDescriptions = nullptr;
7757 vi_ci.vertexAttributeDescriptionCount = 0;
7758 vi_ci.pVertexAttributeDescriptions = nullptr;
7759
7760 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7761 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7762 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7763
7764 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7765 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7766 pipe_ms_state_ci.pNext = NULL;
7767 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7768 pipe_ms_state_ci.sampleShadingEnable = 0;
7769 pipe_ms_state_ci.minSampleShading = 1.0;
7770 pipe_ms_state_ci.pSampleMask = NULL;
7771
Cody Northropeb3a6c12015-10-05 14:44:45 -06007772 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007773 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007774
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007775 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007776 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007777 shaderStages[0] = vs.GetStageCreateInfo();
7778 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007779
7780 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007781 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7782 gp_ci.stageCount = 2;
7783 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007784 gp_ci.pVertexInputState = &vi_ci;
7785 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007786 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007787 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007788 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007789 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7790 gp_ci.layout = pipeline_layout;
7791 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007792
7793 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007794 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007795
7796 VkPipeline pipeline;
7797 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007798 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007799 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007800
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007801 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007802 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007803
7804 // Check case where multiViewport is disabled and viewport count is not 1
7805 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7808 vp_state_ci.scissorCount = 0;
7809 vp_state_ci.viewportCount = 0;
7810 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7811 m_errorMonitor->VerifyFound();
7812 } else {
7813 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007814 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007815 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007816 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007817
7818 // Check is that viewportcount and scissorcount match
7819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7820 vp_state_ci.scissorCount = 1;
7821 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7822 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7823 m_errorMonitor->VerifyFound();
7824
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007825 // Check case where multiViewport is enabled and viewport count is greater than max
7826 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7829 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7830 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7831 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7832 m_errorMonitor->VerifyFound();
7833 }
7834 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007835
Chia-I Wuf7458c52015-10-26 21:10:41 +08007836 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7837 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7838 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7839 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007840}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007841
7842// 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
7843// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007844TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007845 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007846
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007847 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7848
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007850
Tony Barbour1fa09702017-03-16 12:09:08 -06007851 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007853
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007854 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007855 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7856 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007857
7858 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007859 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7860 ds_pool_ci.maxSets = 1;
7861 ds_pool_ci.poolSizeCount = 1;
7862 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007863
7864 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007865 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007866 ASSERT_VK_SUCCESS(err);
7867
7868 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007869 dsl_binding.binding = 0;
7870 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7871 dsl_binding.descriptorCount = 1;
7872 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007873
7874 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007875 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7876 ds_layout_ci.bindingCount = 1;
7877 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007878
7879 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007880 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007881 ASSERT_VK_SUCCESS(err);
7882
7883 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007884 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007885 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007886 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007887 alloc_info.descriptorPool = ds_pool;
7888 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007889 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007890 ASSERT_VK_SUCCESS(err);
7891
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007892 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7893 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7894 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7895
7896 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7897 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7898 vi_ci.pNext = nullptr;
7899 vi_ci.vertexBindingDescriptionCount = 0;
7900 vi_ci.pVertexBindingDescriptions = nullptr;
7901 vi_ci.vertexAttributeDescriptionCount = 0;
7902 vi_ci.pVertexAttributeDescriptions = nullptr;
7903
7904 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7905 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7906 pipe_ms_state_ci.pNext = NULL;
7907 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7908 pipe_ms_state_ci.sampleShadingEnable = 0;
7909 pipe_ms_state_ci.minSampleShading = 1.0;
7910 pipe_ms_state_ci.pSampleMask = NULL;
7911
Tobin Ehlise68360f2015-10-01 11:15:13 -06007912 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007913 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7914 pipeline_layout_ci.setLayoutCount = 1;
7915 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007916
7917 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007918 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007919 ASSERT_VK_SUCCESS(err);
7920
7921 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7922 // Set scissor as dynamic to avoid second error
7923 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007924 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7925 dyn_state_ci.dynamicStateCount = 1;
7926 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007927
Cody Northropeb3a6c12015-10-05 14:44:45 -06007928 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007929 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007930
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007931 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007932 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7933 // 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 +08007934 shaderStages[0] = vs.GetStageCreateInfo();
7935 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007936
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007937 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7938 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7939 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7940 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7941 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7942 rs_state_ci.depthClampEnable = VK_FALSE;
7943 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7944 rs_state_ci.depthBiasEnable = VK_FALSE;
7945
Tobin Ehlise68360f2015-10-01 11:15:13 -06007946 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007947 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7948 gp_ci.stageCount = 2;
7949 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007950 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007951 // Not setting VP state w/o dynamic vp state should cause validation error
7952 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007953 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007954 gp_ci.pVertexInputState = &vi_ci;
7955 gp_ci.pInputAssemblyState = &ia_ci;
7956 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007957 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7958 gp_ci.layout = pipeline_layout;
7959 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007960
7961 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007962 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007963
7964 VkPipeline pipeline;
7965 VkPipelineCache pipelineCache;
7966
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007967 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007968 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007969 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007970
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007971 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007972
Chia-I Wuf7458c52015-10-26 21:10:41 +08007973 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7974 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7975 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7976 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007977}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007978
7979// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7980// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007981TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7982 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007983
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007985
Tony Barbour1fa09702017-03-16 12:09:08 -06007986 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007987
7988 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007989 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007990 return;
7991 }
7992
Tobin Ehlise68360f2015-10-01 11:15:13 -06007993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007994
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007995 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007996 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7997 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007998
7999 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008000 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8001 ds_pool_ci.maxSets = 1;
8002 ds_pool_ci.poolSizeCount = 1;
8003 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008004
8005 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008006 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008007 ASSERT_VK_SUCCESS(err);
8008
8009 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008010 dsl_binding.binding = 0;
8011 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8012 dsl_binding.descriptorCount = 1;
8013 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008014
8015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8017 ds_layout_ci.bindingCount = 1;
8018 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008019
8020 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008021 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008022 ASSERT_VK_SUCCESS(err);
8023
8024 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008025 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008026 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008027 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008028 alloc_info.descriptorPool = ds_pool;
8029 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008030 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008031 ASSERT_VK_SUCCESS(err);
8032
8033 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008034 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8035 pipeline_layout_ci.setLayoutCount = 1;
8036 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008037
8038 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008039 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008040 ASSERT_VK_SUCCESS(err);
8041
8042 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008043 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8044 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008045 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008046 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008047 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008048
8049 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8050 // Set scissor as dynamic to avoid that error
8051 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008052 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8053 dyn_state_ci.dynamicStateCount = 1;
8054 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008055
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008056 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8057 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8058 pipe_ms_state_ci.pNext = NULL;
8059 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8060 pipe_ms_state_ci.sampleShadingEnable = 0;
8061 pipe_ms_state_ci.minSampleShading = 1.0;
8062 pipe_ms_state_ci.pSampleMask = NULL;
8063
Cody Northropeb3a6c12015-10-05 14:44:45 -06008064 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008065 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008066
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008067 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008068 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8069 // 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 +08008070 shaderStages[0] = vs.GetStageCreateInfo();
8071 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008072
Cody Northropf6622dc2015-10-06 10:33:21 -06008073 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8074 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8075 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008076 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008077 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008078 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008079 vi_ci.pVertexAttributeDescriptions = nullptr;
8080
8081 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8082 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8083 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8084
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008085 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008086 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008087 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008088 rs_ci.pNext = nullptr;
8089
Mark Youngc89c6312016-03-31 16:03:20 -06008090 VkPipelineColorBlendAttachmentState att = {};
8091 att.blendEnable = VK_FALSE;
8092 att.colorWriteMask = 0xf;
8093
Cody Northropf6622dc2015-10-06 10:33:21 -06008094 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8095 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8096 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008097 cb_ci.attachmentCount = 1;
8098 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008099
Tobin Ehlise68360f2015-10-01 11:15:13 -06008100 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008101 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8102 gp_ci.stageCount = 2;
8103 gp_ci.pStages = shaderStages;
8104 gp_ci.pVertexInputState = &vi_ci;
8105 gp_ci.pInputAssemblyState = &ia_ci;
8106 gp_ci.pViewportState = &vp_state_ci;
8107 gp_ci.pRasterizationState = &rs_ci;
8108 gp_ci.pColorBlendState = &cb_ci;
8109 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008110 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008111 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8112 gp_ci.layout = pipeline_layout;
8113 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008114
8115 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008116 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008117
8118 VkPipeline pipeline;
8119 VkPipelineCache pipelineCache;
8120
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008121 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008122 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008123 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008124
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008125 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008126
Tobin Ehlisd332f282015-10-02 11:00:56 -06008127 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008128 // First need to successfully create the PSO from above by setting
8129 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008130 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 -07008131
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008132 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008133 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008134 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008135 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008136 m_commandBuffer->BeginCommandBuffer();
8137 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008138 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008139 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008140 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008141 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008142 Draw(1, 0, 0, 0);
8143
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008144 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008145
8146 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8147 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8148 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8149 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008150 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008151}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008152
8153// 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 -07008154// viewportCount
8155TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8156 VkResult err;
8157
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008158 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008159
Tony Barbour1fa09702017-03-16 12:09:08 -06008160 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008161
8162 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008163 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008164 return;
8165 }
8166
Karl Schultz6addd812016-02-02 17:17:23 -07008167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8168
8169 VkDescriptorPoolSize ds_type_count = {};
8170 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8171 ds_type_count.descriptorCount = 1;
8172
8173 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8174 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8175 ds_pool_ci.maxSets = 1;
8176 ds_pool_ci.poolSizeCount = 1;
8177 ds_pool_ci.pPoolSizes = &ds_type_count;
8178
8179 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008180 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008181 ASSERT_VK_SUCCESS(err);
8182
8183 VkDescriptorSetLayoutBinding dsl_binding = {};
8184 dsl_binding.binding = 0;
8185 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8186 dsl_binding.descriptorCount = 1;
8187 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8188
8189 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8190 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8191 ds_layout_ci.bindingCount = 1;
8192 ds_layout_ci.pBindings = &dsl_binding;
8193
8194 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008195 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008196 ASSERT_VK_SUCCESS(err);
8197
8198 VkDescriptorSet descriptorSet;
8199 VkDescriptorSetAllocateInfo alloc_info = {};
8200 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8201 alloc_info.descriptorSetCount = 1;
8202 alloc_info.descriptorPool = ds_pool;
8203 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008204 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008205 ASSERT_VK_SUCCESS(err);
8206
8207 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8208 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8209 pipeline_layout_ci.setLayoutCount = 1;
8210 pipeline_layout_ci.pSetLayouts = &ds_layout;
8211
8212 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008213 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008214 ASSERT_VK_SUCCESS(err);
8215
8216 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8217 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8218 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008219 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008220 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008221 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008222
8223 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8224 // Set scissor as dynamic to avoid that error
8225 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8226 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8227 dyn_state_ci.dynamicStateCount = 1;
8228 dyn_state_ci.pDynamicStates = &vp_state;
8229
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008230 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8231 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8232 pipe_ms_state_ci.pNext = NULL;
8233 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8234 pipe_ms_state_ci.sampleShadingEnable = 0;
8235 pipe_ms_state_ci.minSampleShading = 1.0;
8236 pipe_ms_state_ci.pSampleMask = NULL;
8237
Karl Schultz6addd812016-02-02 17:17:23 -07008238 VkPipelineShaderStageCreateInfo shaderStages[2];
8239 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8240
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008241 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008242 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8243 // 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 -07008244 shaderStages[0] = vs.GetStageCreateInfo();
8245 shaderStages[1] = fs.GetStageCreateInfo();
8246
8247 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8248 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8249 vi_ci.pNext = nullptr;
8250 vi_ci.vertexBindingDescriptionCount = 0;
8251 vi_ci.pVertexBindingDescriptions = nullptr;
8252 vi_ci.vertexAttributeDescriptionCount = 0;
8253 vi_ci.pVertexAttributeDescriptions = nullptr;
8254
8255 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8256 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8257 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8258
8259 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8260 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008261 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008262 rs_ci.pNext = nullptr;
8263
Mark Youngc89c6312016-03-31 16:03:20 -06008264 VkPipelineColorBlendAttachmentState att = {};
8265 att.blendEnable = VK_FALSE;
8266 att.colorWriteMask = 0xf;
8267
Karl Schultz6addd812016-02-02 17:17:23 -07008268 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8269 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8270 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008271 cb_ci.attachmentCount = 1;
8272 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008273
8274 VkGraphicsPipelineCreateInfo gp_ci = {};
8275 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8276 gp_ci.stageCount = 2;
8277 gp_ci.pStages = shaderStages;
8278 gp_ci.pVertexInputState = &vi_ci;
8279 gp_ci.pInputAssemblyState = &ia_ci;
8280 gp_ci.pViewportState = &vp_state_ci;
8281 gp_ci.pRasterizationState = &rs_ci;
8282 gp_ci.pColorBlendState = &cb_ci;
8283 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008284 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008285 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8286 gp_ci.layout = pipeline_layout;
8287 gp_ci.renderPass = renderPass();
8288
8289 VkPipelineCacheCreateInfo pc_ci = {};
8290 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8291
8292 VkPipeline pipeline;
8293 VkPipelineCache pipelineCache;
8294
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008295 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008296 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008297 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008298
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008299 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008300
8301 // Now hit second fail case where we set scissor w/ different count than PSO
8302 // First need to successfully create the PSO from above by setting
8303 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008304 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8305 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008306
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008307 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008308 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008309 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008310 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008311 m_commandBuffer->BeginCommandBuffer();
8312 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008313 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008314 VkViewport viewports[1] = {};
8315 viewports[0].width = 8;
8316 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008317 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008318 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008319 Draw(1, 0, 0, 0);
8320
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008321 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008322
Chia-I Wuf7458c52015-10-26 21:10:41 +08008323 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8324 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8325 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8326 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008327 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008328}
8329
Mark Young7394fdd2016-03-31 14:56:43 -06008330TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8331 VkResult err;
8332
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008334
Tony Barbour1fa09702017-03-16 12:09:08 -06008335 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8337
8338 VkDescriptorPoolSize ds_type_count = {};
8339 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8340 ds_type_count.descriptorCount = 1;
8341
8342 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8343 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8344 ds_pool_ci.maxSets = 1;
8345 ds_pool_ci.poolSizeCount = 1;
8346 ds_pool_ci.pPoolSizes = &ds_type_count;
8347
8348 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008349 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008350 ASSERT_VK_SUCCESS(err);
8351
8352 VkDescriptorSetLayoutBinding dsl_binding = {};
8353 dsl_binding.binding = 0;
8354 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8355 dsl_binding.descriptorCount = 1;
8356 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8357
8358 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8359 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8360 ds_layout_ci.bindingCount = 1;
8361 ds_layout_ci.pBindings = &dsl_binding;
8362
8363 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008364 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008365 ASSERT_VK_SUCCESS(err);
8366
8367 VkDescriptorSet descriptorSet;
8368 VkDescriptorSetAllocateInfo alloc_info = {};
8369 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8370 alloc_info.descriptorSetCount = 1;
8371 alloc_info.descriptorPool = ds_pool;
8372 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008373 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008374 ASSERT_VK_SUCCESS(err);
8375
8376 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8377 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8378 pipeline_layout_ci.setLayoutCount = 1;
8379 pipeline_layout_ci.pSetLayouts = &ds_layout;
8380
8381 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008382 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008383 ASSERT_VK_SUCCESS(err);
8384
8385 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8386 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8387 vp_state_ci.scissorCount = 1;
8388 vp_state_ci.pScissors = NULL;
8389 vp_state_ci.viewportCount = 1;
8390 vp_state_ci.pViewports = NULL;
8391
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008392 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008393 // Set scissor as dynamic to avoid that error
8394 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8395 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8396 dyn_state_ci.dynamicStateCount = 2;
8397 dyn_state_ci.pDynamicStates = dynamic_states;
8398
8399 VkPipelineShaderStageCreateInfo shaderStages[2];
8400 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8401
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008402 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8403 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008404 this); // TODO - We shouldn't need a fragment shader
8405 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008406 shaderStages[0] = vs.GetStageCreateInfo();
8407 shaderStages[1] = fs.GetStageCreateInfo();
8408
8409 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8410 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8411 vi_ci.pNext = nullptr;
8412 vi_ci.vertexBindingDescriptionCount = 0;
8413 vi_ci.pVertexBindingDescriptions = nullptr;
8414 vi_ci.vertexAttributeDescriptionCount = 0;
8415 vi_ci.pVertexAttributeDescriptions = nullptr;
8416
8417 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8418 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8419 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8420
8421 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8422 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8423 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008424 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008425
Mark Young47107952016-05-02 15:59:55 -06008426 // Check too low (line width of -1.0f).
8427 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008428
8429 VkPipelineColorBlendAttachmentState att = {};
8430 att.blendEnable = VK_FALSE;
8431 att.colorWriteMask = 0xf;
8432
8433 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8434 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8435 cb_ci.pNext = nullptr;
8436 cb_ci.attachmentCount = 1;
8437 cb_ci.pAttachments = &att;
8438
8439 VkGraphicsPipelineCreateInfo gp_ci = {};
8440 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8441 gp_ci.stageCount = 2;
8442 gp_ci.pStages = shaderStages;
8443 gp_ci.pVertexInputState = &vi_ci;
8444 gp_ci.pInputAssemblyState = &ia_ci;
8445 gp_ci.pViewportState = &vp_state_ci;
8446 gp_ci.pRasterizationState = &rs_ci;
8447 gp_ci.pColorBlendState = &cb_ci;
8448 gp_ci.pDynamicState = &dyn_state_ci;
8449 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8450 gp_ci.layout = pipeline_layout;
8451 gp_ci.renderPass = renderPass();
8452
8453 VkPipelineCacheCreateInfo pc_ci = {};
8454 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8455
8456 VkPipeline pipeline;
8457 VkPipelineCache pipelineCache;
8458
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008459 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008460 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008461 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008462
8463 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008464 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008465
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008466 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008467
8468 // Check too high (line width of 65536.0f).
8469 rs_ci.lineWidth = 65536.0f;
8470
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008471 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008472 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008473 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008474
8475 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008476 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008477
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008479
8480 dyn_state_ci.dynamicStateCount = 3;
8481
8482 rs_ci.lineWidth = 1.0f;
8483
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008484 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008485 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008486 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008487 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008488 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008489
8490 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008491 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008492 m_errorMonitor->VerifyFound();
8493
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008495
8496 // Check too high with dynamic setting.
8497 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8498 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008499 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008500
8501 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8502 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8503 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8504 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008505 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008506}
8507
Karl Schultz6addd812016-02-02 17:17:23 -07008508TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008509 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008510 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008511 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008512
Tony Barbour1fa09702017-03-16 12:09:08 -06008513 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008515
Tony Barbour552f6c02016-12-21 14:34:07 -07008516 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008517 // Don't care about RenderPass handle b/c error should be flagged before
8518 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008519 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008520
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008521 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008522}
8523
Karl Schultz6addd812016-02-02 17:17:23 -07008524TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008525 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8527 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008528
Tony Barbour1fa09702017-03-16 12:09:08 -06008529 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008530 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008531
Tony Barbour552f6c02016-12-21 14:34:07 -07008532 m_commandBuffer->BeginCommandBuffer();
8533 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008534 // Just create a dummy Renderpass that's non-NULL so we can get to the
8535 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008536 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008538 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008539}
8540
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008541TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008542 TEST_DESCRIPTION(
8543 "Begin a renderPass where clearValueCount is less than"
8544 "the number of renderPass attachments that use loadOp"
8545 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008546
Tony Barbour1fa09702017-03-16 12:09:08 -06008547 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008548 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8549
8550 // Create a renderPass with a single attachment that uses loadOp CLEAR
8551 VkAttachmentReference attach = {};
8552 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8553 VkSubpassDescription subpass = {};
8554 subpass.inputAttachmentCount = 1;
8555 subpass.pInputAttachments = &attach;
8556 VkRenderPassCreateInfo rpci = {};
8557 rpci.subpassCount = 1;
8558 rpci.pSubpasses = &subpass;
8559 rpci.attachmentCount = 1;
8560 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008561 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008562 // Set loadOp to CLEAR
8563 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8564 rpci.pAttachments = &attach_desc;
8565 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8566 VkRenderPass rp;
8567 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8568
8569 VkCommandBufferInheritanceInfo hinfo = {};
8570 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8571 hinfo.renderPass = VK_NULL_HANDLE;
8572 hinfo.subpass = 0;
8573 hinfo.framebuffer = VK_NULL_HANDLE;
8574 hinfo.occlusionQueryEnable = VK_FALSE;
8575 hinfo.queryFlags = 0;
8576 hinfo.pipelineStatistics = 0;
8577 VkCommandBufferBeginInfo info = {};
8578 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8579 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8580 info.pInheritanceInfo = &hinfo;
8581
8582 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8583 VkRenderPassBeginInfo rp_begin = {};
8584 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8585 rp_begin.pNext = NULL;
8586 rp_begin.renderPass = renderPass();
8587 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008588 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008589
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008591
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008592 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008593
8594 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008595
8596 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008597}
8598
Slawomir Cygan0808f392016-11-28 17:53:23 +01008599TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008600 TEST_DESCRIPTION(
8601 "Begin a renderPass where clearValueCount is greater than"
8602 "the number of renderPass attachments that use loadOp"
8603 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008604
Tony Barbour1fa09702017-03-16 12:09:08 -06008605 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008606 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8607
8608 // Create a renderPass with a single attachment that uses loadOp CLEAR
8609 VkAttachmentReference attach = {};
8610 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8611 VkSubpassDescription subpass = {};
8612 subpass.inputAttachmentCount = 1;
8613 subpass.pInputAttachments = &attach;
8614 VkRenderPassCreateInfo rpci = {};
8615 rpci.subpassCount = 1;
8616 rpci.pSubpasses = &subpass;
8617 rpci.attachmentCount = 1;
8618 VkAttachmentDescription attach_desc = {};
8619 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8620 // Set loadOp to CLEAR
8621 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8622 rpci.pAttachments = &attach_desc;
8623 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8624 VkRenderPass rp;
8625 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8626
8627 VkCommandBufferBeginInfo info = {};
8628 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8629 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8630
8631 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8632 VkRenderPassBeginInfo rp_begin = {};
8633 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8634 rp_begin.pNext = NULL;
8635 rp_begin.renderPass = renderPass();
8636 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008637 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008638
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008639 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8640 " has a clearValueCount of"
8641 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008642
8643 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8644
8645 m_errorMonitor->VerifyFound();
8646
8647 vkDestroyRenderPass(m_device->device(), rp, NULL);
8648}
8649
Cody Northrop3bb4d962016-05-09 16:15:57 -06008650TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008651 TEST_DESCRIPTION("End a command buffer with an active render pass");
8652
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8654 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008655
Tony Barbour1fa09702017-03-16 12:09:08 -06008656 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008657 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8658
Tony Barbour552f6c02016-12-21 14:34:07 -07008659 m_commandBuffer->BeginCommandBuffer();
8660 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8661 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008662
8663 m_errorMonitor->VerifyFound();
8664
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008665 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8666 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008667}
8668
Karl Schultz6addd812016-02-02 17:17:23 -07008669TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008670 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8672 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008673
Tony Barbour1fa09702017-03-16 12:09:08 -06008674 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008675 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008676
Tony Barbour552f6c02016-12-21 14:34:07 -07008677 m_commandBuffer->BeginCommandBuffer();
8678 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008679
8680 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008681 vk_testing::Buffer dstBuffer;
8682 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008683
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008684 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008685
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008686 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008687}
8688
Karl Schultz6addd812016-02-02 17:17:23 -07008689TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008690 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8692 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008693
Tony Barbour1fa09702017-03-16 12:09:08 -06008694 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008695 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008696
Tony Barbour552f6c02016-12-21 14:34:07 -07008697 m_commandBuffer->BeginCommandBuffer();
8698 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008699
8700 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008701 vk_testing::Buffer dstBuffer;
8702 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008703
Karl Schultz6addd812016-02-02 17:17:23 -07008704 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008705 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8706 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8707 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008708
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008709 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008710}
8711
Karl Schultz6addd812016-02-02 17:17:23 -07008712TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008713 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8715 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008716
Tony Barbour1fa09702017-03-16 12:09:08 -06008717 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008719
Tony Barbour552f6c02016-12-21 14:34:07 -07008720 m_commandBuffer->BeginCommandBuffer();
8721 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008722
Michael Lentine0a369f62016-02-03 16:51:46 -06008723 VkClearColorValue clear_color;
8724 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008725 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8726 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8727 const int32_t tex_width = 32;
8728 const int32_t tex_height = 32;
8729 VkImageCreateInfo image_create_info = {};
8730 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8731 image_create_info.pNext = NULL;
8732 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8733 image_create_info.format = tex_format;
8734 image_create_info.extent.width = tex_width;
8735 image_create_info.extent.height = tex_height;
8736 image_create_info.extent.depth = 1;
8737 image_create_info.mipLevels = 1;
8738 image_create_info.arrayLayers = 1;
8739 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8740 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008741 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008742
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008743 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008744 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008745
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008746 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008747
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008748 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008749
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008750 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008751}
8752
Karl Schultz6addd812016-02-02 17:17:23 -07008753TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008754 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8756 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008757
Tony Barbour1fa09702017-03-16 12:09:08 -06008758 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008760
Dave Houlton3c9fca72017-03-27 17:25:54 -06008761 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008762 if (!depth_format) {
8763 printf(" No Depth + Stencil format found. Skipped.\n");
8764 return;
8765 }
8766
Tony Barbour552f6c02016-12-21 14:34:07 -07008767 m_commandBuffer->BeginCommandBuffer();
8768 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008769
8770 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008771 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008772 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8773 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008774 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008775 image_create_info.extent.width = 64;
8776 image_create_info.extent.height = 64;
8777 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8778 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008779
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008780 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008781 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008782
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008783 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008784
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008785 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8786 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008787
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008788 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008789}
8790
Karl Schultz6addd812016-02-02 17:17:23 -07008791TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008792 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008793 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008794
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8796 "vkCmdClearAttachments(): This call "
8797 "must be issued inside an active "
8798 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008799
Tony Barbour1fa09702017-03-16 12:09:08 -06008800 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008801 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008802
8803 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008804 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008805 ASSERT_VK_SUCCESS(err);
8806
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008807 VkClearAttachment color_attachment;
8808 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8809 color_attachment.clearValue.color.float32[0] = 0;
8810 color_attachment.clearValue.color.float32[1] = 0;
8811 color_attachment.clearValue.color.float32[2] = 0;
8812 color_attachment.clearValue.color.float32[3] = 0;
8813 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008814 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008815 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008816
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008817 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008818}
8819
Chris Forbes3b97e932016-09-07 11:29:24 +12008820TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008821 TEST_DESCRIPTION(
8822 "Test that an error is produced when CmdNextSubpass is "
8823 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008824
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8826 "vkCmdNextSubpass(): Attempted to advance "
8827 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008828
Tony Barbour1fa09702017-03-16 12:09:08 -06008829 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008830 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8831
Tony Barbour552f6c02016-12-21 14:34:07 -07008832 m_commandBuffer->BeginCommandBuffer();
8833 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008834
8835 // error here.
8836 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8837 m_errorMonitor->VerifyFound();
8838
Tony Barbour552f6c02016-12-21 14:34:07 -07008839 m_commandBuffer->EndRenderPass();
8840 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008841}
8842
Chris Forbes6d624702016-09-07 13:57:05 +12008843TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008844 TEST_DESCRIPTION(
8845 "Test that an error is produced when CmdEndRenderPass is "
8846 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008847
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8849 "vkCmdEndRenderPass(): Called before reaching "
8850 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008851
Tony Barbour1fa09702017-03-16 12:09:08 -06008852 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008853 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8854 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008855
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008856 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008857
8858 VkRenderPass rp;
8859 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8860 ASSERT_VK_SUCCESS(err);
8861
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008862 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008863
8864 VkFramebuffer fb;
8865 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8866 ASSERT_VK_SUCCESS(err);
8867
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008868 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008869
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008870 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 +12008871
8872 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8873
8874 // Error here.
8875 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8876 m_errorMonitor->VerifyFound();
8877
8878 // Clean up.
8879 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8880 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8881}
8882
Karl Schultz9e66a292016-04-21 15:57:51 -06008883TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8884 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8886 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008887
Tony Barbour1fa09702017-03-16 12:09:08 -06008888 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008889 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008890
8891 VkBufferMemoryBarrier buf_barrier = {};
8892 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8893 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8894 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8895 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8896 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8897 buf_barrier.buffer = VK_NULL_HANDLE;
8898 buf_barrier.offset = 0;
8899 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008900 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8901 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008902
8903 m_errorMonitor->VerifyFound();
8904}
8905
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008906TEST_F(VkLayerTest, InvalidBarriers) {
8907 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8908
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008910
Tony Barbour1fa09702017-03-16 12:09:08 -06008911 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -06008912 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07008913 if (!depth_format) {
8914 printf(" No Depth + Stencil format found. Skipped.\n");
8915 return;
8916 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008917 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8918
8919 VkMemoryBarrier mem_barrier = {};
8920 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8921 mem_barrier.pNext = NULL;
8922 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8923 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008924 m_commandBuffer->BeginCommandBuffer();
8925 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008926 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008927 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008928 &mem_barrier, 0, nullptr, 0, nullptr);
8929 m_errorMonitor->VerifyFound();
8930
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008932 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008933 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008934 ASSERT_TRUE(image.initialized());
8935 VkImageMemoryBarrier img_barrier = {};
8936 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8937 img_barrier.pNext = NULL;
8938 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8939 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8940 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8941 // New layout can't be UNDEFINED
8942 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8943 img_barrier.image = image.handle();
8944 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8945 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8946 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8947 img_barrier.subresourceRange.baseArrayLayer = 0;
8948 img_barrier.subresourceRange.baseMipLevel = 0;
8949 img_barrier.subresourceRange.layerCount = 1;
8950 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008951 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8952 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008953 m_errorMonitor->VerifyFound();
8954 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8955
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8957 "Subresource must have the sum of the "
8958 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008959 // baseArrayLayer + layerCount must be <= image's arrayLayers
8960 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008961 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8962 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008963 m_errorMonitor->VerifyFound();
8964 img_barrier.subresourceRange.baseArrayLayer = 0;
8965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008967 // baseMipLevel + levelCount must be <= image's mipLevels
8968 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008969 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8970 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008971 m_errorMonitor->VerifyFound();
8972 img_barrier.subresourceRange.baseMipLevel = 0;
8973
Mike Weiblen7053aa32017-01-25 15:21:10 -07008974 // levelCount must be non-zero.
8975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8976 img_barrier.subresourceRange.levelCount = 0;
8977 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8978 nullptr, 0, nullptr, 1, &img_barrier);
8979 m_errorMonitor->VerifyFound();
8980 img_barrier.subresourceRange.levelCount = 1;
8981
8982 // layerCount must be non-zero.
8983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8984 img_barrier.subresourceRange.layerCount = 0;
8985 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8986 nullptr, 0, nullptr, 1, &img_barrier);
8987 m_errorMonitor->VerifyFound();
8988 img_barrier.subresourceRange.layerCount = 1;
8989
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008990 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 -06008991 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008992 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8993 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008994 VkBufferMemoryBarrier buf_barrier = {};
8995 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8996 buf_barrier.pNext = NULL;
8997 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8998 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8999 buf_barrier.buffer = buffer.handle();
9000 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9001 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9002 buf_barrier.offset = 0;
9003 buf_barrier.size = VK_WHOLE_SIZE;
9004 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009005 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9006 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009007 m_errorMonitor->VerifyFound();
9008 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9009
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009011 buf_barrier.offset = 257;
9012 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009013 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9014 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009015 m_errorMonitor->VerifyFound();
9016 buf_barrier.offset = 0;
9017
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009019 buf_barrier.size = 257;
9020 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009021 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9022 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009024
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009025 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009026 m_errorMonitor->SetDesiredFailureMsg(
9027 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009028 "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 -06009029 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009030 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009031 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009032 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9033 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009034 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009035
9036 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009037 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009038 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9039 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009040 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009041
9042 // Having anything other than DEPTH or STENCIL is an error
9043 m_errorMonitor->SetDesiredFailureMsg(
9044 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9045 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9046 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9047 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9048 nullptr, 0, nullptr, 1, &img_barrier);
9049 m_errorMonitor->VerifyFound();
9050
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009051 // Now test depth-only
9052 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009053 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9054 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009055 VkDepthStencilObj d_image(m_device);
9056 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9057 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009058 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009059 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009060 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009061
9062 // DEPTH bit must be set
9063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9064 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009065 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009066 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9067 0, nullptr, 0, nullptr, 1, &img_barrier);
9068 m_errorMonitor->VerifyFound();
9069
9070 // No bits other than DEPTH may be set
9071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9072 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9073 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009074 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9075 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009076 m_errorMonitor->VerifyFound();
9077 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009078
9079 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009080 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9081 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009082 VkDepthStencilObj s_image(m_device);
9083 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9084 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009085 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009086 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009087 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009088 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9090 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009091 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009092 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9093 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009094 m_errorMonitor->VerifyFound();
9095 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009096
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009097 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009098 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009099 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009100 ASSERT_TRUE(c_image.initialized());
9101 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9102 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9103 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009104
9105 // COLOR bit must be set
9106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9107 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009108 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009109 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9110 nullptr, 0, nullptr, 1, &img_barrier);
9111 m_errorMonitor->VerifyFound();
9112
9113 // No bits other than COLOR may be set
9114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9115 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9116 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009117 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9118 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009119 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009120
Mike Weiblene6e01172017-03-07 22:18:40 -07009121 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9122 {
9123 VkImageObj img_color(m_device);
9124 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9125 ASSERT_TRUE(img_color.initialized());
9126
9127 VkImageObj img_ds(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -06009128 img_ds.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009129 ASSERT_TRUE(img_ds.initialized());
9130
9131 VkImageObj img_xfer_src(m_device);
9132 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9133 ASSERT_TRUE(img_xfer_src.initialized());
9134
9135 VkImageObj img_xfer_dst(m_device);
9136 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9137 ASSERT_TRUE(img_xfer_dst.initialized());
9138
9139 VkImageObj img_sampled(m_device);
9140 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9141 ASSERT_TRUE(img_sampled.initialized());
9142
9143 VkImageObj img_input(m_device);
9144 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9145 ASSERT_TRUE(img_input.initialized());
9146
9147 const struct {
9148 VkImageObj &image_obj;
9149 VkImageLayout bad_layout;
9150 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9151 } bad_buffer_layouts[] = {
9152 // clang-format off
9153 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9154 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9155 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9156 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9157 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9158 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9159 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9160 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9161 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9162 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9163 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9164 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9165 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9166 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9167 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9168 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9169 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9170 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9171 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9172 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9173 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9174 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9175 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9176 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9177 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9178 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9179 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9180 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9181 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9182 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9183 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9184 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9185 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9186 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9187 // clang-format on
9188 };
9189 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9190
9191 for (uint32_t i = 0; i < layout_count; ++i) {
9192 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9193 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9194 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9195 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9196 : VK_IMAGE_ASPECT_COLOR_BIT;
9197
9198 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9199 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9201 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9202 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9203 m_errorMonitor->VerifyFound();
9204
9205 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9206 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9208 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9209 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9210 m_errorMonitor->VerifyFound();
9211 }
9212
9213 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9214 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9215 }
9216
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009217 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9218
9219 // Create command pool with incompatible queueflags
9220 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009221 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009222 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009223 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009224 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009225 }
9226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9227
9228 VkCommandPool command_pool;
9229 VkCommandPoolCreateInfo pool_create_info{};
9230 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9231 pool_create_info.queueFamilyIndex = queue_family_index;
9232 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9233 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9234
9235 // Allocate a command buffer
9236 VkCommandBuffer bad_command_buffer;
9237 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9238 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9239 command_buffer_allocate_info.commandPool = command_pool;
9240 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9241 command_buffer_allocate_info.commandBufferCount = 1;
9242 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9243
9244 VkCommandBufferBeginInfo cbbi = {};
9245 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9246 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9247 buf_barrier.offset = 0;
9248 buf_barrier.size = VK_WHOLE_SIZE;
9249 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9250 &buf_barrier, 0, nullptr);
9251 m_errorMonitor->VerifyFound();
9252
9253 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9254 vkEndCommandBuffer(bad_command_buffer);
9255 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009256 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009257 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009258 }
9259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9260 VkEvent event;
9261 VkEventCreateInfo event_create_info{};
9262 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9263 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9264 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9265 nullptr, 0, nullptr);
9266 m_errorMonitor->VerifyFound();
9267
9268 vkEndCommandBuffer(bad_command_buffer);
9269 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009270}
9271
Tony Barbour18ba25c2016-09-29 13:42:40 -06009272TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9273 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9274
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009276 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009277 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009278 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9279 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009280 ASSERT_TRUE(image.initialized());
9281
9282 VkImageMemoryBarrier barrier = {};
9283 VkImageSubresourceRange range;
9284 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9285 barrier.srcAccessMask = 0;
9286 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9287 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9288 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9289 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9290 barrier.image = image.handle();
9291 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9292 range.baseMipLevel = 0;
9293 range.levelCount = 1;
9294 range.baseArrayLayer = 0;
9295 range.layerCount = 1;
9296 barrier.subresourceRange = range;
9297 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9298 cmdbuf.BeginCommandBuffer();
9299 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9300 &barrier);
9301 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9302 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9303 barrier.srcAccessMask = 0;
9304 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9305 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9306 &barrier);
9307
9308 m_errorMonitor->VerifyFound();
9309}
9310
Karl Schultz6addd812016-02-02 17:17:23 -07009311TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009312 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009313 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009314 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009315
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009316 uint32_t const indices[] = {0};
9317 VkBufferCreateInfo buf_info = {};
9318 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9319 buf_info.size = 1024;
9320 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9321 buf_info.queueFamilyIndexCount = 1;
9322 buf_info.pQueueFamilyIndices = indices;
9323
9324 VkBuffer buffer;
9325 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9326 ASSERT_VK_SUCCESS(err);
9327
9328 VkMemoryRequirements requirements;
9329 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9330
9331 VkMemoryAllocateInfo alloc_info{};
9332 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9333 alloc_info.pNext = NULL;
9334 alloc_info.memoryTypeIndex = 0;
9335 alloc_info.allocationSize = requirements.size;
9336 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9337 ASSERT_TRUE(pass);
9338
9339 VkDeviceMemory memory;
9340 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9341 ASSERT_VK_SUCCESS(err);
9342
9343 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009344 ASSERT_VK_SUCCESS(err);
9345
Tony Barbour552f6c02016-12-21 14:34:07 -07009346 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009347 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009348
Karl Schultz6addd812016-02-02 17:17:23 -07009349 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9350 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009351 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009352 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9353 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009354 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009355
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009356 vkFreeMemory(m_device->device(), memory, NULL);
9357 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009358}
9359
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009360TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9361 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009362 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009363 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9364 VkBufferCreateInfo buffCI = {};
9365 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9366 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009367 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009368 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009369 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009370 uint32_t qfi[2];
9371 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009372 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009373
9374 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009375 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009376
9377 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9379 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9380 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009381 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009382 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009383
9384 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009385 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9387
9388 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9389 buffCI.queueFamilyIndexCount = 2;
9390 qfi[0] = 1;
9391 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009392 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009393 VkDeviceMemory mem;
9394 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009395 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009396
9397 VkMemoryAllocateInfo alloc_info = {};
9398 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9399 alloc_info.allocationSize = 1024;
9400 bool pass = false;
9401 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9402 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009403 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009404 return;
9405 }
9406 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009407 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009408
9409 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009410 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009411 m_commandBuffer->end();
9412 QueueCommandBuffer(false);
9413 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009414 vkDestroyBuffer(m_device->device(), ib2, NULL);
9415 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009416 }
9417
Tony Barbourdf4c0042016-06-01 15:55:43 -06009418 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009419}
9420
Karl Schultz6addd812016-02-02 17:17:23 -07009421TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009422 TEST_DESCRIPTION(
9423 "Attempt vkCmdExecuteCommands with a primary command buffer"
9424 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009425
Tony Barbour1fa09702017-03-16 12:09:08 -06009426 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009428
Chris Forbesf29a84f2016-10-06 18:39:28 +13009429 // An empty primary command buffer
9430 VkCommandBufferObj cb(m_device, m_commandPool);
9431 cb.BeginCommandBuffer();
9432 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009433
Chris Forbesf29a84f2016-10-06 18:39:28 +13009434 m_commandBuffer->BeginCommandBuffer();
9435 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9436 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009437
Chris Forbesf29a84f2016-10-06 18:39:28 +13009438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9439 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009440 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009441
9442 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009443}
9444
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009445TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009446 TEST_DESCRIPTION(
9447 "Attempt to update descriptor sets for images and buffers "
9448 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009449 VkResult err;
9450
Tony Barbour1fa09702017-03-16 12:09:08 -06009451 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009452 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9453 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9454 ds_type_count[i].type = VkDescriptorType(i);
9455 ds_type_count[i].descriptorCount = 1;
9456 }
9457 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9458 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9459 ds_pool_ci.pNext = NULL;
9460 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9461 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9462 ds_pool_ci.pPoolSizes = ds_type_count;
9463
9464 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009465 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009466 ASSERT_VK_SUCCESS(err);
9467
9468 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009469 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009470 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9471 dsl_binding[i].binding = 0;
9472 dsl_binding[i].descriptorType = VkDescriptorType(i);
9473 dsl_binding[i].descriptorCount = 1;
9474 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9475 dsl_binding[i].pImmutableSamplers = NULL;
9476 }
9477
9478 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9479 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9480 ds_layout_ci.pNext = NULL;
9481 ds_layout_ci.bindingCount = 1;
9482 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9483 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9484 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009485 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009486 ASSERT_VK_SUCCESS(err);
9487 }
9488 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9489 VkDescriptorSetAllocateInfo alloc_info = {};
9490 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9491 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9492 alloc_info.descriptorPool = ds_pool;
9493 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009494 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009495 ASSERT_VK_SUCCESS(err);
9496
9497 // Create a buffer & bufferView to be used for invalid updates
9498 VkBufferCreateInfo buff_ci = {};
9499 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009500 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009501 buff_ci.size = 256;
9502 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009503 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009504 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9505 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009506
9507 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9508 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9509 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9510 ASSERT_VK_SUCCESS(err);
9511
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009512 VkMemoryRequirements mem_reqs;
9513 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9514 VkMemoryAllocateInfo mem_alloc_info = {};
9515 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9516 mem_alloc_info.pNext = NULL;
9517 mem_alloc_info.memoryTypeIndex = 0;
9518 mem_alloc_info.allocationSize = mem_reqs.size;
9519 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9520 if (!pass) {
9521 vkDestroyBuffer(m_device->device(), buffer, NULL);
9522 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9523 return;
9524 }
9525 VkDeviceMemory mem;
9526 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9527 ASSERT_VK_SUCCESS(err);
9528 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9529 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009530
9531 VkBufferViewCreateInfo buff_view_ci = {};
9532 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9533 buff_view_ci.buffer = buffer;
9534 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9535 buff_view_ci.range = VK_WHOLE_SIZE;
9536 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009537 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009538 ASSERT_VK_SUCCESS(err);
9539
Tony Barbour415497c2017-01-24 10:06:09 -07009540 // Now get resources / view for storage_texel_buffer
9541 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9542 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9543 if (!pass) {
9544 vkDestroyBuffer(m_device->device(), buffer, NULL);
9545 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9546 vkFreeMemory(m_device->device(), mem, NULL);
9547 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9548 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9549 return;
9550 }
9551 VkDeviceMemory storage_texel_buffer_mem;
9552 VkBufferView storage_texel_buffer_view;
9553 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9554 ASSERT_VK_SUCCESS(err);
9555 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9556 ASSERT_VK_SUCCESS(err);
9557 buff_view_ci.buffer = storage_texel_buffer;
9558 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9559 ASSERT_VK_SUCCESS(err);
9560
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009561 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009562 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009563 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009564 image_ci.format = VK_FORMAT_UNDEFINED;
9565 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9566 VkFormat format = static_cast<VkFormat>(f);
9567 VkFormatProperties fProps = m_device->format_properties(format);
9568 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9569 image_ci.format = format;
9570 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9571 break;
9572 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9573 image_ci.format = format;
9574 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9575 break;
9576 }
9577 }
9578 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9579 return;
9580 }
9581
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009582 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9583 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009584 image_ci.extent.width = 64;
9585 image_ci.extent.height = 64;
9586 image_ci.extent.depth = 1;
9587 image_ci.mipLevels = 1;
9588 image_ci.arrayLayers = 1;
9589 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009590 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009591 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009592 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9593 VkImage image;
9594 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9595 ASSERT_VK_SUCCESS(err);
9596 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009597 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009598
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009599 VkMemoryAllocateInfo mem_alloc = {};
9600 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9601 mem_alloc.pNext = NULL;
9602 mem_alloc.allocationSize = 0;
9603 mem_alloc.memoryTypeIndex = 0;
9604 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9605 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009606 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009607 ASSERT_TRUE(pass);
9608 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9609 ASSERT_VK_SUCCESS(err);
9610 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9611 ASSERT_VK_SUCCESS(err);
9612 // Now create view for image
9613 VkImageViewCreateInfo image_view_ci = {};
9614 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9615 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009616 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009617 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9618 image_view_ci.subresourceRange.layerCount = 1;
9619 image_view_ci.subresourceRange.baseArrayLayer = 0;
9620 image_view_ci.subresourceRange.levelCount = 1;
9621 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9622 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009623 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009624 ASSERT_VK_SUCCESS(err);
9625
9626 VkDescriptorBufferInfo buff_info = {};
9627 buff_info.buffer = buffer;
9628 VkDescriptorImageInfo img_info = {};
9629 img_info.imageView = image_view;
9630 VkWriteDescriptorSet descriptor_write = {};
9631 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9632 descriptor_write.dstBinding = 0;
9633 descriptor_write.descriptorCount = 1;
9634 descriptor_write.pTexelBufferView = &buff_view;
9635 descriptor_write.pBufferInfo = &buff_info;
9636 descriptor_write.pImageInfo = &img_info;
9637
9638 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009639 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009640 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9641 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9642 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9643 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9644 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9645 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9646 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9647 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9648 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9649 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9650 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009651 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009652 // Start loop at 1 as SAMPLER desc type has no usage bit error
9653 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009654 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9655 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9656 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9657 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009658 descriptor_write.descriptorType = VkDescriptorType(i);
9659 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009661
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009663
9664 m_errorMonitor->VerifyFound();
9665 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009666 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9667 descriptor_write.pTexelBufferView = &buff_view;
9668 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009669 }
Tony Barbour415497c2017-01-24 10:06:09 -07009670
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009671 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9672 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009673 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009674 vkDestroyImageView(m_device->device(), image_view, NULL);
9675 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009676 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009677 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009678 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009679 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009680 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9682}
9683
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009684TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009685 TEST_DESCRIPTION(
9686 "Attempt to update buffer descriptor set that has incorrect "
9687 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009688 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009689 "2. range value of 0\n"
9690 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009691 VkResult err;
9692
Tony Barbour1fa09702017-03-16 12:09:08 -06009693 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009694 VkDescriptorPoolSize ds_type_count = {};
9695 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9696 ds_type_count.descriptorCount = 1;
9697
9698 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9699 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9700 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009701 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009702 ds_pool_ci.maxSets = 1;
9703 ds_pool_ci.poolSizeCount = 1;
9704 ds_pool_ci.pPoolSizes = &ds_type_count;
9705
9706 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009707 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009708 ASSERT_VK_SUCCESS(err);
9709
9710 // Create layout with single uniform buffer descriptor
9711 VkDescriptorSetLayoutBinding dsl_binding = {};
9712 dsl_binding.binding = 0;
9713 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9714 dsl_binding.descriptorCount = 1;
9715 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9716 dsl_binding.pImmutableSamplers = NULL;
9717
9718 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9719 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9720 ds_layout_ci.pNext = NULL;
9721 ds_layout_ci.bindingCount = 1;
9722 ds_layout_ci.pBindings = &dsl_binding;
9723 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009724 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009725 ASSERT_VK_SUCCESS(err);
9726
9727 VkDescriptorSet descriptor_set = {};
9728 VkDescriptorSetAllocateInfo alloc_info = {};
9729 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9730 alloc_info.descriptorSetCount = 1;
9731 alloc_info.descriptorPool = ds_pool;
9732 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009733 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009734 ASSERT_VK_SUCCESS(err);
9735
9736 // Create a buffer to be used for invalid updates
9737 VkBufferCreateInfo buff_ci = {};
9738 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9739 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009740 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009741 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9742 VkBuffer buffer;
9743 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9744 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009745
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009746 // Have to bind memory to buffer before descriptor update
9747 VkMemoryAllocateInfo mem_alloc = {};
9748 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9749 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009750 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009751 mem_alloc.memoryTypeIndex = 0;
9752
9753 VkMemoryRequirements mem_reqs;
9754 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009755 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009756 if (!pass) {
9757 vkDestroyBuffer(m_device->device(), buffer, NULL);
9758 return;
9759 }
9760
9761 VkDeviceMemory mem;
9762 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9763 ASSERT_VK_SUCCESS(err);
9764 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9765 ASSERT_VK_SUCCESS(err);
9766
9767 VkDescriptorBufferInfo buff_info = {};
9768 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009769 // Cause error due to offset out of range
9770 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009771 buff_info.range = VK_WHOLE_SIZE;
9772 VkWriteDescriptorSet descriptor_write = {};
9773 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9774 descriptor_write.dstBinding = 0;
9775 descriptor_write.descriptorCount = 1;
9776 descriptor_write.pTexelBufferView = nullptr;
9777 descriptor_write.pBufferInfo = &buff_info;
9778 descriptor_write.pImageInfo = nullptr;
9779
9780 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9781 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009783
9784 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9785
9786 m_errorMonitor->VerifyFound();
9787 // Now cause error due to range of 0
9788 buff_info.offset = 0;
9789 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009791
9792 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9793
9794 m_errorMonitor->VerifyFound();
9795 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009796 buff_info.offset = 0;
9797 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009799
9800 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9801
9802 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009803 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009804 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9805 vkDestroyBuffer(m_device->device(), buffer, NULL);
9806 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9807 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9808}
9809
Tobin Ehlis845887e2017-02-02 19:01:44 -07009810TEST_F(VkLayerTest, DSBufferLimitErrors) {
9811 TEST_DESCRIPTION(
9812 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9813 "Test cases include:\n"
9814 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9815 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9816 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9817 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9818 VkResult err;
9819
Tony Barbour1fa09702017-03-16 12:09:08 -06009820 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009821 VkDescriptorPoolSize ds_type_count[2] = {};
9822 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9823 ds_type_count[0].descriptorCount = 1;
9824 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9825 ds_type_count[1].descriptorCount = 1;
9826
9827 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9828 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9829 ds_pool_ci.pNext = NULL;
9830 ds_pool_ci.maxSets = 1;
9831 ds_pool_ci.poolSizeCount = 2;
9832 ds_pool_ci.pPoolSizes = ds_type_count;
9833
9834 VkDescriptorPool ds_pool;
9835 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9836 ASSERT_VK_SUCCESS(err);
9837
9838 // Create layout with single uniform buffer & single storage buffer descriptor
9839 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9840 dsl_binding[0].binding = 0;
9841 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9842 dsl_binding[0].descriptorCount = 1;
9843 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9844 dsl_binding[0].pImmutableSamplers = NULL;
9845 dsl_binding[1].binding = 1;
9846 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9847 dsl_binding[1].descriptorCount = 1;
9848 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9849 dsl_binding[1].pImmutableSamplers = NULL;
9850
9851 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9852 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9853 ds_layout_ci.pNext = NULL;
9854 ds_layout_ci.bindingCount = 2;
9855 ds_layout_ci.pBindings = dsl_binding;
9856 VkDescriptorSetLayout ds_layout;
9857 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9858 ASSERT_VK_SUCCESS(err);
9859
9860 VkDescriptorSet descriptor_set = {};
9861 VkDescriptorSetAllocateInfo alloc_info = {};
9862 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9863 alloc_info.descriptorSetCount = 1;
9864 alloc_info.descriptorPool = ds_pool;
9865 alloc_info.pSetLayouts = &ds_layout;
9866 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9867 ASSERT_VK_SUCCESS(err);
9868
9869 // Create a buffer to be used for invalid updates
9870 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9871 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9872 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9873 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9874 VkBufferCreateInfo ub_ci = {};
9875 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9876 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9877 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9878 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9879 VkBuffer uniform_buffer;
9880 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9881 ASSERT_VK_SUCCESS(err);
9882 VkBufferCreateInfo sb_ci = {};
9883 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9884 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9885 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9886 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9887 VkBuffer storage_buffer;
9888 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9889 ASSERT_VK_SUCCESS(err);
9890 // Have to bind memory to buffer before descriptor update
9891 VkMemoryAllocateInfo mem_alloc = {};
9892 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9893 mem_alloc.pNext = NULL;
9894 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9895 mem_alloc.memoryTypeIndex = 0;
9896
Cort Stratton77a0d592017-02-17 13:14:13 -08009897 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9898 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9899 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9900 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9901 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009902 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009903 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009904 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009905 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9906 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009907 return;
9908 }
9909
9910 VkDeviceMemory mem;
9911 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009912 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009913 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009914 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9915 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9916 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9917 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9918 return;
9919 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009920 ASSERT_VK_SUCCESS(err);
9921 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9922 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009923 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009924 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9925 ASSERT_VK_SUCCESS(err);
9926
9927 VkDescriptorBufferInfo buff_info = {};
9928 buff_info.buffer = uniform_buffer;
9929 buff_info.range = ub_ci.size; // This will exceed limit
9930 VkWriteDescriptorSet descriptor_write = {};
9931 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9932 descriptor_write.dstBinding = 0;
9933 descriptor_write.descriptorCount = 1;
9934 descriptor_write.pTexelBufferView = nullptr;
9935 descriptor_write.pBufferInfo = &buff_info;
9936 descriptor_write.pImageInfo = nullptr;
9937
9938 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9939 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009940 if (max_ub_range != UINT32_MAX) {
9941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9942 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9943 m_errorMonitor->VerifyFound();
9944 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009945 // Reduce size of range to acceptable limit & cause offset error
9946 buff_info.range = max_ub_range;
9947 buff_info.offset = min_ub_align - 1;
9948 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9949 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9950 m_errorMonitor->VerifyFound();
9951
9952 // Now break storage updates
9953 buff_info.buffer = storage_buffer;
9954 buff_info.range = sb_ci.size; // This will exceed limit
9955 buff_info.offset = 0; // Reset offset for this update
9956
9957 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9958 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009959 if (max_ub_range != UINT32_MAX) {
9960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9961 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9962 m_errorMonitor->VerifyFound();
9963 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009964
9965 // Reduce size of range to acceptable limit & cause offset error
9966 buff_info.range = max_sb_range;
9967 buff_info.offset = min_sb_align - 1;
9968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9970 m_errorMonitor->VerifyFound();
9971
9972 vkFreeMemory(m_device->device(), mem, NULL);
9973 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9974 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9975 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9976 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9977}
9978
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009979TEST_F(VkLayerTest, DSAspectBitsErrors) {
9980 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9981 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009982 TEST_DESCRIPTION(
9983 "Attempt to update descriptor sets for images "
9984 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009985 VkResult err;
9986
Tony Barbour1fa09702017-03-16 12:09:08 -06009987 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -06009988 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -07009989 if (!depth_format) {
9990 printf(" No Depth + Stencil format found. Skipped.\n");
9991 return;
9992 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009993 VkDescriptorPoolSize ds_type_count = {};
9994 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9995 ds_type_count.descriptorCount = 1;
9996
9997 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9998 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9999 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010000 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010001 ds_pool_ci.maxSets = 5;
10002 ds_pool_ci.poolSizeCount = 1;
10003 ds_pool_ci.pPoolSizes = &ds_type_count;
10004
10005 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010006 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010007 ASSERT_VK_SUCCESS(err);
10008
10009 VkDescriptorSetLayoutBinding dsl_binding = {};
10010 dsl_binding.binding = 0;
10011 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10012 dsl_binding.descriptorCount = 1;
10013 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10014 dsl_binding.pImmutableSamplers = NULL;
10015
10016 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10017 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10018 ds_layout_ci.pNext = NULL;
10019 ds_layout_ci.bindingCount = 1;
10020 ds_layout_ci.pBindings = &dsl_binding;
10021 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010022 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010023 ASSERT_VK_SUCCESS(err);
10024
10025 VkDescriptorSet descriptor_set = {};
10026 VkDescriptorSetAllocateInfo alloc_info = {};
10027 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10028 alloc_info.descriptorSetCount = 1;
10029 alloc_info.descriptorPool = ds_pool;
10030 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010031 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010032 ASSERT_VK_SUCCESS(err);
10033
10034 // Create an image to be used for invalid updates
10035 VkImageCreateInfo image_ci = {};
10036 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10037 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010038 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010039 image_ci.extent.width = 64;
10040 image_ci.extent.height = 64;
10041 image_ci.extent.depth = 1;
10042 image_ci.mipLevels = 1;
10043 image_ci.arrayLayers = 1;
10044 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010045 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010046 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10047 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10048 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10049 VkImage image;
10050 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10051 ASSERT_VK_SUCCESS(err);
10052 // Bind memory to image
10053 VkMemoryRequirements mem_reqs;
10054 VkDeviceMemory image_mem;
10055 bool pass;
10056 VkMemoryAllocateInfo mem_alloc = {};
10057 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10058 mem_alloc.pNext = NULL;
10059 mem_alloc.allocationSize = 0;
10060 mem_alloc.memoryTypeIndex = 0;
10061 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10062 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010063 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010064 ASSERT_TRUE(pass);
10065 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10066 ASSERT_VK_SUCCESS(err);
10067 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10068 ASSERT_VK_SUCCESS(err);
10069 // Now create view for image
10070 VkImageViewCreateInfo image_view_ci = {};
10071 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10072 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010073 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010074 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10075 image_view_ci.subresourceRange.layerCount = 1;
10076 image_view_ci.subresourceRange.baseArrayLayer = 0;
10077 image_view_ci.subresourceRange.levelCount = 1;
10078 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010079 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010080
10081 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010082 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010083 ASSERT_VK_SUCCESS(err);
10084
10085 VkDescriptorImageInfo img_info = {};
10086 img_info.imageView = image_view;
10087 VkWriteDescriptorSet descriptor_write = {};
10088 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10089 descriptor_write.dstBinding = 0;
10090 descriptor_write.descriptorCount = 1;
10091 descriptor_write.pTexelBufferView = NULL;
10092 descriptor_write.pBufferInfo = NULL;
10093 descriptor_write.pImageInfo = &img_info;
10094 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10095 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010096 const char *error_msg =
10097 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10098 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010099 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010100
10101 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10102
10103 m_errorMonitor->VerifyFound();
10104 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10105 vkDestroyImage(m_device->device(), image, NULL);
10106 vkFreeMemory(m_device->device(), image_mem, NULL);
10107 vkDestroyImageView(m_device->device(), image_view, NULL);
10108 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10109 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10110}
10111
Karl Schultz6addd812016-02-02 17:17:23 -070010112TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010113 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010114 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010116 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10117 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10118 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010119
Tony Barbour1fa09702017-03-16 12:09:08 -060010120 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010121 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010122 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010123 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10124 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010125
10126 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010127 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10128 ds_pool_ci.pNext = NULL;
10129 ds_pool_ci.maxSets = 1;
10130 ds_pool_ci.poolSizeCount = 1;
10131 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010132
Tobin Ehlis3b780662015-05-28 12:11:26 -060010133 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010134 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010135 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010136 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010137 dsl_binding.binding = 0;
10138 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10139 dsl_binding.descriptorCount = 1;
10140 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10141 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010142
Tony Barboureb254902015-07-15 12:50:33 -060010143 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010144 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10145 ds_layout_ci.pNext = NULL;
10146 ds_layout_ci.bindingCount = 1;
10147 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010148
Tobin Ehlis3b780662015-05-28 12:11:26 -060010149 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010150 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010151 ASSERT_VK_SUCCESS(err);
10152
10153 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010154 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010155 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010156 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010157 alloc_info.descriptorPool = ds_pool;
10158 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010159 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010160 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010161
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010162 VkSamplerCreateInfo sampler_ci = {};
10163 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10164 sampler_ci.pNext = NULL;
10165 sampler_ci.magFilter = VK_FILTER_NEAREST;
10166 sampler_ci.minFilter = VK_FILTER_NEAREST;
10167 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10168 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10169 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10170 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10171 sampler_ci.mipLodBias = 1.0;
10172 sampler_ci.anisotropyEnable = VK_FALSE;
10173 sampler_ci.maxAnisotropy = 1;
10174 sampler_ci.compareEnable = VK_FALSE;
10175 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10176 sampler_ci.minLod = 1.0;
10177 sampler_ci.maxLod = 1.0;
10178 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10179 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10180 VkSampler sampler;
10181 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10182 ASSERT_VK_SUCCESS(err);
10183
10184 VkDescriptorImageInfo info = {};
10185 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010186
10187 VkWriteDescriptorSet descriptor_write;
10188 memset(&descriptor_write, 0, sizeof(descriptor_write));
10189 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010190 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010191 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010192 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010193 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010194 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010195
10196 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10197
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010198 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010199
Chia-I Wuf7458c52015-10-26 21:10:41 +080010200 vkDestroySampler(m_device->device(), sampler, NULL);
10201 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10202 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010203}
10204
Karl Schultz6addd812016-02-02 17:17:23 -070010205TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010206 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010207 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010208
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010210
Tony Barbour1fa09702017-03-16 12:09:08 -060010211 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010212 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010213 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010214 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10215 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010216
10217 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010218 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10219 ds_pool_ci.pNext = NULL;
10220 ds_pool_ci.maxSets = 1;
10221 ds_pool_ci.poolSizeCount = 1;
10222 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010223
Tobin Ehlis3b780662015-05-28 12:11:26 -060010224 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010225 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010226 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010227
Tony Barboureb254902015-07-15 12:50:33 -060010228 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010229 dsl_binding.binding = 0;
10230 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10231 dsl_binding.descriptorCount = 1;
10232 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10233 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010234
10235 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010236 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10237 ds_layout_ci.pNext = NULL;
10238 ds_layout_ci.bindingCount = 1;
10239 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010240
Tobin Ehlis3b780662015-05-28 12:11:26 -060010241 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010242 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010243 ASSERT_VK_SUCCESS(err);
10244
10245 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010246 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010247 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010248 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010249 alloc_info.descriptorPool = ds_pool;
10250 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010251 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010252 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010253
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010254 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10255
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010256 // Correctly update descriptor to avoid "NOT_UPDATED" error
10257 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010258 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010259 buff_info.offset = 0;
10260 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010261
10262 VkWriteDescriptorSet descriptor_write;
10263 memset(&descriptor_write, 0, sizeof(descriptor_write));
10264 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010265 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010266 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010267 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010268 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10269 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010270
10271 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10272
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010273 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010274
Chia-I Wuf7458c52015-10-26 21:10:41 +080010275 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10276 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010277}
10278
Karl Schultz6addd812016-02-02 17:17:23 -070010279TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010280 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010281 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010282
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010284
Tony Barbour1fa09702017-03-16 12:09:08 -060010285 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010286 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010287 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010288 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10289 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010290
10291 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010292 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10293 ds_pool_ci.pNext = NULL;
10294 ds_pool_ci.maxSets = 1;
10295 ds_pool_ci.poolSizeCount = 1;
10296 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010297
Tobin Ehlis3b780662015-05-28 12:11:26 -060010298 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010299 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010300 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010301
Tony Barboureb254902015-07-15 12:50:33 -060010302 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010303 dsl_binding.binding = 0;
10304 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10305 dsl_binding.descriptorCount = 1;
10306 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10307 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010308
10309 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010310 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10311 ds_layout_ci.pNext = NULL;
10312 ds_layout_ci.bindingCount = 1;
10313 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010314 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010315 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010316 ASSERT_VK_SUCCESS(err);
10317
10318 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010319 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010320 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010321 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010322 alloc_info.descriptorPool = ds_pool;
10323 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010324 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010325 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010326
Tony Barboureb254902015-07-15 12:50:33 -060010327 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010328 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10329 sampler_ci.pNext = NULL;
10330 sampler_ci.magFilter = VK_FILTER_NEAREST;
10331 sampler_ci.minFilter = VK_FILTER_NEAREST;
10332 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10333 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10334 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10335 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10336 sampler_ci.mipLodBias = 1.0;
10337 sampler_ci.anisotropyEnable = VK_FALSE;
10338 sampler_ci.maxAnisotropy = 1;
10339 sampler_ci.compareEnable = VK_FALSE;
10340 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10341 sampler_ci.minLod = 1.0;
10342 sampler_ci.maxLod = 1.0;
10343 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10344 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010345
Tobin Ehlis3b780662015-05-28 12:11:26 -060010346 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010347 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010348 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010349
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010350 VkDescriptorImageInfo info = {};
10351 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010352
10353 VkWriteDescriptorSet descriptor_write;
10354 memset(&descriptor_write, 0, sizeof(descriptor_write));
10355 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010356 descriptor_write.dstSet = descriptorSet;
10357 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010358 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010359 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010360 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010361 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010362
10363 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10364
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010365 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010366
Chia-I Wuf7458c52015-10-26 21:10:41 +080010367 vkDestroySampler(m_device->device(), sampler, NULL);
10368 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10369 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010370}
10371
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010372TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10373 // Create layout w/ empty binding and attempt to update it
10374 VkResult err;
10375
Tony Barbour1fa09702017-03-16 12:09:08 -060010376 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010377
10378 VkDescriptorPoolSize ds_type_count = {};
10379 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10380 ds_type_count.descriptorCount = 1;
10381
10382 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10383 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10384 ds_pool_ci.pNext = NULL;
10385 ds_pool_ci.maxSets = 1;
10386 ds_pool_ci.poolSizeCount = 1;
10387 ds_pool_ci.pPoolSizes = &ds_type_count;
10388
10389 VkDescriptorPool ds_pool;
10390 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10391 ASSERT_VK_SUCCESS(err);
10392
10393 VkDescriptorSetLayoutBinding dsl_binding = {};
10394 dsl_binding.binding = 0;
10395 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10396 dsl_binding.descriptorCount = 0;
10397 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10398 dsl_binding.pImmutableSamplers = NULL;
10399
10400 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10401 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10402 ds_layout_ci.pNext = NULL;
10403 ds_layout_ci.bindingCount = 1;
10404 ds_layout_ci.pBindings = &dsl_binding;
10405 VkDescriptorSetLayout ds_layout;
10406 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10407 ASSERT_VK_SUCCESS(err);
10408
10409 VkDescriptorSet descriptor_set;
10410 VkDescriptorSetAllocateInfo alloc_info = {};
10411 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10412 alloc_info.descriptorSetCount = 1;
10413 alloc_info.descriptorPool = ds_pool;
10414 alloc_info.pSetLayouts = &ds_layout;
10415 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10416 ASSERT_VK_SUCCESS(err);
10417
10418 VkSamplerCreateInfo sampler_ci = {};
10419 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10420 sampler_ci.magFilter = VK_FILTER_NEAREST;
10421 sampler_ci.minFilter = VK_FILTER_NEAREST;
10422 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10423 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10424 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10425 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10426 sampler_ci.mipLodBias = 1.0;
10427 sampler_ci.maxAnisotropy = 1;
10428 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10429 sampler_ci.minLod = 1.0;
10430 sampler_ci.maxLod = 1.0;
10431 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10432
10433 VkSampler sampler;
10434 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10435 ASSERT_VK_SUCCESS(err);
10436
10437 VkDescriptorImageInfo info = {};
10438 info.sampler = sampler;
10439
10440 VkWriteDescriptorSet descriptor_write;
10441 memset(&descriptor_write, 0, sizeof(descriptor_write));
10442 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10443 descriptor_write.dstSet = descriptor_set;
10444 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010445 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010446 // This is the wrong type, but empty binding error will be flagged first
10447 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10448 descriptor_write.pImageInfo = &info;
10449
10450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10451 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10452 m_errorMonitor->VerifyFound();
10453
10454 vkDestroySampler(m_device->device(), sampler, NULL);
10455 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10456 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10457}
10458
Karl Schultz6addd812016-02-02 17:17:23 -070010459TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10460 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10461 // types
10462 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010463
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010464 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 -060010465
Tony Barbour1fa09702017-03-16 12:09:08 -060010466 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010467
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010468 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010469 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10470 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010471
10472 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010473 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10474 ds_pool_ci.pNext = NULL;
10475 ds_pool_ci.maxSets = 1;
10476 ds_pool_ci.poolSizeCount = 1;
10477 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010478
Tobin Ehlis3b780662015-05-28 12:11:26 -060010479 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010480 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010481 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010482 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010483 dsl_binding.binding = 0;
10484 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10485 dsl_binding.descriptorCount = 1;
10486 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10487 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010488
Tony Barboureb254902015-07-15 12:50:33 -060010489 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010490 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10491 ds_layout_ci.pNext = NULL;
10492 ds_layout_ci.bindingCount = 1;
10493 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010494
Tobin Ehlis3b780662015-05-28 12:11:26 -060010495 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010496 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010497 ASSERT_VK_SUCCESS(err);
10498
10499 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010500 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010501 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010502 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010503 alloc_info.descriptorPool = ds_pool;
10504 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010505 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010506 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010507
Tony Barboureb254902015-07-15 12:50:33 -060010508 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010509 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10510 sampler_ci.pNext = NULL;
10511 sampler_ci.magFilter = VK_FILTER_NEAREST;
10512 sampler_ci.minFilter = VK_FILTER_NEAREST;
10513 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10514 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10515 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10516 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10517 sampler_ci.mipLodBias = 1.0;
10518 sampler_ci.anisotropyEnable = VK_FALSE;
10519 sampler_ci.maxAnisotropy = 1;
10520 sampler_ci.compareEnable = VK_FALSE;
10521 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10522 sampler_ci.minLod = 1.0;
10523 sampler_ci.maxLod = 1.0;
10524 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10525 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010526 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010527 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010528 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010529
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010530 VkDescriptorImageInfo info = {};
10531 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010532
10533 VkWriteDescriptorSet descriptor_write;
10534 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010535 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010536 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010537 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010538 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010539 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010540 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010541
10542 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10543
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010544 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010545
Chia-I Wuf7458c52015-10-26 21:10:41 +080010546 vkDestroySampler(m_device->device(), sampler, NULL);
10547 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10548 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010549}
10550
Karl Schultz6addd812016-02-02 17:17:23 -070010551TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010552 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010553 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010554
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010556
Tony Barbour1fa09702017-03-16 12:09:08 -060010557 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010558 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10559 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010560 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010561 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10562 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010563
10564 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010565 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10566 ds_pool_ci.pNext = NULL;
10567 ds_pool_ci.maxSets = 1;
10568 ds_pool_ci.poolSizeCount = 1;
10569 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010570
10571 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010572 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010573 ASSERT_VK_SUCCESS(err);
10574
10575 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010576 dsl_binding.binding = 0;
10577 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10578 dsl_binding.descriptorCount = 1;
10579 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10580 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010581
10582 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010583 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10584 ds_layout_ci.pNext = NULL;
10585 ds_layout_ci.bindingCount = 1;
10586 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010587 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010588 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010589 ASSERT_VK_SUCCESS(err);
10590
10591 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010592 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010593 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010594 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010595 alloc_info.descriptorPool = ds_pool;
10596 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010597 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010598 ASSERT_VK_SUCCESS(err);
10599
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010600 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010601
10602 VkDescriptorImageInfo descriptor_info;
10603 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10604 descriptor_info.sampler = sampler;
10605
10606 VkWriteDescriptorSet descriptor_write;
10607 memset(&descriptor_write, 0, sizeof(descriptor_write));
10608 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010609 descriptor_write.dstSet = descriptorSet;
10610 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010611 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010612 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10613 descriptor_write.pImageInfo = &descriptor_info;
10614
10615 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10616
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010617 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010618
Chia-I Wuf7458c52015-10-26 21:10:41 +080010619 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10620 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010621}
10622
Karl Schultz6addd812016-02-02 17:17:23 -070010623TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10624 // Create a single combined Image/Sampler descriptor and send it an invalid
10625 // imageView
10626 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010627
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010629
Tony Barbour1fa09702017-03-16 12:09:08 -060010630 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010631 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010632 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10633 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010634
10635 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010636 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10637 ds_pool_ci.pNext = NULL;
10638 ds_pool_ci.maxSets = 1;
10639 ds_pool_ci.poolSizeCount = 1;
10640 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010641
10642 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010643 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010644 ASSERT_VK_SUCCESS(err);
10645
10646 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010647 dsl_binding.binding = 0;
10648 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10649 dsl_binding.descriptorCount = 1;
10650 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10651 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010652
10653 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010654 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10655 ds_layout_ci.pNext = NULL;
10656 ds_layout_ci.bindingCount = 1;
10657 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010658 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010659 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010660 ASSERT_VK_SUCCESS(err);
10661
10662 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010663 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010664 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010665 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010666 alloc_info.descriptorPool = ds_pool;
10667 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010668 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010669 ASSERT_VK_SUCCESS(err);
10670
10671 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010672 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10673 sampler_ci.pNext = NULL;
10674 sampler_ci.magFilter = VK_FILTER_NEAREST;
10675 sampler_ci.minFilter = VK_FILTER_NEAREST;
10676 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10677 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10678 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10679 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10680 sampler_ci.mipLodBias = 1.0;
10681 sampler_ci.anisotropyEnable = VK_FALSE;
10682 sampler_ci.maxAnisotropy = 1;
10683 sampler_ci.compareEnable = VK_FALSE;
10684 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10685 sampler_ci.minLod = 1.0;
10686 sampler_ci.maxLod = 1.0;
10687 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10688 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010689
10690 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010691 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010692 ASSERT_VK_SUCCESS(err);
10693
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010694 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010695
10696 VkDescriptorImageInfo descriptor_info;
10697 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10698 descriptor_info.sampler = sampler;
10699 descriptor_info.imageView = view;
10700
10701 VkWriteDescriptorSet descriptor_write;
10702 memset(&descriptor_write, 0, sizeof(descriptor_write));
10703 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010704 descriptor_write.dstSet = descriptorSet;
10705 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010706 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010707 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10708 descriptor_write.pImageInfo = &descriptor_info;
10709
10710 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10711
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010712 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010713
Chia-I Wuf7458c52015-10-26 21:10:41 +080010714 vkDestroySampler(m_device->device(), sampler, NULL);
10715 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10716 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010717}
10718
Karl Schultz6addd812016-02-02 17:17:23 -070010719TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10720 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10721 // into the other
10722 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010723
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10725 " binding #1 with type "
10726 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10727 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010728
Tony Barbour1fa09702017-03-16 12:09:08 -060010729 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010730 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010731 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010732 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10733 ds_type_count[0].descriptorCount = 1;
10734 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10735 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010736
10737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10739 ds_pool_ci.pNext = NULL;
10740 ds_pool_ci.maxSets = 1;
10741 ds_pool_ci.poolSizeCount = 2;
10742 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010743
10744 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010745 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010746 ASSERT_VK_SUCCESS(err);
10747 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010748 dsl_binding[0].binding = 0;
10749 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10750 dsl_binding[0].descriptorCount = 1;
10751 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10752 dsl_binding[0].pImmutableSamplers = NULL;
10753 dsl_binding[1].binding = 1;
10754 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10755 dsl_binding[1].descriptorCount = 1;
10756 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10757 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010758
10759 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010760 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10761 ds_layout_ci.pNext = NULL;
10762 ds_layout_ci.bindingCount = 2;
10763 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010764
10765 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010766 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010767 ASSERT_VK_SUCCESS(err);
10768
10769 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010770 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010771 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010772 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010773 alloc_info.descriptorPool = ds_pool;
10774 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010775 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010776 ASSERT_VK_SUCCESS(err);
10777
10778 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010779 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10780 sampler_ci.pNext = NULL;
10781 sampler_ci.magFilter = VK_FILTER_NEAREST;
10782 sampler_ci.minFilter = VK_FILTER_NEAREST;
10783 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10784 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10785 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10786 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10787 sampler_ci.mipLodBias = 1.0;
10788 sampler_ci.anisotropyEnable = VK_FALSE;
10789 sampler_ci.maxAnisotropy = 1;
10790 sampler_ci.compareEnable = VK_FALSE;
10791 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10792 sampler_ci.minLod = 1.0;
10793 sampler_ci.maxLod = 1.0;
10794 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10795 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010796
10797 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010798 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010799 ASSERT_VK_SUCCESS(err);
10800
10801 VkDescriptorImageInfo info = {};
10802 info.sampler = sampler;
10803
10804 VkWriteDescriptorSet descriptor_write;
10805 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10806 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010807 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010808 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010809 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010810 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10811 descriptor_write.pImageInfo = &info;
10812 // This write update should succeed
10813 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10814 // Now perform a copy update that fails due to type mismatch
10815 VkCopyDescriptorSet copy_ds_update;
10816 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10817 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10818 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010819 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010820 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010821 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10822 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010823 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10824
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010825 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010826 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010827 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 -060010828 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10829 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10830 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010831 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010832 copy_ds_update.dstSet = descriptorSet;
10833 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010834 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010835 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10836
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010837 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010838
Tobin Ehlis04356f92015-10-27 16:35:27 -060010839 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10841 " binding#1 with offset index of 1 plus "
10842 "update array offset of 0 and update of "
10843 "5 descriptors oversteps total number "
10844 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010845
Tobin Ehlis04356f92015-10-27 16:35:27 -060010846 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10847 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10848 copy_ds_update.srcSet = descriptorSet;
10849 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010850 copy_ds_update.dstSet = descriptorSet;
10851 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010852 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010853 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10854
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010855 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010856
Chia-I Wuf7458c52015-10-26 21:10:41 +080010857 vkDestroySampler(m_device->device(), sampler, NULL);
10858 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10859 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010860}
10861
Karl Schultz6addd812016-02-02 17:17:23 -070010862TEST_F(VkLayerTest, NumSamplesMismatch) {
10863 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10864 // sampleCount
10865 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010866
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010868
Tony Barbour1fa09702017-03-16 12:09:08 -060010869 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010871 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010872 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010873 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010874
10875 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010876 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10877 ds_pool_ci.pNext = NULL;
10878 ds_pool_ci.maxSets = 1;
10879 ds_pool_ci.poolSizeCount = 1;
10880 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010881
Tobin Ehlis3b780662015-05-28 12:11:26 -060010882 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010883 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010884 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010885
Tony Barboureb254902015-07-15 12:50:33 -060010886 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010887 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010888 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010889 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010890 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10891 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010892
Tony Barboureb254902015-07-15 12:50:33 -060010893 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10894 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10895 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010896 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010897 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010898
Tobin Ehlis3b780662015-05-28 12:11:26 -060010899 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010900 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010901 ASSERT_VK_SUCCESS(err);
10902
10903 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010904 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010905 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010906 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010907 alloc_info.descriptorPool = ds_pool;
10908 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010909 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010910 ASSERT_VK_SUCCESS(err);
10911
Tony Barboureb254902015-07-15 12:50:33 -060010912 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010913 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010914 pipe_ms_state_ci.pNext = NULL;
10915 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10916 pipe_ms_state_ci.sampleShadingEnable = 0;
10917 pipe_ms_state_ci.minSampleShading = 1.0;
10918 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010919
Tony Barboureb254902015-07-15 12:50:33 -060010920 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010921 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10922 pipeline_layout_ci.pNext = NULL;
10923 pipeline_layout_ci.setLayoutCount = 1;
10924 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010925
10926 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010927 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010928 ASSERT_VK_SUCCESS(err);
10929
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010930 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010931 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 -060010932 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010933 VkPipelineObj pipe(m_device);
10934 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010935 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010936 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010937 pipe.SetMSAA(&pipe_ms_state_ci);
10938 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010939
Tony Barbour552f6c02016-12-21 14:34:07 -070010940 m_commandBuffer->BeginCommandBuffer();
10941 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010942 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010943
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010944 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10945 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10946 VkRect2D scissor = {{0, 0}, {16, 16}};
10947 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10948
Mark Young29927482016-05-04 14:38:51 -060010949 // Render triangle (the error should trigger on the attempt to draw).
10950 Draw(3, 1, 0, 0);
10951
10952 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010953 m_commandBuffer->EndRenderPass();
10954 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010955
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010956 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010957
Chia-I Wuf7458c52015-10-26 21:10:41 +080010958 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10959 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10960 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010961}
Mark Young29927482016-05-04 14:38:51 -060010962
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010963TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010964 TEST_DESCRIPTION(
10965 "Hit RenderPass incompatible cases. "
10966 "Initial case is drawing with an active renderpass that's "
10967 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010968 VkResult err;
10969
Tony Barbour1fa09702017-03-16 12:09:08 -060010970 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10972
10973 VkDescriptorSetLayoutBinding dsl_binding = {};
10974 dsl_binding.binding = 0;
10975 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10976 dsl_binding.descriptorCount = 1;
10977 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10978 dsl_binding.pImmutableSamplers = NULL;
10979
10980 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10981 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10982 ds_layout_ci.pNext = NULL;
10983 ds_layout_ci.bindingCount = 1;
10984 ds_layout_ci.pBindings = &dsl_binding;
10985
10986 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010987 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010988 ASSERT_VK_SUCCESS(err);
10989
10990 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10991 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10992 pipeline_layout_ci.pNext = NULL;
10993 pipeline_layout_ci.setLayoutCount = 1;
10994 pipeline_layout_ci.pSetLayouts = &ds_layout;
10995
10996 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010997 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010998 ASSERT_VK_SUCCESS(err);
10999
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011000 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011001 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 -060011002 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011003 // Create a renderpass that will be incompatible with default renderpass
11004 VkAttachmentReference attach = {};
11005 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11006 VkAttachmentReference color_att = {};
11007 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11008 VkSubpassDescription subpass = {};
11009 subpass.inputAttachmentCount = 1;
11010 subpass.pInputAttachments = &attach;
11011 subpass.colorAttachmentCount = 1;
11012 subpass.pColorAttachments = &color_att;
11013 VkRenderPassCreateInfo rpci = {};
11014 rpci.subpassCount = 1;
11015 rpci.pSubpasses = &subpass;
11016 rpci.attachmentCount = 1;
11017 VkAttachmentDescription attach_desc = {};
11018 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011019 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11020 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011021 rpci.pAttachments = &attach_desc;
11022 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11023 VkRenderPass rp;
11024 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11025 VkPipelineObj pipe(m_device);
11026 pipe.AddShader(&vs);
11027 pipe.AddShader(&fs);
11028 pipe.AddColorAttachment();
11029 VkViewport view_port = {};
11030 m_viewports.push_back(view_port);
11031 pipe.SetViewport(m_viewports);
11032 VkRect2D rect = {};
11033 m_scissors.push_back(rect);
11034 pipe.SetScissor(m_scissors);
11035 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11036
11037 VkCommandBufferInheritanceInfo cbii = {};
11038 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11039 cbii.renderPass = rp;
11040 cbii.subpass = 0;
11041 VkCommandBufferBeginInfo cbbi = {};
11042 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11043 cbbi.pInheritanceInfo = &cbii;
11044 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11045 VkRenderPassBeginInfo rpbi = {};
11046 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11047 rpbi.framebuffer = m_framebuffer;
11048 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011049 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11050 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011051
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011052 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011053 // Render triangle (the error should trigger on the attempt to draw).
11054 Draw(3, 1, 0, 0);
11055
11056 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011057 m_commandBuffer->EndRenderPass();
11058 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011059
11060 m_errorMonitor->VerifyFound();
11061
11062 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11063 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11064 vkDestroyRenderPass(m_device->device(), rp, NULL);
11065}
11066
Mark Youngc89c6312016-03-31 16:03:20 -060011067TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11068 // Create Pipeline where the number of blend attachments doesn't match the
11069 // number of color attachments. In this case, we don't add any color
11070 // blend attachments even though we have a color attachment.
11071 VkResult err;
11072
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011074
Tony Barbour1fa09702017-03-16 12:09:08 -060011075 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11077 VkDescriptorPoolSize ds_type_count = {};
11078 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11079 ds_type_count.descriptorCount = 1;
11080
11081 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11082 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11083 ds_pool_ci.pNext = NULL;
11084 ds_pool_ci.maxSets = 1;
11085 ds_pool_ci.poolSizeCount = 1;
11086 ds_pool_ci.pPoolSizes = &ds_type_count;
11087
11088 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011089 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011090 ASSERT_VK_SUCCESS(err);
11091
11092 VkDescriptorSetLayoutBinding dsl_binding = {};
11093 dsl_binding.binding = 0;
11094 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11095 dsl_binding.descriptorCount = 1;
11096 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11097 dsl_binding.pImmutableSamplers = NULL;
11098
11099 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11100 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11101 ds_layout_ci.pNext = NULL;
11102 ds_layout_ci.bindingCount = 1;
11103 ds_layout_ci.pBindings = &dsl_binding;
11104
11105 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011106 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011107 ASSERT_VK_SUCCESS(err);
11108
11109 VkDescriptorSet descriptorSet;
11110 VkDescriptorSetAllocateInfo alloc_info = {};
11111 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11112 alloc_info.descriptorSetCount = 1;
11113 alloc_info.descriptorPool = ds_pool;
11114 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011115 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011116 ASSERT_VK_SUCCESS(err);
11117
11118 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011119 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011120 pipe_ms_state_ci.pNext = NULL;
11121 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11122 pipe_ms_state_ci.sampleShadingEnable = 0;
11123 pipe_ms_state_ci.minSampleShading = 1.0;
11124 pipe_ms_state_ci.pSampleMask = NULL;
11125
11126 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11127 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11128 pipeline_layout_ci.pNext = NULL;
11129 pipeline_layout_ci.setLayoutCount = 1;
11130 pipeline_layout_ci.pSetLayouts = &ds_layout;
11131
11132 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011133 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011134 ASSERT_VK_SUCCESS(err);
11135
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011136 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011137 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 -060011138 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011139 VkPipelineObj pipe(m_device);
11140 pipe.AddShader(&vs);
11141 pipe.AddShader(&fs);
11142 pipe.SetMSAA(&pipe_ms_state_ci);
11143 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011144 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011145
11146 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11147 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11149}
Mark Young29927482016-05-04 14:38:51 -060011150
Mark Muellerd4914412016-06-13 17:52:06 -060011151TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011152 TEST_DESCRIPTION(
11153 "Points to a wrong colorAttachment index in a VkClearAttachment "
11154 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011155 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011157
11158 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11159 m_errorMonitor->VerifyFound();
11160}
11161
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011162TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011163 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11164 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011165
Tony Barbour1fa09702017-03-16 12:09:08 -060011166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011167 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011168
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011169 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011170 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11171 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011172
11173 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011174 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11175 ds_pool_ci.pNext = NULL;
11176 ds_pool_ci.maxSets = 1;
11177 ds_pool_ci.poolSizeCount = 1;
11178 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011179
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011180 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011181 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011182 ASSERT_VK_SUCCESS(err);
11183
Tony Barboureb254902015-07-15 12:50:33 -060011184 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011185 dsl_binding.binding = 0;
11186 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11187 dsl_binding.descriptorCount = 1;
11188 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11189 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011190
Tony Barboureb254902015-07-15 12:50:33 -060011191 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011192 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11193 ds_layout_ci.pNext = NULL;
11194 ds_layout_ci.bindingCount = 1;
11195 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011196
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011197 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011198 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011199 ASSERT_VK_SUCCESS(err);
11200
11201 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011202 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011203 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011204 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011205 alloc_info.descriptorPool = ds_pool;
11206 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011207 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011208 ASSERT_VK_SUCCESS(err);
11209
Tony Barboureb254902015-07-15 12:50:33 -060011210 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011211 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011212 pipe_ms_state_ci.pNext = NULL;
11213 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11214 pipe_ms_state_ci.sampleShadingEnable = 0;
11215 pipe_ms_state_ci.minSampleShading = 1.0;
11216 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011217
Tony Barboureb254902015-07-15 12:50:33 -060011218 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011219 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11220 pipeline_layout_ci.pNext = NULL;
11221 pipeline_layout_ci.setLayoutCount = 1;
11222 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011223
11224 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011225 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011226 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011227
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011228 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011229 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011230 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011231 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011232
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011233 VkPipelineObj pipe(m_device);
11234 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011235 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011236 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011237 pipe.SetMSAA(&pipe_ms_state_ci);
11238 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011239
Tony Barbour552f6c02016-12-21 14:34:07 -070011240 m_commandBuffer->BeginCommandBuffer();
11241 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011242
Karl Schultz6addd812016-02-02 17:17:23 -070011243 // Main thing we care about for this test is that the VkImage obj we're
11244 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011245 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011246 VkClearAttachment color_attachment;
11247 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11248 color_attachment.clearValue.color.float32[0] = 1.0;
11249 color_attachment.clearValue.color.float32[1] = 1.0;
11250 color_attachment.clearValue.color.float32[2] = 1.0;
11251 color_attachment.clearValue.color.float32[3] = 1.0;
11252 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011253 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011254
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011255 // Call for full-sized FB Color attachment prior to issuing a Draw
11256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011257 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011258 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011259 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011260
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011261 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11262 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11264 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11265 m_errorMonitor->VerifyFound();
11266
11267 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11268 clear_rect.layerCount = 2;
11269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11270 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011271 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011272
Chia-I Wuf7458c52015-10-26 21:10:41 +080011273 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011276}
11277
Karl Schultz6addd812016-02-02 17:17:23 -070011278TEST_F(VkLayerTest, VtxBufferBadIndex) {
11279 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011280
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11282 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011283
Tony Barbour1fa09702017-03-16 12:09:08 -060011284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011285 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011287
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011288 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011289 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11290 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011291
11292 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011293 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11294 ds_pool_ci.pNext = NULL;
11295 ds_pool_ci.maxSets = 1;
11296 ds_pool_ci.poolSizeCount = 1;
11297 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011298
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011299 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011300 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011301 ASSERT_VK_SUCCESS(err);
11302
Tony Barboureb254902015-07-15 12:50:33 -060011303 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011304 dsl_binding.binding = 0;
11305 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11306 dsl_binding.descriptorCount = 1;
11307 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11308 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011309
Tony Barboureb254902015-07-15 12:50:33 -060011310 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011311 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11312 ds_layout_ci.pNext = NULL;
11313 ds_layout_ci.bindingCount = 1;
11314 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011315
Tobin Ehlis502480b2015-06-24 15:53:07 -060011316 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011317 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011318 ASSERT_VK_SUCCESS(err);
11319
11320 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011321 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011322 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011323 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011324 alloc_info.descriptorPool = ds_pool;
11325 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011326 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011327 ASSERT_VK_SUCCESS(err);
11328
Tony Barboureb254902015-07-15 12:50:33 -060011329 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011330 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011331 pipe_ms_state_ci.pNext = NULL;
11332 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11333 pipe_ms_state_ci.sampleShadingEnable = 0;
11334 pipe_ms_state_ci.minSampleShading = 1.0;
11335 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011336
Tony Barboureb254902015-07-15 12:50:33 -060011337 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011338 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11339 pipeline_layout_ci.pNext = NULL;
11340 pipeline_layout_ci.setLayoutCount = 1;
11341 pipeline_layout_ci.pSetLayouts = &ds_layout;
11342 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011343
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011344 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011345 ASSERT_VK_SUCCESS(err);
11346
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011347 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011348 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 -060011349 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011350 VkPipelineObj pipe(m_device);
11351 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011352 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011353 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011354 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011355 pipe.SetViewport(m_viewports);
11356 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011357 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011358
Tony Barbour552f6c02016-12-21 14:34:07 -070011359 m_commandBuffer->BeginCommandBuffer();
11360 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011361 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011362 // Don't care about actual data, just need to get to draw to flag error
11363 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011364 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011365 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011366 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011367
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011368 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011369
Chia-I Wuf7458c52015-10-26 21:10:41 +080011370 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11371 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11372 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011373}
Mark Muellerdfe37552016-07-07 14:47:42 -060011374
Mark Mueller2ee294f2016-08-04 12:59:48 -060011375TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011376 TEST_DESCRIPTION(
11377 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11378 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011380
Mark Mueller880fce52016-08-17 15:23:23 -060011381 // The following test fails with recent NVidia drivers.
11382 // By the time core_validation is reached, the NVidia
11383 // driver has sanitized the invalid condition and core_validation
11384 // is not introduced to the failure condition. This is not the case
11385 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011386 // uint32_t count = static_cast<uint32_t>(~0);
11387 // VkPhysicalDevice physical_device;
11388 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11389 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011390
Mark Mueller2ee294f2016-08-04 12:59:48 -060011391 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011392 VkDeviceQueueCreateInfo queue_create_info = {};
11393 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11394 queue_create_info.queueCount = 1;
11395 queue_create_info.pQueuePriorities = &queue_priority;
11396 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11397
11398 VkPhysicalDeviceFeatures features = m_device->phy().features();
11399 VkDevice testDevice;
11400 VkDeviceCreateInfo device_create_info = {};
11401 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11402 device_create_info.queueCreateInfoCount = 1;
11403 device_create_info.pQueueCreateInfos = &queue_create_info;
11404 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011405
11406 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11407 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011408 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11409 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11410 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011411 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11412 m_errorMonitor->VerifyFound();
11413
11414 queue_create_info.queueFamilyIndex = 1;
11415
11416 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11417 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11418 for (unsigned i = 0; i < feature_count; i++) {
11419 if (VK_FALSE == feature_array[i]) {
11420 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011421 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11423 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011424 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11425 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11426 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11428 "You requested features that are unavailable on this device. You should first "
11429 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011430 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11431 m_errorMonitor->VerifyFound();
11432 break;
11433 }
11434 }
11435}
11436
Tobin Ehlis16edf082016-11-21 12:33:49 -070011437TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11438 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11439
Tony Barbour1fa09702017-03-16 12:09:08 -060011440 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011441
11442 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11443 std::vector<VkDeviceQueueCreateInfo> queue_info;
11444 queue_info.reserve(queue_props.size());
11445 std::vector<std::vector<float>> queue_priorities;
11446 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11447 VkDeviceQueueCreateInfo qi{};
11448 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11449 qi.queueFamilyIndex = i;
11450 qi.queueCount = queue_props[i].queueCount;
11451 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11452 qi.pQueuePriorities = queue_priorities[i].data();
11453 queue_info.push_back(qi);
11454 }
11455
11456 std::vector<const char *> device_extension_names;
11457
11458 VkDevice local_device;
11459 VkDeviceCreateInfo device_create_info = {};
11460 auto features = m_device->phy().features();
11461 // Intentionally disable pipeline stats
11462 features.pipelineStatisticsQuery = VK_FALSE;
11463 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11464 device_create_info.pNext = NULL;
11465 device_create_info.queueCreateInfoCount = queue_info.size();
11466 device_create_info.pQueueCreateInfos = queue_info.data();
11467 device_create_info.enabledLayerCount = 0;
11468 device_create_info.ppEnabledLayerNames = NULL;
11469 device_create_info.pEnabledFeatures = &features;
11470 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11471 ASSERT_VK_SUCCESS(err);
11472
11473 VkQueryPoolCreateInfo qpci{};
11474 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11475 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11476 qpci.queryCount = 1;
11477 VkQueryPool query_pool;
11478
11479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11480 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11481 m_errorMonitor->VerifyFound();
11482
11483 vkDestroyDevice(local_device, nullptr);
11484}
11485
Mark Mueller2ee294f2016-08-04 12:59:48 -060011486TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011487 TEST_DESCRIPTION(
11488 "Use an invalid queue index in a vkCmdWaitEvents call."
11489 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011490
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011491 const char *invalid_queue_index =
11492 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11493 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11494 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011495
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011496 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011497
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011499
Tony Barbour1fa09702017-03-16 12:09:08 -060011500 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011501
11502 VkEvent event;
11503 VkEventCreateInfo event_create_info{};
11504 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11505 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11506
Mark Mueller2ee294f2016-08-04 12:59:48 -060011507 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011508 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011509
Tony Barbour552f6c02016-12-21 14:34:07 -070011510 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011511
11512 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011513 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011514 ASSERT_TRUE(image.initialized());
11515 VkImageMemoryBarrier img_barrier = {};
11516 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11517 img_barrier.pNext = NULL;
11518 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11519 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11520 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11521 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11522 img_barrier.image = image.handle();
11523 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011524
11525 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11526 // that layer validation catches the case when it is not.
11527 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011528 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11529 img_barrier.subresourceRange.baseArrayLayer = 0;
11530 img_barrier.subresourceRange.baseMipLevel = 0;
11531 img_barrier.subresourceRange.layerCount = 1;
11532 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011533 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11534 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011535 m_errorMonitor->VerifyFound();
11536
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011538
11539 VkQueryPool query_pool;
11540 VkQueryPoolCreateInfo query_pool_create_info = {};
11541 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11542 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11543 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011544 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011545
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011546 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011547 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11548
11549 vkEndCommandBuffer(m_commandBuffer->handle());
11550 m_errorMonitor->VerifyFound();
11551
11552 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11553 vkDestroyEvent(m_device->device(), event, nullptr);
11554}
11555
Mark Muellerdfe37552016-07-07 14:47:42 -060011556TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011557 TEST_DESCRIPTION(
11558 "Submit a command buffer using deleted vertex buffer, "
11559 "delete a buffer twice, use an invalid offset for each "
11560 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011561
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011562 const char *deleted_buffer_in_command_buffer =
11563 "Cannot submit cmd buffer "
11564 "using deleted buffer ";
11565 const char *invalid_offset_message =
11566 "vkBindBufferMemory(): "
11567 "memoryOffset is 0x";
11568 const char *invalid_storage_buffer_offset_message =
11569 "vkBindBufferMemory(): "
11570 "storage memoryOffset "
11571 "is 0x";
11572 const char *invalid_texel_buffer_offset_message =
11573 "vkBindBufferMemory(): "
11574 "texel memoryOffset "
11575 "is 0x";
11576 const char *invalid_uniform_buffer_offset_message =
11577 "vkBindBufferMemory(): "
11578 "uniform memoryOffset "
11579 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011580
Tony Barbour1fa09702017-03-16 12:09:08 -060011581 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011582 ASSERT_NO_FATAL_FAILURE(InitViewport());
11583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11584
11585 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011586 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011587 pipe_ms_state_ci.pNext = NULL;
11588 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11589 pipe_ms_state_ci.sampleShadingEnable = 0;
11590 pipe_ms_state_ci.minSampleShading = 1.0;
11591 pipe_ms_state_ci.pSampleMask = nullptr;
11592
11593 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11594 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11595 VkPipelineLayout pipeline_layout;
11596
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011597 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011598 ASSERT_VK_SUCCESS(err);
11599
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011600 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11601 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011602 VkPipelineObj pipe(m_device);
11603 pipe.AddShader(&vs);
11604 pipe.AddShader(&fs);
11605 pipe.AddColorAttachment();
11606 pipe.SetMSAA(&pipe_ms_state_ci);
11607 pipe.SetViewport(m_viewports);
11608 pipe.SetScissor(m_scissors);
11609 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11610
Tony Barbour552f6c02016-12-21 14:34:07 -070011611 m_commandBuffer->BeginCommandBuffer();
11612 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011613 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011614
11615 {
11616 // Create and bind a vertex buffer in a reduced scope, which will cause
11617 // it to be deleted upon leaving this scope
11618 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011619 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011620 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11621 draw_verticies.AddVertexInputToPipe(pipe);
11622 }
11623
11624 Draw(1, 0, 0, 0);
11625
Tony Barbour552f6c02016-12-21 14:34:07 -070011626 m_commandBuffer->EndRenderPass();
11627 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011628
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011630 QueueCommandBuffer(false);
11631 m_errorMonitor->VerifyFound();
11632
11633 {
11634 // Create and bind a vertex buffer in a reduced scope, and delete it
11635 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011636 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011638 buffer_test.TestDoubleDestroy();
11639 }
11640 m_errorMonitor->VerifyFound();
11641
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011642 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011643 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011644 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011646 m_errorMonitor->SetUnexpectedError(
11647 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11648 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011649 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11650 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011651 m_errorMonitor->VerifyFound();
11652 }
11653
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011654 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11655 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011656 // Create and bind a memory buffer with an invalid offset again,
11657 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011659 m_errorMonitor->SetUnexpectedError(
11660 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11661 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011662 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11663 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011664 m_errorMonitor->VerifyFound();
11665 }
11666
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011667 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011668 // Create and bind a memory buffer with an invalid offset again, but
11669 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011671 m_errorMonitor->SetUnexpectedError(
11672 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11673 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11675 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011676 m_errorMonitor->VerifyFound();
11677 }
11678
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011679 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011680 // Create and bind a memory buffer with an invalid offset again, but
11681 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011683 m_errorMonitor->SetUnexpectedError(
11684 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11685 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011686 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11687 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011688 m_errorMonitor->VerifyFound();
11689 }
11690
11691 {
11692 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011694 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11695 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011696 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11697 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011698 m_errorMonitor->VerifyFound();
11699 }
11700
11701 {
11702 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011704 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11705 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011706 }
11707 m_errorMonitor->VerifyFound();
11708
11709 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11710}
11711
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011712// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11713TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011714 TEST_DESCRIPTION(
11715 "Hit all possible validation checks associated with the "
11716 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11717 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011718 // 3 in ValidateCmdBufImageLayouts
11719 // * -1 Attempt to submit cmd buf w/ deleted image
11720 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11721 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011722
Tony Barbour1fa09702017-03-16 12:09:08 -060011723 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060011724 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070011725 if (!depth_format) {
11726 printf(" No Depth + Stencil format found. Skipped.\n");
11727 return;
11728 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011729 // Create src & dst images to use for copy operations
11730 VkImage src_image;
11731 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011732 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011733
11734 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11735 const int32_t tex_width = 32;
11736 const int32_t tex_height = 32;
11737
11738 VkImageCreateInfo image_create_info = {};
11739 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11740 image_create_info.pNext = NULL;
11741 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11742 image_create_info.format = tex_format;
11743 image_create_info.extent.width = tex_width;
11744 image_create_info.extent.height = tex_height;
11745 image_create_info.extent.depth = 1;
11746 image_create_info.mipLevels = 1;
11747 image_create_info.arrayLayers = 4;
11748 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11749 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11750 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011751 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011752 image_create_info.flags = 0;
11753
11754 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11755 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011756 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011757 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11758 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011759 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11760 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11761 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11762 ASSERT_VK_SUCCESS(err);
11763
11764 // Allocate memory
11765 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011766 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011767 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011768 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11769 mem_alloc.pNext = NULL;
11770 mem_alloc.allocationSize = 0;
11771 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011772
11773 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011774 mem_alloc.allocationSize = img_mem_reqs.size;
11775 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011776 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011777 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011778 ASSERT_VK_SUCCESS(err);
11779
11780 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011781 mem_alloc.allocationSize = img_mem_reqs.size;
11782 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011783 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011784 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011785 ASSERT_VK_SUCCESS(err);
11786
11787 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011788 mem_alloc.allocationSize = img_mem_reqs.size;
11789 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011790 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011791 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011792 ASSERT_VK_SUCCESS(err);
11793
11794 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11795 ASSERT_VK_SUCCESS(err);
11796 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11797 ASSERT_VK_SUCCESS(err);
11798 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11799 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011800
Tony Barbour552f6c02016-12-21 14:34:07 -070011801 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011802 VkImageCopy copy_region;
11803 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11804 copy_region.srcSubresource.mipLevel = 0;
11805 copy_region.srcSubresource.baseArrayLayer = 0;
11806 copy_region.srcSubresource.layerCount = 1;
11807 copy_region.srcOffset.x = 0;
11808 copy_region.srcOffset.y = 0;
11809 copy_region.srcOffset.z = 0;
11810 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11811 copy_region.dstSubresource.mipLevel = 0;
11812 copy_region.dstSubresource.baseArrayLayer = 0;
11813 copy_region.dstSubresource.layerCount = 1;
11814 copy_region.dstOffset.x = 0;
11815 copy_region.dstOffset.y = 0;
11816 copy_region.dstOffset.z = 0;
11817 copy_region.extent.width = 1;
11818 copy_region.extent.height = 1;
11819 copy_region.extent.depth = 1;
11820
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11822 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11823 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011824
Cort530cf382016-12-08 09:59:47 -080011825 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 -060011826 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011827 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11828 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011829 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11830 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011831 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 -060011832 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011834 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11835 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011836 m_errorMonitor->SetUnexpectedError(
11837 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011838 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 -060011839 m_errorMonitor->VerifyFound();
11840 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011842 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011843 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011844 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011845 "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 -080011846 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 -060011847 m_errorMonitor->VerifyFound();
11848 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11850 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11851 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011852 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 -060011853 m_errorMonitor->VerifyFound();
11854 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011856 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011857 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011858 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011859 "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 -080011860 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 -060011861 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011863 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11864 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011865 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011866 "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 -080011867 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 -060011868 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011869
Cort3b021012016-12-07 12:00:57 -080011870 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11871 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11872 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11873 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11874 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11875 transfer_dst_image_barrier[0].srcAccessMask = 0;
11876 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11877 transfer_dst_image_barrier[0].image = dst_image;
11878 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11879 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11880 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11881 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11882 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11883 transfer_dst_image_barrier[0].image = depth_image;
11884 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11885 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11886 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11887
11888 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011889 VkClearColorValue color_clear_value = {};
11890 VkImageSubresourceRange clear_range;
11891 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11892 clear_range.baseMipLevel = 0;
11893 clear_range.baseArrayLayer = 0;
11894 clear_range.layerCount = 1;
11895 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011896
Cort3b021012016-12-07 12:00:57 -080011897 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11898 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011901 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011902 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011903 // Fail due to provided layout not matching actual current layout for color clear.
11904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011905 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011906 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011907
Cort530cf382016-12-08 09:59:47 -080011908 VkClearDepthStencilValue depth_clear_value = {};
11909 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011910
11911 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11912 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011915 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011916 m_errorMonitor->VerifyFound();
11917 // Fail due to provided layout not matching actual current layout for depth clear.
11918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011919 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011920 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011921
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011922 // Now cause error due to bad image layout transition in PipelineBarrier
11923 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011924 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011925 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011926 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011927 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011928 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11929 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011930 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011932 "you cannot transition the layout of aspect 1 from "
11933 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11934 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011936 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11937 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011938 m_errorMonitor->VerifyFound();
11939
11940 // Finally some layout errors at RenderPass create time
11941 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11942 VkAttachmentReference attach = {};
11943 // perf warning for GENERAL layout w/ non-DS input attachment
11944 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11945 VkSubpassDescription subpass = {};
11946 subpass.inputAttachmentCount = 1;
11947 subpass.pInputAttachments = &attach;
11948 VkRenderPassCreateInfo rpci = {};
11949 rpci.subpassCount = 1;
11950 rpci.pSubpasses = &subpass;
11951 rpci.attachmentCount = 1;
11952 VkAttachmentDescription attach_desc = {};
11953 attach_desc.format = VK_FORMAT_UNDEFINED;
11954 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011955 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011956 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11958 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011959 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11960 m_errorMonitor->VerifyFound();
11961 // error w/ non-general layout
11962 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11963
11964 m_errorMonitor->SetDesiredFailureMsg(
11965 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11966 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11967 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11968 m_errorMonitor->VerifyFound();
11969 subpass.inputAttachmentCount = 0;
11970 subpass.colorAttachmentCount = 1;
11971 subpass.pColorAttachments = &attach;
11972 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11973 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11975 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011976 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11977 m_errorMonitor->VerifyFound();
11978 // error w/ non-color opt or GENERAL layout for color attachment
11979 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11980 m_errorMonitor->SetDesiredFailureMsg(
11981 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11982 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11983 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11984 m_errorMonitor->VerifyFound();
11985 subpass.colorAttachmentCount = 0;
11986 subpass.pDepthStencilAttachment = &attach;
11987 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11988 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11990 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011991 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11992 m_errorMonitor->VerifyFound();
11993 // error w/ non-ds opt or GENERAL layout for color attachment
11994 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11996 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11997 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011998 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11999 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012000 // For this error we need a valid renderpass so create default one
12001 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12002 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012003 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012004 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12005 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12006 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12007 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12008 // Can't do a CLEAR load on READ_ONLY initialLayout
12009 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12010 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12011 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012013 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012014 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12015 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012016
Cort3b021012016-12-07 12:00:57 -080012017 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12018 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12019 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012020 vkDestroyImage(m_device->device(), src_image, NULL);
12021 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012022 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012023}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012024
Tobin Ehlise0936662016-10-11 08:10:51 -060012025TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12026 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12027 VkResult err;
12028
Tony Barbour1fa09702017-03-16 12:09:08 -060012029 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012030
12031 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12032 VkImageTiling tiling;
12033 VkFormatProperties format_properties;
12034 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12035 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12036 tiling = VK_IMAGE_TILING_LINEAR;
12037 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12038 tiling = VK_IMAGE_TILING_OPTIMAL;
12039 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012040 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012041 return;
12042 }
12043
12044 VkDescriptorPoolSize ds_type = {};
12045 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12046 ds_type.descriptorCount = 1;
12047
12048 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12049 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12050 ds_pool_ci.maxSets = 1;
12051 ds_pool_ci.poolSizeCount = 1;
12052 ds_pool_ci.pPoolSizes = &ds_type;
12053 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12054
12055 VkDescriptorPool ds_pool;
12056 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12057 ASSERT_VK_SUCCESS(err);
12058
12059 VkDescriptorSetLayoutBinding dsl_binding = {};
12060 dsl_binding.binding = 0;
12061 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12062 dsl_binding.descriptorCount = 1;
12063 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12064 dsl_binding.pImmutableSamplers = NULL;
12065
12066 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12067 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12068 ds_layout_ci.pNext = NULL;
12069 ds_layout_ci.bindingCount = 1;
12070 ds_layout_ci.pBindings = &dsl_binding;
12071
12072 VkDescriptorSetLayout ds_layout;
12073 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12074 ASSERT_VK_SUCCESS(err);
12075
12076 VkDescriptorSetAllocateInfo alloc_info = {};
12077 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12078 alloc_info.descriptorSetCount = 1;
12079 alloc_info.descriptorPool = ds_pool;
12080 alloc_info.pSetLayouts = &ds_layout;
12081 VkDescriptorSet descriptor_set;
12082 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12083 ASSERT_VK_SUCCESS(err);
12084
12085 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12086 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12087 pipeline_layout_ci.pNext = NULL;
12088 pipeline_layout_ci.setLayoutCount = 1;
12089 pipeline_layout_ci.pSetLayouts = &ds_layout;
12090 VkPipelineLayout pipeline_layout;
12091 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12092 ASSERT_VK_SUCCESS(err);
12093
12094 VkImageObj image(m_device);
12095 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12096 ASSERT_TRUE(image.initialized());
12097 VkImageView view = image.targetView(tex_format);
12098
12099 VkDescriptorImageInfo image_info = {};
12100 image_info.imageView = view;
12101 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12102
12103 VkWriteDescriptorSet descriptor_write = {};
12104 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12105 descriptor_write.dstSet = descriptor_set;
12106 descriptor_write.dstBinding = 0;
12107 descriptor_write.descriptorCount = 1;
12108 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12109 descriptor_write.pImageInfo = &image_info;
12110
12111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12112 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12113 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12114 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12115 m_errorMonitor->VerifyFound();
12116
12117 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12118 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12119 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12120 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12121}
12122
Mark Mueller93b938f2016-08-18 10:27:40 -060012123TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012124 TEST_DESCRIPTION(
12125 "Use vkCmdExecuteCommands with invalid state "
12126 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012127
Tony Barbour1fa09702017-03-16 12:09:08 -060012128 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012129 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12130
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012131 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012132 const char *simultaneous_use_message2 =
12133 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12134 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012135
12136 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012137 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012138 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012139 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12140 command_buffer_allocate_info.commandBufferCount = 1;
12141
12142 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012143 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012144 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12145 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012146 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012147 command_buffer_inheritance_info.renderPass = m_renderPass;
12148 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012149
Mark Mueller93b938f2016-08-18 10:27:40 -060012150 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012151 command_buffer_begin_info.flags =
12152 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012153 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12154
12155 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12156 vkEndCommandBuffer(secondary_command_buffer);
12157
Mark Mueller93b938f2016-08-18 10:27:40 -060012158 VkSubmitInfo submit_info = {};
12159 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12160 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012161 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012162
Mark Mueller4042b652016-09-05 22:52:21 -060012163 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012164 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12165 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12166 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012167 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012168 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012169 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12170 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012171
Dave Houltonfbf52152017-01-06 12:55:29 -070012172 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012173 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012174 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012175
Mark Mueller4042b652016-09-05 22:52:21 -060012176 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012177 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12178 m_errorMonitor->SetUnexpectedError(
12179 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12180 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012181 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012182 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012183
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12185 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012186 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012187 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12188 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012189
12190 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012191
12192 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012193}
12194
Tony Barbour626994c2017-02-08 15:29:37 -070012195TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12196 TEST_DESCRIPTION(
12197 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12198 "errors");
12199 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12200 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 -060012201 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012202
12203 VkCommandBuffer cmd_bufs[2];
12204 VkCommandBufferAllocateInfo alloc_info;
12205 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12206 alloc_info.pNext = NULL;
12207 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012208 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012209 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12210 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12211
12212 VkCommandBufferBeginInfo cb_binfo;
12213 cb_binfo.pNext = NULL;
12214 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12215 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12216 cb_binfo.flags = 0;
12217 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12218 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12219 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12220 vkEndCommandBuffer(cmd_bufs[0]);
12221 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12222
12223 VkSubmitInfo submit_info = {};
12224 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12225 submit_info.commandBufferCount = 2;
12226 submit_info.pCommandBuffers = duplicates;
12227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12228 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12229 m_errorMonitor->VerifyFound();
12230 vkQueueWaitIdle(m_device->m_queue);
12231
12232 // Set one time use and now look for one time submit
12233 duplicates[0] = duplicates[1] = cmd_bufs[1];
12234 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12235 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12236 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12237 vkEndCommandBuffer(cmd_bufs[1]);
12238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12239 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12240 m_errorMonitor->VerifyFound();
12241 vkQueueWaitIdle(m_device->m_queue);
12242}
12243
Tobin Ehlisb093da82017-01-19 12:05:27 -070012244TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012245 TEST_DESCRIPTION(
12246 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12247 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012248
Tony Barbour1fa09702017-03-16 12:09:08 -060012249 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012250 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12251
12252 std::vector<const char *> device_extension_names;
12253 auto features = m_device->phy().features();
12254 // Make sure gs & ts are disabled
12255 features.geometryShader = false;
12256 features.tessellationShader = false;
12257 // The sacrificial device object
12258 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12259
12260 VkCommandPoolCreateInfo pool_create_info{};
12261 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12262 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12263
12264 VkCommandPool command_pool;
12265 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12266
12267 VkCommandBufferAllocateInfo cmd = {};
12268 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12269 cmd.pNext = NULL;
12270 cmd.commandPool = command_pool;
12271 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12272 cmd.commandBufferCount = 1;
12273
12274 VkCommandBuffer cmd_buffer;
12275 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12276 ASSERT_VK_SUCCESS(err);
12277
12278 VkEvent event;
12279 VkEventCreateInfo evci = {};
12280 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12281 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12282 ASSERT_VK_SUCCESS(result);
12283
12284 VkCommandBufferBeginInfo cbbi = {};
12285 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12286 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12288 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12289 m_errorMonitor->VerifyFound();
12290
12291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12292 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12293 m_errorMonitor->VerifyFound();
12294
12295 vkDestroyEvent(test_device.handle(), event, NULL);
12296 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12297}
12298
Mark Mueller917f6bc2016-08-30 10:57:19 -060012299TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012300 TEST_DESCRIPTION(
12301 "Use vkCmdExecuteCommands with invalid state "
12302 "in primary and secondary command buffers. "
12303 "Delete objects that are inuse. Call VkQueueSubmit "
12304 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012305
Tony Barbour1fa09702017-03-16 12:09:08 -060012306 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12308
Tony Barbour552f6c02016-12-21 14:34:07 -070012309 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012310
12311 VkEvent event;
12312 VkEventCreateInfo event_create_info = {};
12313 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12314 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012315 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012316
Tony Barbour552f6c02016-12-21 14:34:07 -070012317 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012318 vkDestroyEvent(m_device->device(), event, nullptr);
12319
12320 VkSubmitInfo submit_info = {};
12321 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12322 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012323 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012325 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12326 m_errorMonitor->VerifyFound();
12327
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012328 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012329 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12330
12331 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12332
Mark Mueller917f6bc2016-08-30 10:57:19 -060012333 VkSemaphoreCreateInfo semaphore_create_info = {};
12334 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12335 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012336 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012337 VkFenceCreateInfo fence_create_info = {};
12338 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12339 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012340 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012341
12342 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012343 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012344 descriptor_pool_type_count.descriptorCount = 1;
12345
12346 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12347 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12348 descriptor_pool_create_info.maxSets = 1;
12349 descriptor_pool_create_info.poolSizeCount = 1;
12350 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012351 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012352
12353 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012354 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012355
12356 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012357 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012358 descriptorset_layout_binding.descriptorCount = 1;
12359 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12360
12361 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012362 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012363 descriptorset_layout_create_info.bindingCount = 1;
12364 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12365
12366 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012367 ASSERT_VK_SUCCESS(
12368 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012369
12370 VkDescriptorSet descriptorset;
12371 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012372 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012373 descriptorset_allocate_info.descriptorSetCount = 1;
12374 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12375 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012376 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012377
Mark Mueller4042b652016-09-05 22:52:21 -060012378 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12379
12380 VkDescriptorBufferInfo buffer_info = {};
12381 buffer_info.buffer = buffer_test.GetBuffer();
12382 buffer_info.offset = 0;
12383 buffer_info.range = 1024;
12384
12385 VkWriteDescriptorSet write_descriptor_set = {};
12386 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12387 write_descriptor_set.dstSet = descriptorset;
12388 write_descriptor_set.descriptorCount = 1;
12389 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12390 write_descriptor_set.pBufferInfo = &buffer_info;
12391
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012392 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012393
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012394 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12395 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012396
12397 VkPipelineObj pipe(m_device);
12398 pipe.AddColorAttachment();
12399 pipe.AddShader(&vs);
12400 pipe.AddShader(&fs);
12401
12402 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012403 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012404 pipeline_layout_create_info.setLayoutCount = 1;
12405 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12406
12407 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012408 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012409
12410 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12411
Tony Barbour552f6c02016-12-21 14:34:07 -070012412 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012413 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012414
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012415 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12416 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12417 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012418
Tony Barbour552f6c02016-12-21 14:34:07 -070012419 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012420
Mark Mueller917f6bc2016-08-30 10:57:19 -060012421 submit_info.signalSemaphoreCount = 1;
12422 submit_info.pSignalSemaphores = &semaphore;
12423 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012424 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012425
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012427 vkDestroyEvent(m_device->device(), event, nullptr);
12428 m_errorMonitor->VerifyFound();
12429
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012431 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12432 m_errorMonitor->VerifyFound();
12433
Jeremy Hayes08369882017-02-02 10:31:06 -070012434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012435 vkDestroyFence(m_device->device(), fence, nullptr);
12436 m_errorMonitor->VerifyFound();
12437
Tobin Ehlis122207b2016-09-01 08:50:06 -070012438 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012439 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12440 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012441 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012442 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12443 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012444 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012445 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12446 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012447 vkDestroyEvent(m_device->device(), event, nullptr);
12448 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012449 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012450 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12451}
12452
Tobin Ehlis2adda372016-09-01 08:51:06 -070012453TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12454 TEST_DESCRIPTION("Delete in-use query pool.");
12455
Tony Barbour1fa09702017-03-16 12:09:08 -060012456 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012457 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12458
12459 VkQueryPool query_pool;
12460 VkQueryPoolCreateInfo query_pool_ci{};
12461 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12462 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12463 query_pool_ci.queryCount = 1;
12464 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012465 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012466 // Reset query pool to create binding with cmd buffer
12467 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12468
Tony Barbour552f6c02016-12-21 14:34:07 -070012469 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012470
12471 VkSubmitInfo submit_info = {};
12472 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12473 submit_info.commandBufferCount = 1;
12474 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12475 // Submit cmd buffer and then destroy query pool while in-flight
12476 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12477
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012479 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12480 m_errorMonitor->VerifyFound();
12481
12482 vkQueueWaitIdle(m_device->m_queue);
12483 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012484 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12485 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012486 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12487}
12488
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012489TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12490 TEST_DESCRIPTION("Delete in-use pipeline.");
12491
Tony Barbour1fa09702017-03-16 12:09:08 -060012492 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12494
12495 // Empty pipeline layout used for binding PSO
12496 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12497 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12498 pipeline_layout_ci.setLayoutCount = 0;
12499 pipeline_layout_ci.pSetLayouts = NULL;
12500
12501 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012502 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012503 ASSERT_VK_SUCCESS(err);
12504
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012506 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012507 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12508 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012509 // Store pipeline handle so we can actually delete it before test finishes
12510 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012511 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012512 VkPipelineObj pipe(m_device);
12513 pipe.AddShader(&vs);
12514 pipe.AddShader(&fs);
12515 pipe.AddColorAttachment();
12516 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12517 delete_this_pipeline = pipe.handle();
12518
Tony Barbour552f6c02016-12-21 14:34:07 -070012519 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012520 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012521 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012522
Tony Barbour552f6c02016-12-21 14:34:07 -070012523 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012524
12525 VkSubmitInfo submit_info = {};
12526 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12527 submit_info.commandBufferCount = 1;
12528 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12529 // Submit cmd buffer and then pipeline destroyed while in-flight
12530 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012531 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012532 m_errorMonitor->VerifyFound();
12533 // Make sure queue finished and then actually delete pipeline
12534 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012535 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12536 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012537 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12538 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12539}
12540
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012541TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12542 TEST_DESCRIPTION("Delete in-use imageView.");
12543
Tony Barbour1fa09702017-03-16 12:09:08 -060012544 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012545 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12546
12547 VkDescriptorPoolSize ds_type_count;
12548 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12549 ds_type_count.descriptorCount = 1;
12550
12551 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12552 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12553 ds_pool_ci.maxSets = 1;
12554 ds_pool_ci.poolSizeCount = 1;
12555 ds_pool_ci.pPoolSizes = &ds_type_count;
12556
12557 VkDescriptorPool ds_pool;
12558 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12559 ASSERT_VK_SUCCESS(err);
12560
12561 VkSamplerCreateInfo sampler_ci = {};
12562 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12563 sampler_ci.pNext = NULL;
12564 sampler_ci.magFilter = VK_FILTER_NEAREST;
12565 sampler_ci.minFilter = VK_FILTER_NEAREST;
12566 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12567 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12568 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12569 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12570 sampler_ci.mipLodBias = 1.0;
12571 sampler_ci.anisotropyEnable = VK_FALSE;
12572 sampler_ci.maxAnisotropy = 1;
12573 sampler_ci.compareEnable = VK_FALSE;
12574 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12575 sampler_ci.minLod = 1.0;
12576 sampler_ci.maxLod = 1.0;
12577 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12578 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12579 VkSampler sampler;
12580
12581 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12582 ASSERT_VK_SUCCESS(err);
12583
12584 VkDescriptorSetLayoutBinding layout_binding;
12585 layout_binding.binding = 0;
12586 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12587 layout_binding.descriptorCount = 1;
12588 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12589 layout_binding.pImmutableSamplers = NULL;
12590
12591 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12592 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12593 ds_layout_ci.bindingCount = 1;
12594 ds_layout_ci.pBindings = &layout_binding;
12595 VkDescriptorSetLayout ds_layout;
12596 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12597 ASSERT_VK_SUCCESS(err);
12598
12599 VkDescriptorSetAllocateInfo alloc_info = {};
12600 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12601 alloc_info.descriptorSetCount = 1;
12602 alloc_info.descriptorPool = ds_pool;
12603 alloc_info.pSetLayouts = &ds_layout;
12604 VkDescriptorSet descriptor_set;
12605 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12606 ASSERT_VK_SUCCESS(err);
12607
12608 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12609 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12610 pipeline_layout_ci.pNext = NULL;
12611 pipeline_layout_ci.setLayoutCount = 1;
12612 pipeline_layout_ci.pSetLayouts = &ds_layout;
12613
12614 VkPipelineLayout pipeline_layout;
12615 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12616 ASSERT_VK_SUCCESS(err);
12617
12618 VkImageObj image(m_device);
12619 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12620 ASSERT_TRUE(image.initialized());
12621
12622 VkImageView view;
12623 VkImageViewCreateInfo ivci = {};
12624 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12625 ivci.image = image.handle();
12626 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12627 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12628 ivci.subresourceRange.layerCount = 1;
12629 ivci.subresourceRange.baseMipLevel = 0;
12630 ivci.subresourceRange.levelCount = 1;
12631 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12632
12633 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12634 ASSERT_VK_SUCCESS(err);
12635
12636 VkDescriptorImageInfo image_info{};
12637 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12638 image_info.imageView = view;
12639 image_info.sampler = sampler;
12640
12641 VkWriteDescriptorSet descriptor_write = {};
12642 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12643 descriptor_write.dstSet = descriptor_set;
12644 descriptor_write.dstBinding = 0;
12645 descriptor_write.descriptorCount = 1;
12646 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12647 descriptor_write.pImageInfo = &image_info;
12648
12649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12650
12651 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012652 char const *vsSource =
12653 "#version 450\n"
12654 "\n"
12655 "out gl_PerVertex { \n"
12656 " vec4 gl_Position;\n"
12657 "};\n"
12658 "void main(){\n"
12659 " gl_Position = vec4(1);\n"
12660 "}\n";
12661 char const *fsSource =
12662 "#version 450\n"
12663 "\n"
12664 "layout(set=0, binding=0) uniform sampler2D s;\n"
12665 "layout(location=0) out vec4 x;\n"
12666 "void main(){\n"
12667 " x = texture(s, vec2(1));\n"
12668 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012669 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12670 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12671 VkPipelineObj pipe(m_device);
12672 pipe.AddShader(&vs);
12673 pipe.AddShader(&fs);
12674 pipe.AddColorAttachment();
12675 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12676
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012678
Tony Barbour552f6c02016-12-21 14:34:07 -070012679 m_commandBuffer->BeginCommandBuffer();
12680 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012681 // Bind pipeline to cmd buffer
12682 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12683 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12684 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012685
12686 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12687 VkRect2D scissor = {{0, 0}, {16, 16}};
12688 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12689 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12690
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012691 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012692 m_commandBuffer->EndRenderPass();
12693 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012694 // Submit cmd buffer then destroy sampler
12695 VkSubmitInfo submit_info = {};
12696 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12697 submit_info.commandBufferCount = 1;
12698 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12699 // Submit cmd buffer and then destroy imageView while in-flight
12700 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12701
12702 vkDestroyImageView(m_device->device(), view, nullptr);
12703 m_errorMonitor->VerifyFound();
12704 vkQueueWaitIdle(m_device->m_queue);
12705 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012706 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12707 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012708 vkDestroyImageView(m_device->device(), view, NULL);
12709 vkDestroySampler(m_device->device(), sampler, nullptr);
12710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12713}
12714
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012715TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12716 TEST_DESCRIPTION("Delete in-use bufferView.");
12717
Tony Barbour1fa09702017-03-16 12:09:08 -060012718 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12720
12721 VkDescriptorPoolSize ds_type_count;
12722 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12723 ds_type_count.descriptorCount = 1;
12724
12725 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12726 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12727 ds_pool_ci.maxSets = 1;
12728 ds_pool_ci.poolSizeCount = 1;
12729 ds_pool_ci.pPoolSizes = &ds_type_count;
12730
12731 VkDescriptorPool ds_pool;
12732 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12733 ASSERT_VK_SUCCESS(err);
12734
12735 VkDescriptorSetLayoutBinding layout_binding;
12736 layout_binding.binding = 0;
12737 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12738 layout_binding.descriptorCount = 1;
12739 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12740 layout_binding.pImmutableSamplers = NULL;
12741
12742 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12743 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12744 ds_layout_ci.bindingCount = 1;
12745 ds_layout_ci.pBindings = &layout_binding;
12746 VkDescriptorSetLayout ds_layout;
12747 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12748 ASSERT_VK_SUCCESS(err);
12749
12750 VkDescriptorSetAllocateInfo alloc_info = {};
12751 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12752 alloc_info.descriptorSetCount = 1;
12753 alloc_info.descriptorPool = ds_pool;
12754 alloc_info.pSetLayouts = &ds_layout;
12755 VkDescriptorSet descriptor_set;
12756 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12757 ASSERT_VK_SUCCESS(err);
12758
12759 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12760 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12761 pipeline_layout_ci.pNext = NULL;
12762 pipeline_layout_ci.setLayoutCount = 1;
12763 pipeline_layout_ci.pSetLayouts = &ds_layout;
12764
12765 VkPipelineLayout pipeline_layout;
12766 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12767 ASSERT_VK_SUCCESS(err);
12768
12769 VkBuffer buffer;
12770 uint32_t queue_family_index = 0;
12771 VkBufferCreateInfo buffer_create_info = {};
12772 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12773 buffer_create_info.size = 1024;
12774 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12775 buffer_create_info.queueFamilyIndexCount = 1;
12776 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12777
12778 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12779 ASSERT_VK_SUCCESS(err);
12780
12781 VkMemoryRequirements memory_reqs;
12782 VkDeviceMemory buffer_memory;
12783
12784 VkMemoryAllocateInfo memory_info = {};
12785 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12786 memory_info.allocationSize = 0;
12787 memory_info.memoryTypeIndex = 0;
12788
12789 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12790 memory_info.allocationSize = memory_reqs.size;
12791 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12792 ASSERT_TRUE(pass);
12793
12794 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12795 ASSERT_VK_SUCCESS(err);
12796 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12797 ASSERT_VK_SUCCESS(err);
12798
12799 VkBufferView view;
12800 VkBufferViewCreateInfo bvci = {};
12801 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12802 bvci.buffer = buffer;
12803 bvci.format = VK_FORMAT_R8_UNORM;
12804 bvci.range = VK_WHOLE_SIZE;
12805
12806 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12807 ASSERT_VK_SUCCESS(err);
12808
12809 VkWriteDescriptorSet descriptor_write = {};
12810 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12811 descriptor_write.dstSet = descriptor_set;
12812 descriptor_write.dstBinding = 0;
12813 descriptor_write.descriptorCount = 1;
12814 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12815 descriptor_write.pTexelBufferView = &view;
12816
12817 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12818
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012819 char const *vsSource =
12820 "#version 450\n"
12821 "\n"
12822 "out gl_PerVertex { \n"
12823 " vec4 gl_Position;\n"
12824 "};\n"
12825 "void main(){\n"
12826 " gl_Position = vec4(1);\n"
12827 "}\n";
12828 char const *fsSource =
12829 "#version 450\n"
12830 "\n"
12831 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12832 "layout(location=0) out vec4 x;\n"
12833 "void main(){\n"
12834 " x = imageLoad(s, 0);\n"
12835 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012836 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12837 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12838 VkPipelineObj pipe(m_device);
12839 pipe.AddShader(&vs);
12840 pipe.AddShader(&fs);
12841 pipe.AddColorAttachment();
12842 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12843
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012845
Tony Barbour552f6c02016-12-21 14:34:07 -070012846 m_commandBuffer->BeginCommandBuffer();
12847 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012848 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12849 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12850 VkRect2D scissor = {{0, 0}, {16, 16}};
12851 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12852 // Bind pipeline to cmd buffer
12853 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12854 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12855 &descriptor_set, 0, nullptr);
12856 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012857 m_commandBuffer->EndRenderPass();
12858 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012859
12860 VkSubmitInfo submit_info = {};
12861 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12862 submit_info.commandBufferCount = 1;
12863 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12864 // Submit cmd buffer and then destroy bufferView while in-flight
12865 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12866
12867 vkDestroyBufferView(m_device->device(), view, nullptr);
12868 m_errorMonitor->VerifyFound();
12869 vkQueueWaitIdle(m_device->m_queue);
12870 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012871 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12872 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012873 vkDestroyBufferView(m_device->device(), view, NULL);
12874 vkDestroyBuffer(m_device->device(), buffer, NULL);
12875 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12876 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12878 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12879}
12880
Tobin Ehlis209532e2016-09-07 13:52:18 -060012881TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12882 TEST_DESCRIPTION("Delete in-use sampler.");
12883
Tony Barbour1fa09702017-03-16 12:09:08 -060012884 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12886
12887 VkDescriptorPoolSize ds_type_count;
12888 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12889 ds_type_count.descriptorCount = 1;
12890
12891 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12892 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12893 ds_pool_ci.maxSets = 1;
12894 ds_pool_ci.poolSizeCount = 1;
12895 ds_pool_ci.pPoolSizes = &ds_type_count;
12896
12897 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012898 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012899 ASSERT_VK_SUCCESS(err);
12900
12901 VkSamplerCreateInfo sampler_ci = {};
12902 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12903 sampler_ci.pNext = NULL;
12904 sampler_ci.magFilter = VK_FILTER_NEAREST;
12905 sampler_ci.minFilter = VK_FILTER_NEAREST;
12906 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12907 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12908 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12909 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12910 sampler_ci.mipLodBias = 1.0;
12911 sampler_ci.anisotropyEnable = VK_FALSE;
12912 sampler_ci.maxAnisotropy = 1;
12913 sampler_ci.compareEnable = VK_FALSE;
12914 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12915 sampler_ci.minLod = 1.0;
12916 sampler_ci.maxLod = 1.0;
12917 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12918 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12919 VkSampler sampler;
12920
12921 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12922 ASSERT_VK_SUCCESS(err);
12923
12924 VkDescriptorSetLayoutBinding layout_binding;
12925 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012926 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012927 layout_binding.descriptorCount = 1;
12928 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12929 layout_binding.pImmutableSamplers = NULL;
12930
12931 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12932 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12933 ds_layout_ci.bindingCount = 1;
12934 ds_layout_ci.pBindings = &layout_binding;
12935 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012936 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012937 ASSERT_VK_SUCCESS(err);
12938
12939 VkDescriptorSetAllocateInfo alloc_info = {};
12940 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12941 alloc_info.descriptorSetCount = 1;
12942 alloc_info.descriptorPool = ds_pool;
12943 alloc_info.pSetLayouts = &ds_layout;
12944 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012945 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012946 ASSERT_VK_SUCCESS(err);
12947
12948 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12949 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12950 pipeline_layout_ci.pNext = NULL;
12951 pipeline_layout_ci.setLayoutCount = 1;
12952 pipeline_layout_ci.pSetLayouts = &ds_layout;
12953
12954 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012955 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012956 ASSERT_VK_SUCCESS(err);
12957
12958 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012959 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012960 ASSERT_TRUE(image.initialized());
12961
12962 VkImageView view;
12963 VkImageViewCreateInfo ivci = {};
12964 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12965 ivci.image = image.handle();
12966 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12967 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12968 ivci.subresourceRange.layerCount = 1;
12969 ivci.subresourceRange.baseMipLevel = 0;
12970 ivci.subresourceRange.levelCount = 1;
12971 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12972
12973 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12974 ASSERT_VK_SUCCESS(err);
12975
12976 VkDescriptorImageInfo image_info{};
12977 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12978 image_info.imageView = view;
12979 image_info.sampler = sampler;
12980
12981 VkWriteDescriptorSet descriptor_write = {};
12982 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12983 descriptor_write.dstSet = descriptor_set;
12984 descriptor_write.dstBinding = 0;
12985 descriptor_write.descriptorCount = 1;
12986 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12987 descriptor_write.pImageInfo = &image_info;
12988
12989 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12990
12991 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012992 char const *vsSource =
12993 "#version 450\n"
12994 "\n"
12995 "out gl_PerVertex { \n"
12996 " vec4 gl_Position;\n"
12997 "};\n"
12998 "void main(){\n"
12999 " gl_Position = vec4(1);\n"
13000 "}\n";
13001 char const *fsSource =
13002 "#version 450\n"
13003 "\n"
13004 "layout(set=0, binding=0) uniform sampler2D s;\n"
13005 "layout(location=0) out vec4 x;\n"
13006 "void main(){\n"
13007 " x = texture(s, vec2(1));\n"
13008 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013009 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13010 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13011 VkPipelineObj pipe(m_device);
13012 pipe.AddShader(&vs);
13013 pipe.AddShader(&fs);
13014 pipe.AddColorAttachment();
13015 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13016
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013018
Tony Barbour552f6c02016-12-21 14:34:07 -070013019 m_commandBuffer->BeginCommandBuffer();
13020 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013021 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013022 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13023 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13024 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013025
13026 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13027 VkRect2D scissor = {{0, 0}, {16, 16}};
13028 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13029 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13030
Tobin Ehlis209532e2016-09-07 13:52:18 -060013031 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013032 m_commandBuffer->EndRenderPass();
13033 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013034 // Submit cmd buffer then destroy sampler
13035 VkSubmitInfo submit_info = {};
13036 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13037 submit_info.commandBufferCount = 1;
13038 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13039 // Submit cmd buffer and then destroy sampler while in-flight
13040 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13041
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013042 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013043 m_errorMonitor->VerifyFound();
13044 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013045
Tobin Ehlis209532e2016-09-07 13:52:18 -060013046 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013047 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13048 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013049 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013050 vkDestroyImageView(m_device->device(), view, NULL);
13051 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13052 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13053 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13054}
13055
Mark Mueller1cd9f412016-08-25 13:23:52 -060013056TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013057 TEST_DESCRIPTION(
13058 "Call VkQueueSubmit with a semaphore that is already "
13059 "signaled but not waited on by the queue. Wait on a "
13060 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013061
Tony Barbour1fa09702017-03-16 12:09:08 -060013062 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013063 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13064
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013065 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 -070013066 const char *invalid_fence_wait_message =
13067 " which has not been submitted on a Queue or during "
13068 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013069
Tony Barbour552f6c02016-12-21 14:34:07 -070013070 m_commandBuffer->BeginCommandBuffer();
13071 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013072
13073 VkSemaphoreCreateInfo semaphore_create_info = {};
13074 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13075 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013076 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013077 VkSubmitInfo submit_info = {};
13078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13079 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013081 submit_info.signalSemaphoreCount = 1;
13082 submit_info.pSignalSemaphores = &semaphore;
13083 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013084 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013085 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013086 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013087 m_commandBuffer->BeginCommandBuffer();
13088 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013090 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13091 m_errorMonitor->VerifyFound();
13092
Mark Mueller1cd9f412016-08-25 13:23:52 -060013093 VkFenceCreateInfo fence_create_info = {};
13094 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13095 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013096 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013097
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013099 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13100 m_errorMonitor->VerifyFound();
13101
Mark Mueller4042b652016-09-05 22:52:21 -060013102 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013103 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013104 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13105}
13106
Tobin Ehlis4af23302016-07-19 10:50:30 -060013107TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013108 TEST_DESCRIPTION(
13109 "Bind a secondary command buffer with with a framebuffer "
13110 "that does not match the framebuffer for the active "
13111 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013112 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013113 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13114
13115 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013116 VkAttachmentDescription attachment = {0,
13117 VK_FORMAT_B8G8R8A8_UNORM,
13118 VK_SAMPLE_COUNT_1_BIT,
13119 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13120 VK_ATTACHMENT_STORE_OP_STORE,
13121 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13122 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13123 VK_IMAGE_LAYOUT_UNDEFINED,
13124 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013126 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013128 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013129
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013130 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013131
13132 VkRenderPass rp;
13133 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13134 ASSERT_VK_SUCCESS(err);
13135
13136 // A compatible framebuffer.
13137 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013138 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013139 ASSERT_TRUE(image.initialized());
13140
13141 VkImageViewCreateInfo ivci = {
13142 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13143 nullptr,
13144 0,
13145 image.handle(),
13146 VK_IMAGE_VIEW_TYPE_2D,
13147 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013148 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13149 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013150 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13151 };
13152 VkImageView view;
13153 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13154 ASSERT_VK_SUCCESS(err);
13155
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013156 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013157 VkFramebuffer fb;
13158 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13159 ASSERT_VK_SUCCESS(err);
13160
13161 VkCommandBufferAllocateInfo cbai = {};
13162 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013163 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013164 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13165 cbai.commandBufferCount = 1;
13166
13167 VkCommandBuffer sec_cb;
13168 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13169 ASSERT_VK_SUCCESS(err);
13170 VkCommandBufferBeginInfo cbbi = {};
13171 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013172 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013173 cbii.renderPass = renderPass();
13174 cbii.framebuffer = fb;
13175 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13176 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013177 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 -060013178 cbbi.pInheritanceInfo = &cbii;
13179 vkBeginCommandBuffer(sec_cb, &cbbi);
13180 vkEndCommandBuffer(sec_cb);
13181
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013182 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013183 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13184 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013185
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013187 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013188 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13189 m_errorMonitor->VerifyFound();
13190 // Cleanup
13191 vkDestroyImageView(m_device->device(), view, NULL);
13192 vkDestroyRenderPass(m_device->device(), rp, NULL);
13193 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13194}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013195
13196TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013197 TEST_DESCRIPTION(
13198 "If logicOp is available on the device, set it to an "
13199 "invalid value. If logicOp is not available, attempt to "
13200 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013201 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13203
13204 auto features = m_device->phy().features();
13205 // Set the expected error depending on whether or not logicOp available
13206 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13208 "If logic operations feature not "
13209 "enabled, logicOpEnable must be "
13210 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013211 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013213 }
13214 // Create a pipeline using logicOp
13215 VkResult err;
13216
13217 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13218 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13219
13220 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013221 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013222 ASSERT_VK_SUCCESS(err);
13223
13224 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13225 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13226 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013227 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013228 vp_state_ci.pViewports = &vp;
13229 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013230 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013231 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013232
13233 VkPipelineShaderStageCreateInfo shaderStages[2];
13234 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13235
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013236 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13237 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013238 shaderStages[0] = vs.GetStageCreateInfo();
13239 shaderStages[1] = fs.GetStageCreateInfo();
13240
13241 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13242 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13243
13244 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13245 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13246 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13247
13248 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13249 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013250 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013251
13252 VkPipelineColorBlendAttachmentState att = {};
13253 att.blendEnable = VK_FALSE;
13254 att.colorWriteMask = 0xf;
13255
13256 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13257 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13258 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13259 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013260 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013261 cb_ci.attachmentCount = 1;
13262 cb_ci.pAttachments = &att;
13263
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013264 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13265 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13266 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13267
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013268 VkGraphicsPipelineCreateInfo gp_ci = {};
13269 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13270 gp_ci.stageCount = 2;
13271 gp_ci.pStages = shaderStages;
13272 gp_ci.pVertexInputState = &vi_ci;
13273 gp_ci.pInputAssemblyState = &ia_ci;
13274 gp_ci.pViewportState = &vp_state_ci;
13275 gp_ci.pRasterizationState = &rs_ci;
13276 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013277 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013278 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13279 gp_ci.layout = pipeline_layout;
13280 gp_ci.renderPass = renderPass();
13281
13282 VkPipelineCacheCreateInfo pc_ci = {};
13283 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13284
13285 VkPipeline pipeline;
13286 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013287 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013288 ASSERT_VK_SUCCESS(err);
13289
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013290 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013291 m_errorMonitor->VerifyFound();
13292 if (VK_SUCCESS == err) {
13293 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13294 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013295 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13296 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13297}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013298
Mike Stroyanaccf7692015-05-12 16:00:45 -060013299#if GTEST_IS_THREADSAFE
13300struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013301 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013302 VkEvent event;
13303 bool bailout;
13304};
13305
Karl Schultz6addd812016-02-02 17:17:23 -070013306extern "C" void *AddToCommandBuffer(void *arg) {
13307 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013308
Mike Stroyana6d14942016-07-13 15:10:05 -060013309 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013310 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013311 if (data->bailout) {
13312 break;
13313 }
13314 }
13315 return NULL;
13316}
13317
Karl Schultz6addd812016-02-02 17:17:23 -070013318TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013319 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013320
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013322
Tony Barbour1fa09702017-03-16 12:09:08 -060013323 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013324 ASSERT_NO_FATAL_FAILURE(InitViewport());
13325 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13326
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013327 // Calls AllocateCommandBuffers
13328 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013329
13330 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013331 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013332
13333 VkEventCreateInfo event_info;
13334 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013335 VkResult err;
13336
13337 memset(&event_info, 0, sizeof(event_info));
13338 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13339
Chia-I Wuf7458c52015-10-26 21:10:41 +080013340 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013341 ASSERT_VK_SUCCESS(err);
13342
Mike Stroyanaccf7692015-05-12 16:00:45 -060013343 err = vkResetEvent(device(), event);
13344 ASSERT_VK_SUCCESS(err);
13345
13346 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013347 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013348 data.event = event;
13349 data.bailout = false;
13350 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013351
13352 // First do some correct operations using multiple threads.
13353 // Add many entries to command buffer from another thread.
13354 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13355 // Make non-conflicting calls from this thread at the same time.
13356 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013357 uint32_t count;
13358 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013359 }
13360 test_platform_thread_join(thread, NULL);
13361
13362 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013363 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013364 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013365 // Add many entries to command buffer from this thread at the same time.
13366 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013367
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013368 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013369 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013370
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013371 m_errorMonitor->SetBailout(NULL);
13372
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013373 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013374
Chia-I Wuf7458c52015-10-26 21:10:41 +080013375 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013376}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013377#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013378
Karl Schultz6addd812016-02-02 17:17:23 -070013379TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013380 TEST_DESCRIPTION(
13381 "Test that an error is produced for a spirv module "
13382 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013383
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013385
Tony Barbour1fa09702017-03-16 12:09:08 -060013386 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013387 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13388
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013389 VkShaderModule module;
13390 VkShaderModuleCreateInfo moduleCreateInfo;
13391 struct icd_spv_header spv;
13392
13393 spv.magic = ICD_SPV_MAGIC;
13394 spv.version = ICD_SPV_VERSION;
13395 spv.gen_magic = 0;
13396
13397 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13398 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013399 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013400 moduleCreateInfo.codeSize = 4;
13401 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013402 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013403
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013404 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013405}
13406
Karl Schultz6addd812016-02-02 17:17:23 -070013407TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013408 TEST_DESCRIPTION(
13409 "Test that an error is produced for a spirv module "
13410 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013411
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013413
Tony Barbour1fa09702017-03-16 12:09:08 -060013414 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13416
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013417 VkShaderModule module;
13418 VkShaderModuleCreateInfo moduleCreateInfo;
13419 struct icd_spv_header spv;
13420
13421 spv.magic = ~ICD_SPV_MAGIC;
13422 spv.version = ICD_SPV_VERSION;
13423 spv.gen_magic = 0;
13424
13425 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13426 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013427 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013428 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13429 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013430 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013431
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013432 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013433}
13434
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013435#if 0
13436// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013437TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013439 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013440
Tony Barbour1fa09702017-03-16 12:09:08 -060013441 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013442 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13443
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013444 VkShaderModule module;
13445 VkShaderModuleCreateInfo moduleCreateInfo;
13446 struct icd_spv_header spv;
13447
13448 spv.magic = ICD_SPV_MAGIC;
13449 spv.version = ~ICD_SPV_VERSION;
13450 spv.gen_magic = 0;
13451
13452 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13453 moduleCreateInfo.pNext = NULL;
13454
Karl Schultz6addd812016-02-02 17:17:23 -070013455 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013456 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13457 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013458 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013459
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013460 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013461}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013462#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013463
Karl Schultz6addd812016-02-02 17:17:23 -070013464TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013465 TEST_DESCRIPTION(
13466 "Test that a warning is produced for a vertex output that "
13467 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013468 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013469
Tony Barbour1fa09702017-03-16 12:09:08 -060013470 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013471 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013472
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013473 char const *vsSource =
13474 "#version 450\n"
13475 "\n"
13476 "layout(location=0) out float x;\n"
13477 "out gl_PerVertex {\n"
13478 " vec4 gl_Position;\n"
13479 "};\n"
13480 "void main(){\n"
13481 " gl_Position = vec4(1);\n"
13482 " x = 0;\n"
13483 "}\n";
13484 char const *fsSource =
13485 "#version 450\n"
13486 "\n"
13487 "layout(location=0) out vec4 color;\n"
13488 "void main(){\n"
13489 " color = vec4(1);\n"
13490 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013491
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013492 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13493 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013494
13495 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013496 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013497 pipe.AddShader(&vs);
13498 pipe.AddShader(&fs);
13499
Chris Forbes9f7ff632015-05-25 11:13:08 +120013500 VkDescriptorSetObj descriptorSet(m_device);
13501 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013502 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013503
Tony Barbour5781e8f2015-08-04 16:23:11 -060013504 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013505
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013506 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013507}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013508
Mark Mueller098c9cb2016-09-08 09:01:57 -060013509TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13510 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13511
Tony Barbour1fa09702017-03-16 12:09:08 -060013512 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13514
13515 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013516 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013517
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013518 char const *vsSource =
13519 "#version 450\n"
13520 "\n"
13521 "out gl_PerVertex {\n"
13522 " vec4 gl_Position;\n"
13523 "};\n"
13524 "void main(){\n"
13525 " gl_Position = vec4(1);\n"
13526 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013527
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013528 char const *fsSource =
13529 "#version 450\n"
13530 "\n"
13531 "layout (constant_id = 0) const float r = 0.0f;\n"
13532 "layout(location = 0) out vec4 uFragColor;\n"
13533 "void main(){\n"
13534 " uFragColor = vec4(r,1,0,1);\n"
13535 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013536
13537 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13538 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13539
13540 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13541 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13542
13543 VkPipelineLayout pipeline_layout;
13544 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13545
13546 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13547 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13548 vp_state_create_info.viewportCount = 1;
13549 VkViewport viewport = {};
13550 vp_state_create_info.pViewports = &viewport;
13551 vp_state_create_info.scissorCount = 1;
13552 VkRect2D scissors = {};
13553 vp_state_create_info.pScissors = &scissors;
13554
13555 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13556
13557 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13558 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13559 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13560 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13561
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013562 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013563
13564 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13565 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13566
13567 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13568 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13569 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13570
13571 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13572 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13573 rasterization_state_create_info.pNext = nullptr;
13574 rasterization_state_create_info.lineWidth = 1.0f;
13575 rasterization_state_create_info.rasterizerDiscardEnable = true;
13576
13577 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13578 color_blend_attachment_state.blendEnable = VK_FALSE;
13579 color_blend_attachment_state.colorWriteMask = 0xf;
13580
13581 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13582 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13583 color_blend_state_create_info.attachmentCount = 1;
13584 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13585
13586 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13587 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13588 graphicspipe_create_info.stageCount = 2;
13589 graphicspipe_create_info.pStages = shader_stage_create_info;
13590 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13591 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13592 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13593 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13594 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13595 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13596 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13597 graphicspipe_create_info.layout = pipeline_layout;
13598 graphicspipe_create_info.renderPass = renderPass();
13599
13600 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13601 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13602
13603 VkPipelineCache pipelineCache;
13604 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13605
13606 // This structure maps constant ids to data locations.
13607 const VkSpecializationMapEntry entry =
13608 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013609 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013610
13611 uint32_t data = 1;
13612
13613 // Set up the info describing spec map and data
13614 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013615 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013616 };
13617 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13618
13619 VkPipeline pipeline;
13620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13621 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13622 m_errorMonitor->VerifyFound();
13623
13624 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13625 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13626}
13627
13628TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13629 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13630
Tony Barbour1fa09702017-03-16 12:09:08 -060013631 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013632 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13633
13634 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13635
13636 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13637 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13638 descriptor_pool_type_count[0].descriptorCount = 1;
13639 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13640 descriptor_pool_type_count[1].descriptorCount = 1;
13641
13642 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13643 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13644 descriptor_pool_create_info.maxSets = 1;
13645 descriptor_pool_create_info.poolSizeCount = 2;
13646 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13647 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13648
13649 VkDescriptorPool descriptorset_pool;
13650 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13651
13652 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13653 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13654 descriptorset_layout_binding.descriptorCount = 1;
13655 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013656 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013657
13658 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13659 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13660 descriptorset_layout_create_info.bindingCount = 1;
13661 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13662
13663 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013664 ASSERT_VK_SUCCESS(
13665 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013666
13667 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13668 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13669 descriptorset_allocate_info.descriptorSetCount = 1;
13670 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13671 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13672 VkDescriptorSet descriptorset;
13673 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13674
13675 // Challenge core_validation with a non uniform buffer type.
13676 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13677
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013678 char const *vsSource =
13679 "#version 450\n"
13680 "\n"
13681 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13682 " mat4 mvp;\n"
13683 "} ubuf;\n"
13684 "out gl_PerVertex {\n"
13685 " vec4 gl_Position;\n"
13686 "};\n"
13687 "void main(){\n"
13688 " gl_Position = ubuf.mvp * vec4(1);\n"
13689 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013690
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013691 char const *fsSource =
13692 "#version 450\n"
13693 "\n"
13694 "layout(location = 0) out vec4 uFragColor;\n"
13695 "void main(){\n"
13696 " uFragColor = vec4(0,1,0,1);\n"
13697 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013698
13699 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13700 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13701
13702 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13703 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13704 pipeline_layout_create_info.setLayoutCount = 1;
13705 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13706
13707 VkPipelineLayout pipeline_layout;
13708 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13709
13710 VkPipelineObj pipe(m_device);
13711 pipe.AddColorAttachment();
13712 pipe.AddShader(&vs);
13713 pipe.AddShader(&fs);
13714
13715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13716 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13717 m_errorMonitor->VerifyFound();
13718
13719 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13720 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13721 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13722}
13723
13724TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13725 TEST_DESCRIPTION(
13726 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13727
Tony Barbour1fa09702017-03-16 12:09:08 -060013728 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13730
13731 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13732
13733 VkDescriptorPoolSize descriptor_pool_type_count = {};
13734 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13735 descriptor_pool_type_count.descriptorCount = 1;
13736
13737 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13738 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13739 descriptor_pool_create_info.maxSets = 1;
13740 descriptor_pool_create_info.poolSizeCount = 1;
13741 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13742 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13743
13744 VkDescriptorPool descriptorset_pool;
13745 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13746
13747 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13748 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13749 descriptorset_layout_binding.descriptorCount = 1;
13750 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13751 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013752 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013753
13754 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13755 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13756 descriptorset_layout_create_info.bindingCount = 1;
13757 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13758
13759 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013760 ASSERT_VK_SUCCESS(
13761 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013762
13763 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13764 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13765 descriptorset_allocate_info.descriptorSetCount = 1;
13766 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13767 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13768 VkDescriptorSet descriptorset;
13769 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13770
13771 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13772
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013773 char const *vsSource =
13774 "#version 450\n"
13775 "\n"
13776 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13777 " mat4 mvp;\n"
13778 "} ubuf;\n"
13779 "out gl_PerVertex {\n"
13780 " vec4 gl_Position;\n"
13781 "};\n"
13782 "void main(){\n"
13783 " gl_Position = ubuf.mvp * vec4(1);\n"
13784 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013785
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013786 char const *fsSource =
13787 "#version 450\n"
13788 "\n"
13789 "layout(location = 0) out vec4 uFragColor;\n"
13790 "void main(){\n"
13791 " uFragColor = vec4(0,1,0,1);\n"
13792 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013793
13794 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13795 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13796
13797 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13798 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13799 pipeline_layout_create_info.setLayoutCount = 1;
13800 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13801
13802 VkPipelineLayout pipeline_layout;
13803 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13804
13805 VkPipelineObj pipe(m_device);
13806 pipe.AddColorAttachment();
13807 pipe.AddShader(&vs);
13808 pipe.AddShader(&fs);
13809
13810 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13811 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13812 m_errorMonitor->VerifyFound();
13813
13814 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13815 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13816 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13817}
13818
13819TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013820 TEST_DESCRIPTION(
13821 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13822 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013823
Tony Barbour1fa09702017-03-16 12:09:08 -060013824 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013825 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13826
13827 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013828 "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 -060013829
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013830 char const *vsSource =
13831 "#version 450\n"
13832 "\n"
13833 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13834 "out gl_PerVertex {\n"
13835 " vec4 gl_Position;\n"
13836 "};\n"
13837 "void main(){\n"
13838 " gl_Position = vec4(consts.x);\n"
13839 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013840
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013841 char const *fsSource =
13842 "#version 450\n"
13843 "\n"
13844 "layout(location = 0) out vec4 uFragColor;\n"
13845 "void main(){\n"
13846 " uFragColor = vec4(0,1,0,1);\n"
13847 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013848
13849 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13850 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13851
13852 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13853 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13854
13855 // Set up a push constant range
13856 VkPushConstantRange push_constant_ranges = {};
13857 // Set to the wrong stage to challenge core_validation
13858 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13859 push_constant_ranges.size = 4;
13860
13861 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13862 pipeline_layout_create_info.pushConstantRangeCount = 1;
13863
13864 VkPipelineLayout pipeline_layout;
13865 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13866
13867 VkPipelineObj pipe(m_device);
13868 pipe.AddColorAttachment();
13869 pipe.AddShader(&vs);
13870 pipe.AddShader(&fs);
13871
13872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13873 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13874 m_errorMonitor->VerifyFound();
13875
13876 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13877}
13878
13879TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13880 TEST_DESCRIPTION(
13881 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13882
Tony Barbour1fa09702017-03-16 12:09:08 -060013883 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13885
13886 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013887 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013888
13889 // Some awkward steps are required to test with custom device features.
13890 std::vector<const char *> device_extension_names;
13891 auto features = m_device->phy().features();
13892 // Disable support for 64 bit floats
13893 features.shaderFloat64 = false;
13894 // The sacrificial device object
13895 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13896
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013897 char const *vsSource =
13898 "#version 450\n"
13899 "\n"
13900 "out gl_PerVertex {\n"
13901 " vec4 gl_Position;\n"
13902 "};\n"
13903 "void main(){\n"
13904 " gl_Position = vec4(1);\n"
13905 "}\n";
13906 char const *fsSource =
13907 "#version 450\n"
13908 "\n"
13909 "layout(location=0) out vec4 color;\n"
13910 "void main(){\n"
13911 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13912 " color = vec4(green);\n"
13913 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013914
13915 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13916 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13917
13918 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013919
13920 VkPipelineObj pipe(&test_device);
13921 pipe.AddColorAttachment();
13922 pipe.AddShader(&vs);
13923 pipe.AddShader(&fs);
13924
13925 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13926 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13927 VkPipelineLayout pipeline_layout;
13928 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13929
13930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13931 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13932 m_errorMonitor->VerifyFound();
13933
13934 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13935}
13936
Mark Lobodzinski20832822017-03-24 14:49:45 -060013937TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
13938 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
13939 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013940
Tony Barbour1fa09702017-03-16 12:09:08 -060013941 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013942 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13943
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013944 char const *vsSource =
13945 "#version 450\n"
13946 "\n"
13947 "out gl_PerVertex {\n"
13948 " vec4 gl_Position;\n"
13949 "};\n"
13950 "layout(xfb_buffer = 1) out;"
13951 "void main(){\n"
13952 " gl_Position = vec4(1);\n"
13953 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013954
Mark Lobodzinski20832822017-03-24 14:49:45 -060013955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013956
Mark Lobodzinski20832822017-03-24 14:49:45 -060013957 std::vector<unsigned int> spv;
13958 VkShaderModuleCreateInfo module_create_info;
13959 VkShaderModule shader_module;
13960 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13961 module_create_info.pNext = NULL;
13962 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
13963 module_create_info.pCode = spv.data();
13964 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
13965 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013966
Mark Lobodzinski20832822017-03-24 14:49:45 -060013967 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013968
Mark Lobodzinski20832822017-03-24 14:49:45 -060013969 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013970}
13971
Karl Schultz6addd812016-02-02 17:17:23 -070013972TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013973 TEST_DESCRIPTION(
13974 "Test that an error is produced for a fragment shader input "
13975 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013976
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013978
Tony Barbour1fa09702017-03-16 12:09:08 -060013979 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013981
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013982 char const *vsSource =
13983 "#version 450\n"
13984 "\n"
13985 "out gl_PerVertex {\n"
13986 " vec4 gl_Position;\n"
13987 "};\n"
13988 "void main(){\n"
13989 " gl_Position = vec4(1);\n"
13990 "}\n";
13991 char const *fsSource =
13992 "#version 450\n"
13993 "\n"
13994 "layout(location=0) in float x;\n"
13995 "layout(location=0) out vec4 color;\n"
13996 "void main(){\n"
13997 " color = vec4(x);\n"
13998 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120013999
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014000 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14001 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014002
14003 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014004 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014005 pipe.AddShader(&vs);
14006 pipe.AddShader(&fs);
14007
Chris Forbes59cb88d2015-05-25 11:13:13 +120014008 VkDescriptorSetObj descriptorSet(m_device);
14009 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014010 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014011
Tony Barbour5781e8f2015-08-04 16:23:11 -060014012 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014013
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014014 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014015}
14016
Karl Schultz6addd812016-02-02 17:17:23 -070014017TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014018 TEST_DESCRIPTION(
14019 "Test that an error is produced for a fragment shader input "
14020 "within an interace block, which is not present in the outputs "
14021 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014023
Tony Barbour1fa09702017-03-16 12:09:08 -060014024 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14026
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014027 char const *vsSource =
14028 "#version 450\n"
14029 "\n"
14030 "out gl_PerVertex {\n"
14031 " vec4 gl_Position;\n"
14032 "};\n"
14033 "void main(){\n"
14034 " gl_Position = vec4(1);\n"
14035 "}\n";
14036 char const *fsSource =
14037 "#version 450\n"
14038 "\n"
14039 "in block { layout(location=0) float x; } ins;\n"
14040 "layout(location=0) out vec4 color;\n"
14041 "void main(){\n"
14042 " color = vec4(ins.x);\n"
14043 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014044
14045 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14046 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14047
14048 VkPipelineObj pipe(m_device);
14049 pipe.AddColorAttachment();
14050 pipe.AddShader(&vs);
14051 pipe.AddShader(&fs);
14052
14053 VkDescriptorSetObj descriptorSet(m_device);
14054 descriptorSet.AppendDummy();
14055 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14056
14057 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14058
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014059 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014060}
14061
Karl Schultz6addd812016-02-02 17:17:23 -070014062TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014063 TEST_DESCRIPTION(
14064 "Test that an error is produced for mismatched array sizes "
14065 "across the vertex->fragment shader interface");
14066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14067 "Type mismatch on location 0.0: 'ptr to "
14068 "output arr[2] of float32' vs 'ptr to "
14069 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014070
Tony Barbour1fa09702017-03-16 12:09:08 -060014071 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14073
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014074 char const *vsSource =
14075 "#version 450\n"
14076 "\n"
14077 "layout(location=0) out float x[2];\n"
14078 "out gl_PerVertex {\n"
14079 " vec4 gl_Position;\n"
14080 "};\n"
14081 "void main(){\n"
14082 " x[0] = 0; x[1] = 0;\n"
14083 " gl_Position = vec4(1);\n"
14084 "}\n";
14085 char const *fsSource =
14086 "#version 450\n"
14087 "\n"
14088 "layout(location=0) in float x[1];\n"
14089 "layout(location=0) out vec4 color;\n"
14090 "void main(){\n"
14091 " color = vec4(x[0]);\n"
14092 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014093
14094 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14095 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14096
14097 VkPipelineObj pipe(m_device);
14098 pipe.AddColorAttachment();
14099 pipe.AddShader(&vs);
14100 pipe.AddShader(&fs);
14101
14102 VkDescriptorSetObj descriptorSet(m_device);
14103 descriptorSet.AppendDummy();
14104 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14105
14106 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14107
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014108 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014109}
14110
Karl Schultz6addd812016-02-02 17:17:23 -070014111TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014112 TEST_DESCRIPTION(
14113 "Test that an error is produced for mismatched types across "
14114 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014116
Tony Barbour1fa09702017-03-16 12:09:08 -060014117 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014119
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014120 char const *vsSource =
14121 "#version 450\n"
14122 "\n"
14123 "layout(location=0) out int x;\n"
14124 "out gl_PerVertex {\n"
14125 " vec4 gl_Position;\n"
14126 "};\n"
14127 "void main(){\n"
14128 " x = 0;\n"
14129 " gl_Position = vec4(1);\n"
14130 "}\n";
14131 char const *fsSource =
14132 "#version 450\n"
14133 "\n"
14134 "layout(location=0) in float x;\n" /* VS writes int */
14135 "layout(location=0) out vec4 color;\n"
14136 "void main(){\n"
14137 " color = vec4(x);\n"
14138 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014139
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014140 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14141 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014142
14143 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014144 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014145 pipe.AddShader(&vs);
14146 pipe.AddShader(&fs);
14147
Chris Forbesb56af562015-05-25 11:13:17 +120014148 VkDescriptorSetObj descriptorSet(m_device);
14149 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014150 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014151
Tony Barbour5781e8f2015-08-04 16:23:11 -060014152 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014153
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014154 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014155}
14156
Karl Schultz6addd812016-02-02 17:17:23 -070014157TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014158 TEST_DESCRIPTION(
14159 "Test that an error is produced for mismatched types across "
14160 "the vertex->fragment shader interface, when the variable is contained within "
14161 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014163
Tony Barbour1fa09702017-03-16 12:09:08 -060014164 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14166
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014167 char const *vsSource =
14168 "#version 450\n"
14169 "\n"
14170 "out block { layout(location=0) int x; } outs;\n"
14171 "out gl_PerVertex {\n"
14172 " vec4 gl_Position;\n"
14173 "};\n"
14174 "void main(){\n"
14175 " outs.x = 0;\n"
14176 " gl_Position = vec4(1);\n"
14177 "}\n";
14178 char const *fsSource =
14179 "#version 450\n"
14180 "\n"
14181 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14182 "layout(location=0) out vec4 color;\n"
14183 "void main(){\n"
14184 " color = vec4(ins.x);\n"
14185 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014186
14187 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14188 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14189
14190 VkPipelineObj pipe(m_device);
14191 pipe.AddColorAttachment();
14192 pipe.AddShader(&vs);
14193 pipe.AddShader(&fs);
14194
14195 VkDescriptorSetObj descriptorSet(m_device);
14196 descriptorSet.AppendDummy();
14197 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14198
14199 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14200
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014201 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014202}
14203
14204TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014205 TEST_DESCRIPTION(
14206 "Test that an error is produced for location mismatches across "
14207 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14208 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014209 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 +130014210
Tony Barbour1fa09702017-03-16 12:09:08 -060014211 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014212 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14213
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014214 char const *vsSource =
14215 "#version 450\n"
14216 "\n"
14217 "out block { layout(location=1) float x; } outs;\n"
14218 "out gl_PerVertex {\n"
14219 " vec4 gl_Position;\n"
14220 "};\n"
14221 "void main(){\n"
14222 " outs.x = 0;\n"
14223 " gl_Position = vec4(1);\n"
14224 "}\n";
14225 char const *fsSource =
14226 "#version 450\n"
14227 "\n"
14228 "in block { layout(location=0) float x; } ins;\n"
14229 "layout(location=0) out vec4 color;\n"
14230 "void main(){\n"
14231 " color = vec4(ins.x);\n"
14232 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014233
14234 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14235 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14236
14237 VkPipelineObj pipe(m_device);
14238 pipe.AddColorAttachment();
14239 pipe.AddShader(&vs);
14240 pipe.AddShader(&fs);
14241
14242 VkDescriptorSetObj descriptorSet(m_device);
14243 descriptorSet.AppendDummy();
14244 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14245
14246 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14247
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014248 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014249}
14250
14251TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014252 TEST_DESCRIPTION(
14253 "Test that an error is produced for component mismatches across the "
14254 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14255 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014256 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 +130014257
Tony Barbour1fa09702017-03-16 12:09:08 -060014258 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14260
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014261 char const *vsSource =
14262 "#version 450\n"
14263 "\n"
14264 "out block { layout(location=0, component=0) float x; } outs;\n"
14265 "out gl_PerVertex {\n"
14266 " vec4 gl_Position;\n"
14267 "};\n"
14268 "void main(){\n"
14269 " outs.x = 0;\n"
14270 " gl_Position = vec4(1);\n"
14271 "}\n";
14272 char const *fsSource =
14273 "#version 450\n"
14274 "\n"
14275 "in block { layout(location=0, component=1) float x; } ins;\n"
14276 "layout(location=0) out vec4 color;\n"
14277 "void main(){\n"
14278 " color = vec4(ins.x);\n"
14279 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014280
14281 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14282 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14283
14284 VkPipelineObj pipe(m_device);
14285 pipe.AddColorAttachment();
14286 pipe.AddShader(&vs);
14287 pipe.AddShader(&fs);
14288
14289 VkDescriptorSetObj descriptorSet(m_device);
14290 descriptorSet.AppendDummy();
14291 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14292
14293 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14294
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014295 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014296}
14297
Chris Forbes1f3b0152016-11-30 12:48:40 +130014298TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14299 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14300
Tony Barbour1fa09702017-03-16 12:09:08 -060014301 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14303
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014304 char const *vsSource =
14305 "#version 450\n"
14306 "layout(location=0) out mediump float x;\n"
14307 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14308 char const *fsSource =
14309 "#version 450\n"
14310 "layout(location=0) in highp float x;\n"
14311 "layout(location=0) out vec4 color;\n"
14312 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +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 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14327
14328 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14329
14330 m_errorMonitor->VerifyFound();
14331}
14332
Chris Forbes870a39e2016-11-30 12:55:56 +130014333TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14334 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14335
Tony Barbour1fa09702017-03-16 12:09:08 -060014336 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14338
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014339 char const *vsSource =
14340 "#version 450\n"
14341 "out block { layout(location=0) mediump float x; };\n"
14342 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14343 char const *fsSource =
14344 "#version 450\n"
14345 "in block { layout(location=0) highp float x; };\n"
14346 "layout(location=0) out vec4 color;\n"
14347 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014348
14349 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14350 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14351
14352 VkPipelineObj pipe(m_device);
14353 pipe.AddColorAttachment();
14354 pipe.AddShader(&vs);
14355 pipe.AddShader(&fs);
14356
14357 VkDescriptorSetObj descriptorSet(m_device);
14358 descriptorSet.AppendDummy();
14359 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14360
14361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14362
14363 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14364
14365 m_errorMonitor->VerifyFound();
14366}
14367
Karl Schultz6addd812016-02-02 17:17:23 -070014368TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014369 TEST_DESCRIPTION(
14370 "Test that a warning is produced for a vertex attribute which is "
14371 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014373
Tony Barbour1fa09702017-03-16 12:09:08 -060014374 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014376
14377 VkVertexInputBindingDescription input_binding;
14378 memset(&input_binding, 0, sizeof(input_binding));
14379
14380 VkVertexInputAttributeDescription input_attrib;
14381 memset(&input_attrib, 0, sizeof(input_attrib));
14382 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14383
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014384 char const *vsSource =
14385 "#version 450\n"
14386 "\n"
14387 "out gl_PerVertex {\n"
14388 " vec4 gl_Position;\n"
14389 "};\n"
14390 "void main(){\n"
14391 " gl_Position = vec4(1);\n"
14392 "}\n";
14393 char const *fsSource =
14394 "#version 450\n"
14395 "\n"
14396 "layout(location=0) out vec4 color;\n"
14397 "void main(){\n"
14398 " color = vec4(1);\n"
14399 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014400
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014401 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14402 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014403
14404 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014405 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014406 pipe.AddShader(&vs);
14407 pipe.AddShader(&fs);
14408
14409 pipe.AddVertexInputBindings(&input_binding, 1);
14410 pipe.AddVertexInputAttribs(&input_attrib, 1);
14411
Chris Forbesde136e02015-05-25 11:13:28 +120014412 VkDescriptorSetObj descriptorSet(m_device);
14413 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014414 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014415
Tony Barbour5781e8f2015-08-04 16:23:11 -060014416 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014417
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014418 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014419}
14420
Karl Schultz6addd812016-02-02 17:17:23 -070014421TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014422 TEST_DESCRIPTION(
14423 "Test that a warning is produced for a location mismatch on "
14424 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014426
Tony Barbour1fa09702017-03-16 12:09:08 -060014427 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14429
14430 VkVertexInputBindingDescription input_binding;
14431 memset(&input_binding, 0, sizeof(input_binding));
14432
14433 VkVertexInputAttributeDescription input_attrib;
14434 memset(&input_attrib, 0, sizeof(input_attrib));
14435 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14436
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014437 char const *vsSource =
14438 "#version 450\n"
14439 "\n"
14440 "layout(location=1) in float x;\n"
14441 "out gl_PerVertex {\n"
14442 " vec4 gl_Position;\n"
14443 "};\n"
14444 "void main(){\n"
14445 " gl_Position = vec4(x);\n"
14446 "}\n";
14447 char const *fsSource =
14448 "#version 450\n"
14449 "\n"
14450 "layout(location=0) out vec4 color;\n"
14451 "void main(){\n"
14452 " color = vec4(1);\n"
14453 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014454
14455 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14456 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14457
14458 VkPipelineObj pipe(m_device);
14459 pipe.AddColorAttachment();
14460 pipe.AddShader(&vs);
14461 pipe.AddShader(&fs);
14462
14463 pipe.AddVertexInputBindings(&input_binding, 1);
14464 pipe.AddVertexInputAttribs(&input_attrib, 1);
14465
14466 VkDescriptorSetObj descriptorSet(m_device);
14467 descriptorSet.AppendDummy();
14468 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14469
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014470 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014471 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14472
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014473 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014474}
14475
Karl Schultz6addd812016-02-02 17:17:23 -070014476TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014477 TEST_DESCRIPTION(
14478 "Test that an error is produced for a vertex shader input which is not "
14479 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14481 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014482
Tony Barbour1fa09702017-03-16 12:09:08 -060014483 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014486 char const *vsSource =
14487 "#version 450\n"
14488 "\n"
14489 "layout(location=0) in vec4 x;\n" /* not provided */
14490 "out gl_PerVertex {\n"
14491 " vec4 gl_Position;\n"
14492 "};\n"
14493 "void main(){\n"
14494 " gl_Position = x;\n"
14495 "}\n";
14496 char const *fsSource =
14497 "#version 450\n"
14498 "\n"
14499 "layout(location=0) out vec4 color;\n"
14500 "void main(){\n"
14501 " color = vec4(1);\n"
14502 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014503
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014504 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14505 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014506
14507 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014508 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014509 pipe.AddShader(&vs);
14510 pipe.AddShader(&fs);
14511
Chris Forbes62e8e502015-05-25 11:13:29 +120014512 VkDescriptorSetObj descriptorSet(m_device);
14513 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014514 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014515
Tony Barbour5781e8f2015-08-04 16:23:11 -060014516 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014517
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014518 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014519}
14520
Karl Schultz6addd812016-02-02 17:17:23 -070014521TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014522 TEST_DESCRIPTION(
14523 "Test that an error is produced for a mismatch between the "
14524 "fundamental type (float/int/uint) of an attribute and the "
14525 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014526 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 -060014527
Tony Barbour1fa09702017-03-16 12:09:08 -060014528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014530
14531 VkVertexInputBindingDescription input_binding;
14532 memset(&input_binding, 0, sizeof(input_binding));
14533
14534 VkVertexInputAttributeDescription input_attrib;
14535 memset(&input_attrib, 0, sizeof(input_attrib));
14536 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14537
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014538 char const *vsSource =
14539 "#version 450\n"
14540 "\n"
14541 "layout(location=0) in int x;\n" /* attrib provided float */
14542 "out gl_PerVertex {\n"
14543 " vec4 gl_Position;\n"
14544 "};\n"
14545 "void main(){\n"
14546 " gl_Position = vec4(x);\n"
14547 "}\n";
14548 char const *fsSource =
14549 "#version 450\n"
14550 "\n"
14551 "layout(location=0) out vec4 color;\n"
14552 "void main(){\n"
14553 " color = vec4(1);\n"
14554 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014555
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014556 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14557 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014558
14559 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014560 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014561 pipe.AddShader(&vs);
14562 pipe.AddShader(&fs);
14563
14564 pipe.AddVertexInputBindings(&input_binding, 1);
14565 pipe.AddVertexInputAttribs(&input_attrib, 1);
14566
Chris Forbesc97d98e2015-05-25 11:13:31 +120014567 VkDescriptorSetObj descriptorSet(m_device);
14568 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014569 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014570
Tony Barbour5781e8f2015-08-04 16:23:11 -060014571 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014572
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014573 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014574}
14575
Chris Forbesc68b43c2016-04-06 11:18:47 +120014576TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014577 TEST_DESCRIPTION(
14578 "Test that an error is produced for a pipeline containing multiple "
14579 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14581 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014582
Tony Barbour1fa09702017-03-16 12:09:08 -060014583 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14585
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014586 char const *vsSource =
14587 "#version 450\n"
14588 "\n"
14589 "out gl_PerVertex {\n"
14590 " vec4 gl_Position;\n"
14591 "};\n"
14592 "void main(){\n"
14593 " gl_Position = vec4(1);\n"
14594 "}\n";
14595 char const *fsSource =
14596 "#version 450\n"
14597 "\n"
14598 "layout(location=0) out vec4 color;\n"
14599 "void main(){\n"
14600 " color = vec4(1);\n"
14601 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014602
14603 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14604 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14605
14606 VkPipelineObj pipe(m_device);
14607 pipe.AddColorAttachment();
14608 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014609 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014610 pipe.AddShader(&fs);
14611
14612 VkDescriptorSetObj descriptorSet(m_device);
14613 descriptorSet.AppendDummy();
14614 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14615
14616 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14617
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014618 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014619}
14620
Chris Forbes82ff92a2016-09-09 10:50:24 +120014621TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014623
Tony Barbour1fa09702017-03-16 12:09:08 -060014624 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14626
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014627 char const *vsSource =
14628 "#version 450\n"
14629 "out gl_PerVertex {\n"
14630 " vec4 gl_Position;\n"
14631 "};\n"
14632 "void main(){\n"
14633 " gl_Position = vec4(0);\n"
14634 "}\n";
14635 char const *fsSource =
14636 "#version 450\n"
14637 "\n"
14638 "layout(location=0) out vec4 color;\n"
14639 "void main(){\n"
14640 " color = vec4(1);\n"
14641 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014642
14643 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14644 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14645
14646 VkPipelineObj pipe(m_device);
14647 pipe.AddColorAttachment();
14648 pipe.AddShader(&vs);
14649 pipe.AddShader(&fs);
14650
14651 VkDescriptorSetObj descriptorSet(m_device);
14652 descriptorSet.AppendDummy();
14653 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14654
14655 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14656
14657 m_errorMonitor->VerifyFound();
14658}
14659
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014660TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14662 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14663 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014664
Tony Barbour1fa09702017-03-16 12:09:08 -060014665 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014666 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14667
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014668 char const *vsSource =
14669 "#version 450\n"
14670 "void main(){ gl_Position = vec4(0); }\n";
14671 char const *fsSource =
14672 "#version 450\n"
14673 "\n"
14674 "layout(location=0) out vec4 color;\n"
14675 "void main(){\n"
14676 " color = vec4(1);\n"
14677 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014678
14679 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14680 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14681
14682 VkPipelineObj pipe(m_device);
14683 pipe.AddColorAttachment();
14684 pipe.AddShader(&vs);
14685 pipe.AddShader(&fs);
14686
14687 VkDescriptorSetObj descriptorSet(m_device);
14688 descriptorSet.AppendDummy();
14689 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14690
14691 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014692 {
14693 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14694 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14695 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014696 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014697 {
14698 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14699 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14700 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014701 },
14702 };
14703 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014704 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014705 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014706 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14707 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014708 VkRenderPass rp;
14709 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14710 ASSERT_VK_SUCCESS(err);
14711
14712 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14713
14714 m_errorMonitor->VerifyFound();
14715
14716 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14717}
14718
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014719TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014720 TEST_DESCRIPTION(
14721 "Test that an error is produced for a variable output from "
14722 "the TCS without the patch decoration, but consumed in the TES "
14723 "with the decoration.");
14724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14725 "is per-vertex in tessellation control shader stage "
14726 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014727
Tony Barbour1fa09702017-03-16 12:09:08 -060014728 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014729 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14730
Chris Forbesc1e852d2016-04-04 19:26:42 +120014731 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014732 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014733 return;
14734 }
14735
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014736 char const *vsSource =
14737 "#version 450\n"
14738 "void main(){}\n";
14739 char const *tcsSource =
14740 "#version 450\n"
14741 "layout(location=0) out int x[];\n"
14742 "layout(vertices=3) out;\n"
14743 "void main(){\n"
14744 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14745 " gl_TessLevelInner[0] = 1;\n"
14746 " x[gl_InvocationID] = gl_InvocationID;\n"
14747 "}\n";
14748 char const *tesSource =
14749 "#version 450\n"
14750 "layout(triangles, equal_spacing, cw) in;\n"
14751 "layout(location=0) patch in int x;\n"
14752 "out gl_PerVertex { vec4 gl_Position; };\n"
14753 "void main(){\n"
14754 " gl_Position.xyz = gl_TessCoord;\n"
14755 " gl_Position.w = x;\n"
14756 "}\n";
14757 char const *fsSource =
14758 "#version 450\n"
14759 "layout(location=0) out vec4 color;\n"
14760 "void main(){\n"
14761 " color = vec4(1);\n"
14762 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014763
14764 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14765 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14766 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14767 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14768
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014769 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14770 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014771
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014772 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014773
14774 VkPipelineObj pipe(m_device);
14775 pipe.SetInputAssembly(&iasci);
14776 pipe.SetTessellation(&tsci);
14777 pipe.AddColorAttachment();
14778 pipe.AddShader(&vs);
14779 pipe.AddShader(&tcs);
14780 pipe.AddShader(&tes);
14781 pipe.AddShader(&fs);
14782
14783 VkDescriptorSetObj descriptorSet(m_device);
14784 descriptorSet.AppendDummy();
14785 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14786
14787 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14788
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014789 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014790}
14791
Karl Schultz6addd812016-02-02 17:17:23 -070014792TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014793 TEST_DESCRIPTION(
14794 "Test that an error is produced for a vertex attribute setup where multiple "
14795 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14797 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014798
Tony Barbour1fa09702017-03-16 12:09:08 -060014799 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014801
14802 /* Two binding descriptions for binding 0 */
14803 VkVertexInputBindingDescription input_bindings[2];
14804 memset(input_bindings, 0, sizeof(input_bindings));
14805
14806 VkVertexInputAttributeDescription input_attrib;
14807 memset(&input_attrib, 0, sizeof(input_attrib));
14808 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14809
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014810 char const *vsSource =
14811 "#version 450\n"
14812 "\n"
14813 "layout(location=0) in float x;\n" /* attrib provided float */
14814 "out gl_PerVertex {\n"
14815 " vec4 gl_Position;\n"
14816 "};\n"
14817 "void main(){\n"
14818 " gl_Position = vec4(x);\n"
14819 "}\n";
14820 char const *fsSource =
14821 "#version 450\n"
14822 "\n"
14823 "layout(location=0) out vec4 color;\n"
14824 "void main(){\n"
14825 " color = vec4(1);\n"
14826 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014827
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014828 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14829 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014830
14831 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014832 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014833 pipe.AddShader(&vs);
14834 pipe.AddShader(&fs);
14835
14836 pipe.AddVertexInputBindings(input_bindings, 2);
14837 pipe.AddVertexInputAttribs(&input_attrib, 1);
14838
Chris Forbes280ba2c2015-06-12 11:16:41 +120014839 VkDescriptorSetObj descriptorSet(m_device);
14840 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014841 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014842
Tony Barbour5781e8f2015-08-04 16:23:11 -060014843 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014844
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014845 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014846}
Chris Forbes8f68b562015-05-25 11:13:32 +120014847
Karl Schultz6addd812016-02-02 17:17:23 -070014848TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014849 TEST_DESCRIPTION(
14850 "Test that an error is produced for a fragment shader which does not "
14851 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014853
Tony Barbour1fa09702017-03-16 12:09:08 -060014854 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014855
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014856 char const *vsSource =
14857 "#version 450\n"
14858 "\n"
14859 "out gl_PerVertex {\n"
14860 " vec4 gl_Position;\n"
14861 "};\n"
14862 "void main(){\n"
14863 " gl_Position = vec4(1);\n"
14864 "}\n";
14865 char const *fsSource =
14866 "#version 450\n"
14867 "\n"
14868 "void main(){\n"
14869 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014870
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014871 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14872 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014873
14874 VkPipelineObj pipe(m_device);
14875 pipe.AddShader(&vs);
14876 pipe.AddShader(&fs);
14877
Chia-I Wu08accc62015-07-07 11:50:03 +080014878 /* set up CB 0, not written */
14879 pipe.AddColorAttachment();
14880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014881
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014882 VkDescriptorSetObj descriptorSet(m_device);
14883 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014884 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014885
Tony Barbour5781e8f2015-08-04 16:23:11 -060014886 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014887
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014888 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014889}
14890
Karl Schultz6addd812016-02-02 17:17:23 -070014891TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014892 TEST_DESCRIPTION(
14893 "Test that a warning is produced for a fragment shader which provides a spurious "
14894 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014896 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014897
Tony Barbour1fa09702017-03-16 12:09:08 -060014898 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014899
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014900 char const *vsSource =
14901 "#version 450\n"
14902 "\n"
14903 "out gl_PerVertex {\n"
14904 " vec4 gl_Position;\n"
14905 "};\n"
14906 "void main(){\n"
14907 " gl_Position = vec4(1);\n"
14908 "}\n";
14909 char const *fsSource =
14910 "#version 450\n"
14911 "\n"
14912 "layout(location=0) out vec4 x;\n"
14913 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14914 "void main(){\n"
14915 " x = vec4(1);\n"
14916 " y = vec4(1);\n"
14917 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014918
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014919 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14920 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014921
14922 VkPipelineObj pipe(m_device);
14923 pipe.AddShader(&vs);
14924 pipe.AddShader(&fs);
14925
Chia-I Wu08accc62015-07-07 11:50:03 +080014926 /* set up CB 0, not written */
14927 pipe.AddColorAttachment();
14928 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014929 /* FS writes CB 1, but we don't configure it */
14930
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014931 VkDescriptorSetObj descriptorSet(m_device);
14932 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014933 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014934
Tony Barbour5781e8f2015-08-04 16:23:11 -060014935 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014936
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014937 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014938}
14939
Karl Schultz6addd812016-02-02 17:17:23 -070014940TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014941 TEST_DESCRIPTION(
14942 "Test that an error is produced for a mismatch between the fundamental "
14943 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014945
Tony Barbour1fa09702017-03-16 12:09:08 -060014946 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014947
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014948 char const *vsSource =
14949 "#version 450\n"
14950 "\n"
14951 "out gl_PerVertex {\n"
14952 " vec4 gl_Position;\n"
14953 "};\n"
14954 "void main(){\n"
14955 " gl_Position = vec4(1);\n"
14956 "}\n";
14957 char const *fsSource =
14958 "#version 450\n"
14959 "\n"
14960 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14961 "void main(){\n"
14962 " x = ivec4(1);\n"
14963 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014964
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014965 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14966 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014967
14968 VkPipelineObj pipe(m_device);
14969 pipe.AddShader(&vs);
14970 pipe.AddShader(&fs);
14971
Chia-I Wu08accc62015-07-07 11:50:03 +080014972 /* set up CB 0; type is UNORM by default */
14973 pipe.AddColorAttachment();
14974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014975
Chris Forbesa36d69e2015-05-25 11:13:44 +120014976 VkDescriptorSetObj descriptorSet(m_device);
14977 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014978 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014979
Tony Barbour5781e8f2015-08-04 16:23:11 -060014980 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014981
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014982 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014983}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014984
Karl Schultz6addd812016-02-02 17:17:23 -070014985TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014986 TEST_DESCRIPTION(
14987 "Test that an error is produced for a shader consuming a uniform "
14988 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014990
Tony Barbour1fa09702017-03-16 12:09:08 -060014991 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120014992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014993 char const *vsSource =
14994 "#version 450\n"
14995 "\n"
14996 "out gl_PerVertex {\n"
14997 " vec4 gl_Position;\n"
14998 "};\n"
14999 "void main(){\n"
15000 " gl_Position = vec4(1);\n"
15001 "}\n";
15002 char const *fsSource =
15003 "#version 450\n"
15004 "\n"
15005 "layout(location=0) out vec4 x;\n"
15006 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15007 "void main(){\n"
15008 " x = vec4(bar.y);\n"
15009 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015010
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015011 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15012 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015013
Chris Forbes556c76c2015-08-14 12:04:59 +120015014 VkPipelineObj pipe(m_device);
15015 pipe.AddShader(&vs);
15016 pipe.AddShader(&fs);
15017
15018 /* set up CB 0; type is UNORM by default */
15019 pipe.AddColorAttachment();
15020 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15021
15022 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015023 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015024
15025 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15026
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015027 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015028}
15029
Chris Forbes5c59e902016-02-26 16:56:09 +130015030TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015031 TEST_DESCRIPTION(
15032 "Test that an error is produced for a shader consuming push constants "
15033 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015035
Tony Barbour1fa09702017-03-16 12:09:08 -060015036 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015037
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015038 char const *vsSource =
15039 "#version 450\n"
15040 "\n"
15041 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15042 "out gl_PerVertex {\n"
15043 " vec4 gl_Position;\n"
15044 "};\n"
15045 "void main(){\n"
15046 " gl_Position = vec4(consts.x);\n"
15047 "}\n";
15048 char const *fsSource =
15049 "#version 450\n"
15050 "\n"
15051 "layout(location=0) out vec4 x;\n"
15052 "void main(){\n"
15053 " x = vec4(1);\n"
15054 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015055
15056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15058
15059 VkPipelineObj pipe(m_device);
15060 pipe.AddShader(&vs);
15061 pipe.AddShader(&fs);
15062
15063 /* set up CB 0; type is UNORM by default */
15064 pipe.AddColorAttachment();
15065 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15066
15067 VkDescriptorSetObj descriptorSet(m_device);
15068 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15069
15070 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15071
15072 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015073 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015074}
15075
Chris Forbes3fb17902016-08-22 14:57:55 +120015076TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015077 TEST_DESCRIPTION(
15078 "Test that an error is produced for a shader consuming an input attachment "
15079 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15081 "consumes input attachment index 0 but not provided in subpass");
15082
Tony Barbour1fa09702017-03-16 12:09:08 -060015083 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015084
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015085 char const *vsSource =
15086 "#version 450\n"
15087 "\n"
15088 "out gl_PerVertex {\n"
15089 " vec4 gl_Position;\n"
15090 "};\n"
15091 "void main(){\n"
15092 " gl_Position = vec4(1);\n"
15093 "}\n";
15094 char const *fsSource =
15095 "#version 450\n"
15096 "\n"
15097 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15098 "layout(location=0) out vec4 color;\n"
15099 "void main() {\n"
15100 " color = subpassLoad(x);\n"
15101 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015102
15103 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15104 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15105
15106 VkPipelineObj pipe(m_device);
15107 pipe.AddShader(&vs);
15108 pipe.AddShader(&fs);
15109 pipe.AddColorAttachment();
15110 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15111
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015112 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15113 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015114 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015115 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015116 ASSERT_VK_SUCCESS(err);
15117
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015118 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015119 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015120 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015121 ASSERT_VK_SUCCESS(err);
15122
15123 // error here.
15124 pipe.CreateVKPipeline(pl, renderPass());
15125
15126 m_errorMonitor->VerifyFound();
15127
15128 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15129 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15130}
15131
Chris Forbes5a9a0472016-08-22 16:02:09 +120015132TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015133 TEST_DESCRIPTION(
15134 "Test that an error is produced for a shader consuming an input attachment "
15135 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15137 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15138
Tony Barbour1fa09702017-03-16 12:09:08 -060015139 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015140
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015141 char const *vsSource =
15142 "#version 450\n"
15143 "\n"
15144 "out gl_PerVertex {\n"
15145 " vec4 gl_Position;\n"
15146 "};\n"
15147 "void main(){\n"
15148 " gl_Position = vec4(1);\n"
15149 "}\n";
15150 char const *fsSource =
15151 "#version 450\n"
15152 "\n"
15153 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15154 "layout(location=0) out vec4 color;\n"
15155 "void main() {\n"
15156 " color = subpassLoad(x);\n"
15157 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015158
15159 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15160 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15161
15162 VkPipelineObj pipe(m_device);
15163 pipe.AddShader(&vs);
15164 pipe.AddShader(&fs);
15165 pipe.AddColorAttachment();
15166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15167
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015168 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15169 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015170 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015171 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015172 ASSERT_VK_SUCCESS(err);
15173
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015174 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015175 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015176 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015177 ASSERT_VK_SUCCESS(err);
15178
15179 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015180 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15181 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15182 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15183 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15184 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 +120015185 };
15186 VkAttachmentReference color = {
15187 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15188 };
15189 VkAttachmentReference input = {
15190 1, VK_IMAGE_LAYOUT_GENERAL,
15191 };
15192
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015193 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015194
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015195 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015196 VkRenderPass rp;
15197 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15198 ASSERT_VK_SUCCESS(err);
15199
15200 // error here.
15201 pipe.CreateVKPipeline(pl, rp);
15202
15203 m_errorMonitor->VerifyFound();
15204
15205 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15206 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15207 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15208}
15209
Chris Forbes541f7b02016-08-22 15:30:27 +120015210TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015211 TEST_DESCRIPTION(
15212 "Test that an error is produced for a shader consuming an input attachment "
15213 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015215 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015216
Tony Barbour1fa09702017-03-16 12:09:08 -060015217 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015218
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015219 char const *vsSource =
15220 "#version 450\n"
15221 "\n"
15222 "out gl_PerVertex {\n"
15223 " vec4 gl_Position;\n"
15224 "};\n"
15225 "void main(){\n"
15226 " gl_Position = vec4(1);\n"
15227 "}\n";
15228 char const *fsSource =
15229 "#version 450\n"
15230 "\n"
15231 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15232 "layout(location=0) out vec4 color;\n"
15233 "void main() {\n"
15234 " color = subpassLoad(xs[0]);\n"
15235 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015236
15237 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15239
15240 VkPipelineObj pipe(m_device);
15241 pipe.AddShader(&vs);
15242 pipe.AddShader(&fs);
15243 pipe.AddColorAttachment();
15244 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15245
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015246 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15247 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015248 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015249 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015250 ASSERT_VK_SUCCESS(err);
15251
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015252 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015253 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015254 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015255 ASSERT_VK_SUCCESS(err);
15256
15257 // error here.
15258 pipe.CreateVKPipeline(pl, renderPass());
15259
15260 m_errorMonitor->VerifyFound();
15261
15262 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15263 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15264}
15265
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015266TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015267 TEST_DESCRIPTION(
15268 "Test that an error is produced for a compute pipeline consuming a "
15269 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015271
Tony Barbour1fa09702017-03-16 12:09:08 -060015272 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015273
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015274 char const *csSource =
15275 "#version 450\n"
15276 "\n"
15277 "layout(local_size_x=1) in;\n"
15278 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15279 "void main(){\n"
15280 " x = vec4(1);\n"
15281 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015282
15283 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15284
15285 VkDescriptorSetObj descriptorSet(m_device);
15286 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15287
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015288 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15289 nullptr,
15290 0,
15291 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15292 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15293 descriptorSet.GetPipelineLayout(),
15294 VK_NULL_HANDLE,
15295 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015296
15297 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015298 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015299
15300 m_errorMonitor->VerifyFound();
15301
15302 if (err == VK_SUCCESS) {
15303 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15304 }
15305}
15306
Chris Forbes22a9b092016-07-19 14:34:05 +120015307TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015308 TEST_DESCRIPTION(
15309 "Test that an error is produced for a pipeline consuming a "
15310 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15312 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015313
Tony Barbour1fa09702017-03-16 12:09:08 -060015314 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015315
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015316 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15317 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015318 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015319 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015320 ASSERT_VK_SUCCESS(err);
15321
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015322 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015323 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015324 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015325 ASSERT_VK_SUCCESS(err);
15326
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015327 char const *csSource =
15328 "#version 450\n"
15329 "\n"
15330 "layout(local_size_x=1) in;\n"
15331 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15332 "void main() {\n"
15333 " x.x = 1.0f;\n"
15334 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015335 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15336
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015337 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15338 nullptr,
15339 0,
15340 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15341 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15342 pl,
15343 VK_NULL_HANDLE,
15344 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015345
15346 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015347 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015348
15349 m_errorMonitor->VerifyFound();
15350
15351 if (err == VK_SUCCESS) {
15352 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15353 }
15354
15355 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15356 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15357}
15358
Chris Forbes50020592016-07-27 13:52:41 +120015359TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015360 TEST_DESCRIPTION(
15361 "Test that an error is produced when an image view type "
15362 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015363
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015364 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 +120015365
Tony Barbour1fa09702017-03-16 12:09:08 -060015366 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15368
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015369 char const *vsSource =
15370 "#version 450\n"
15371 "\n"
15372 "out gl_PerVertex { vec4 gl_Position; };\n"
15373 "void main() { gl_Position = vec4(0); }\n";
15374 char const *fsSource =
15375 "#version 450\n"
15376 "\n"
15377 "layout(set=0, binding=0) uniform sampler3D s;\n"
15378 "layout(location=0) out vec4 color;\n"
15379 "void main() {\n"
15380 " color = texture(s, vec3(0));\n"
15381 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015382 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15383 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15384
15385 VkPipelineObj pipe(m_device);
15386 pipe.AddShader(&vs);
15387 pipe.AddShader(&fs);
15388 pipe.AddColorAttachment();
15389
15390 VkTextureObj texture(m_device, nullptr);
15391 VkSamplerObj sampler(m_device);
15392
15393 VkDescriptorSetObj descriptorSet(m_device);
15394 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15395 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15396
15397 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15398 ASSERT_VK_SUCCESS(err);
15399
Tony Barbour552f6c02016-12-21 14:34:07 -070015400 m_commandBuffer->BeginCommandBuffer();
15401 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015402
15403 m_commandBuffer->BindPipeline(pipe);
15404 m_commandBuffer->BindDescriptorSet(descriptorSet);
15405
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015406 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015407 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015408 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015409 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15410
15411 // error produced here.
15412 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15413
15414 m_errorMonitor->VerifyFound();
15415
Tony Barbour552f6c02016-12-21 14:34:07 -070015416 m_commandBuffer->EndRenderPass();
15417 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015418}
15419
Chris Forbes5533bfc2016-07-27 14:12:34 +120015420TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015421 TEST_DESCRIPTION(
15422 "Test that an error is produced when a multisampled images "
15423 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015424
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015426
Tony Barbour1fa09702017-03-16 12:09:08 -060015427 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15429
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015430 char const *vsSource =
15431 "#version 450\n"
15432 "\n"
15433 "out gl_PerVertex { vec4 gl_Position; };\n"
15434 "void main() { gl_Position = vec4(0); }\n";
15435 char const *fsSource =
15436 "#version 450\n"
15437 "\n"
15438 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15439 "layout(location=0) out vec4 color;\n"
15440 "void main() {\n"
15441 " color = texelFetch(s, ivec2(0), 0);\n"
15442 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015443 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15444 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15445
15446 VkPipelineObj pipe(m_device);
15447 pipe.AddShader(&vs);
15448 pipe.AddShader(&fs);
15449 pipe.AddColorAttachment();
15450
15451 VkTextureObj texture(m_device, nullptr);
15452 VkSamplerObj sampler(m_device);
15453
15454 VkDescriptorSetObj descriptorSet(m_device);
15455 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15456 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15457
15458 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15459 ASSERT_VK_SUCCESS(err);
15460
Tony Barbour552f6c02016-12-21 14:34:07 -070015461 m_commandBuffer->BeginCommandBuffer();
15462 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015463
15464 m_commandBuffer->BindPipeline(pipe);
15465 m_commandBuffer->BindDescriptorSet(descriptorSet);
15466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015467 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015468 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015469 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015470 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15471
15472 // error produced here.
15473 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15474
15475 m_errorMonitor->VerifyFound();
15476
Tony Barbour552f6c02016-12-21 14:34:07 -070015477 m_commandBuffer->EndRenderPass();
15478 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015479}
15480
Mark Youngc48c4c12016-04-11 14:26:49 -060015481TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015482 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015483
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015484 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15485 {
15486 VkFormatProperties properties;
15487 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15488 if (properties.optimalTilingFeatures == 0) {
15489 printf(" Image format not supported; skipped.\n");
15490 return;
15491 }
15492 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015493
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015494 VkImageCreateInfo info = {};
15495 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15496 info.pNext = NULL;
15497 info.imageType = VK_IMAGE_TYPE_2D;
15498 info.format = format;
15499 info.extent.height = 32;
15500 info.extent.depth = 1;
15501 info.mipLevels = 1;
15502 info.arrayLayers = 1;
15503 info.samples = VK_SAMPLE_COUNT_1_BIT;
15504 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15505 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15506 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015507
15508 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015509 {
15510 VkImageFormatProperties properties;
15511 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15512 info.tiling, info.usage, info.flags, &properties);
15513 ASSERT_VK_SUCCESS(result);
15514 info.extent.width = properties.maxExtent.width + 1;
15515 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015516
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015517 VkImage image;
15518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15519 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015520 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015521}
15522
Mark Youngc48c4c12016-04-11 14:26:49 -060015523TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015524 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015525
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015526 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15527 {
15528 VkFormatProperties properties;
15529 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15530 if (properties.optimalTilingFeatures == 0) {
15531 printf(" Image format not supported; skipped.\n");
15532 return;
15533 }
15534 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015535
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015536 VkImageCreateInfo info = {};
15537 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15538 info.pNext = NULL;
15539 info.imageType = VK_IMAGE_TYPE_2D;
15540 info.format = format;
15541 info.extent.height = 32;
15542 info.extent.depth = 1;
15543 info.mipLevels = 1;
15544 info.arrayLayers = 1;
15545 info.samples = VK_SAMPLE_COUNT_1_BIT;
15546 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15547 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15548 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015549
15550 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015551 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015552
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015553 VkImage image;
15554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15555 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15556 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015557 m_errorMonitor->VerifyFound();
15558}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015559
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015560TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015561 TEST_DESCRIPTION(
15562 "Create a render pass with an attachment description "
15563 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015564
Tony Barbour1fa09702017-03-16 12:09:08 -060015565 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15567
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015569
15570 VkAttachmentReference color_attach = {};
15571 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15572 color_attach.attachment = 0;
15573 VkSubpassDescription subpass = {};
15574 subpass.colorAttachmentCount = 1;
15575 subpass.pColorAttachments = &color_attach;
15576
15577 VkRenderPassCreateInfo rpci = {};
15578 rpci.subpassCount = 1;
15579 rpci.pSubpasses = &subpass;
15580 rpci.attachmentCount = 1;
15581 VkAttachmentDescription attach_desc = {};
15582 attach_desc.format = VK_FORMAT_UNDEFINED;
15583 rpci.pAttachments = &attach_desc;
15584 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15585 VkRenderPass rp;
15586 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15587
15588 m_errorMonitor->VerifyFound();
15589
15590 if (result == VK_SUCCESS) {
15591 vkDestroyRenderPass(m_device->device(), rp, NULL);
15592 }
15593}
15594
Karl Schultz6addd812016-02-02 17:17:23 -070015595TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015596 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015597
Mike Stroyana3082432015-09-25 13:39:21 -060015598 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015599 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15600 const int32_t tex_width = 32;
15601 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015602
15603 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015604 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15605 image_create_info.pNext = NULL;
15606 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15607 image_create_info.format = tex_format;
15608 image_create_info.extent.width = tex_width;
15609 image_create_info.extent.height = tex_height;
15610 image_create_info.extent.depth = 1;
15611 image_create_info.mipLevels = 1;
15612 image_create_info.arrayLayers = 1;
15613 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15614 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15615 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15616 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015617
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015618 VkImage image;
15619 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015620 ASSERT_VK_SUCCESS(err);
15621
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015622 VkMemoryRequirements requirements;
15623 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15624
15625 VkMemoryAllocateInfo alloc_info{};
15626 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15627 alloc_info.pNext = NULL;
15628 alloc_info.memoryTypeIndex = 0;
15629 alloc_info.allocationSize = requirements.size;
15630 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15631 ASSERT_TRUE(pass);
15632
15633 VkDeviceMemory memory;
15634 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15635 ASSERT_VK_SUCCESS(err);
15636
15637 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15638
Tobin Ehliscde08892015-09-22 10:11:37 -060015639 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015640 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015641 image_view_create_info.image = image;
15642 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15643 image_view_create_info.format = tex_format;
15644 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015645 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015646 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015647 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015648
15649 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015651 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015652 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015653
15654 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015655 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015656}
Mike Stroyana3082432015-09-25 13:39:21 -060015657
Mark Youngd339ba32016-05-30 13:28:35 -060015658TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15659 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015661 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015662
Tony Barbour1fa09702017-03-16 12:09:08 -060015663 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015664
15665 // Create an image and try to create a view with no memory backing the image
15666 VkImage image;
15667
15668 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15669 const int32_t tex_width = 32;
15670 const int32_t tex_height = 32;
15671
15672 VkImageCreateInfo image_create_info = {};
15673 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15674 image_create_info.pNext = NULL;
15675 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15676 image_create_info.format = tex_format;
15677 image_create_info.extent.width = tex_width;
15678 image_create_info.extent.height = tex_height;
15679 image_create_info.extent.depth = 1;
15680 image_create_info.mipLevels = 1;
15681 image_create_info.arrayLayers = 1;
15682 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15683 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15684 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15685 image_create_info.flags = 0;
15686
15687 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15688 ASSERT_VK_SUCCESS(err);
15689
15690 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015691 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015692 image_view_create_info.image = image;
15693 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15694 image_view_create_info.format = tex_format;
15695 image_view_create_info.subresourceRange.layerCount = 1;
15696 image_view_create_info.subresourceRange.baseMipLevel = 0;
15697 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015698 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015699
15700 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015701 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015702
15703 m_errorMonitor->VerifyFound();
15704 vkDestroyImage(m_device->device(), image, NULL);
15705 // If last error is success, it still created the view, so delete it.
15706 if (err == VK_SUCCESS) {
15707 vkDestroyImageView(m_device->device(), view, NULL);
15708 }
Mark Youngd339ba32016-05-30 13:28:35 -060015709}
15710
Karl Schultz6addd812016-02-02 17:17:23 -070015711TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015712 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015714
Tony Barbour1fa09702017-03-16 12:09:08 -060015715 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015716
Karl Schultz6addd812016-02-02 17:17:23 -070015717 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015718 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015719 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015720 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015721
15722 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015723 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015724 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015725 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15726 image_view_create_info.format = tex_format;
15727 image_view_create_info.subresourceRange.baseMipLevel = 0;
15728 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015729 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015730 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015731 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015732
15733 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015734 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015735
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015736 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015737}
15738
Mike Weiblena1e13f42017-02-09 21:25:59 -070015739TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15740 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15741
Tony Barbour1fa09702017-03-16 12:09:08 -060015742 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015743 VkSubresourceLayout subres_layout = {};
15744
15745 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15746 {
15747 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15748 VkImageObj img(m_device);
15749 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15750 ASSERT_TRUE(img.initialized());
15751
15752 VkImageSubresource subres = {};
15753 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15754 subres.mipLevel = 0;
15755 subres.arrayLayer = 0;
15756
15757 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15758 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15759 m_errorMonitor->VerifyFound();
15760 }
15761
15762 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15763 {
15764 VkImageObj img(m_device);
15765 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15766 ASSERT_TRUE(img.initialized());
15767
15768 VkImageSubresource subres = {};
15769 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15770 subres.mipLevel = 0;
15771 subres.arrayLayer = 0;
15772
15773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15774 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15775 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15776 m_errorMonitor->VerifyFound();
15777 }
15778
15779 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15780 {
15781 VkImageObj img(m_device);
15782 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15783 ASSERT_TRUE(img.initialized());
15784
15785 VkImageSubresource subres = {};
15786 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15787 subres.mipLevel = 1; // ERROR: triggers VU 00739
15788 subres.arrayLayer = 0;
15789
15790 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15791 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15792 m_errorMonitor->VerifyFound();
15793 }
15794
15795 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15796 {
15797 VkImageObj img(m_device);
15798 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15799 ASSERT_TRUE(img.initialized());
15800
15801 VkImageSubresource subres = {};
15802 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15803 subres.mipLevel = 0;
15804 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15805
15806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15807 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15808 m_errorMonitor->VerifyFound();
15809 }
15810}
15811
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015812TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015813 VkResult err;
15814 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015815
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015817
Tony Barbour1fa09702017-03-16 12:09:08 -060015818 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015819
15820 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015821 VkImage srcImage;
15822 VkImage dstImage;
15823 VkDeviceMemory srcMem;
15824 VkDeviceMemory destMem;
15825 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015826
15827 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015828 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15829 image_create_info.pNext = NULL;
15830 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15831 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15832 image_create_info.extent.width = 32;
15833 image_create_info.extent.height = 32;
15834 image_create_info.extent.depth = 1;
15835 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015836 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015837 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15838 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15839 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15840 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015841
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015842 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015843 ASSERT_VK_SUCCESS(err);
15844
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015845 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015846 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015847 ASSERT_VK_SUCCESS(err);
15848
15849 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015850 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015851 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15852 memAlloc.pNext = NULL;
15853 memAlloc.allocationSize = 0;
15854 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015855
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015856 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015857 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015858 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015859 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015860 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015861 ASSERT_VK_SUCCESS(err);
15862
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015863 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015864 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015865 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015866 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015867 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015868 ASSERT_VK_SUCCESS(err);
15869
15870 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15871 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015872 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015873 ASSERT_VK_SUCCESS(err);
15874
Tony Barbour552f6c02016-12-21 14:34:07 -070015875 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015876 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015877 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015878 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015879 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015880 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015881 copyRegion.srcOffset.x = 0;
15882 copyRegion.srcOffset.y = 0;
15883 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015884 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015885 copyRegion.dstSubresource.mipLevel = 0;
15886 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015887 // Introduce failure by forcing the dst layerCount to differ from src
15888 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015889 copyRegion.dstOffset.x = 0;
15890 copyRegion.dstOffset.y = 0;
15891 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015892 copyRegion.extent.width = 1;
15893 copyRegion.extent.height = 1;
15894 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015895 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015896 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015897
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015898 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015899
Chia-I Wuf7458c52015-10-26 21:10:41 +080015900 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015901 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015902 vkFreeMemory(m_device->device(), srcMem, NULL);
15903 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015904}
15905
Tony Barbourd6673642016-05-05 14:46:39 -060015906TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015907 TEST_DESCRIPTION("Creating images with unsuported formats ");
15908
Tony Barbour1fa09702017-03-16 12:09:08 -060015909 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015910 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015911
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015912 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015913 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015914 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015915 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15916 image_create_info.format = VK_FORMAT_UNDEFINED;
15917 image_create_info.extent.width = 32;
15918 image_create_info.extent.height = 32;
15919 image_create_info.extent.depth = 1;
15920 image_create_info.mipLevels = 1;
15921 image_create_info.arrayLayers = 1;
15922 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15923 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15924 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15927 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015928
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015929 VkImage image;
15930 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015931 m_errorMonitor->VerifyFound();
15932
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015933 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015934 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015935 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15936 VkFormat format = static_cast<VkFormat>(f);
15937 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015938 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015939 unsupported = format;
15940 break;
15941 }
15942 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015943
Tony Barbourd6673642016-05-05 14:46:39 -060015944 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015945 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015947
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015948 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015949 m_errorMonitor->VerifyFound();
15950 }
15951}
15952
15953TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015954 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15955
Tony Barbour1fa09702017-03-16 12:09:08 -060015956 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060015957 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070015958 if (!depth_format) {
15959 return;
15960 }
Tony Barbourd6673642016-05-05 14:46:39 -060015961
15962 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015963 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060015964 VK_IMAGE_TILING_OPTIMAL, 0);
15965 ASSERT_TRUE(image.initialized());
15966
15967 VkImageView imgView;
15968 VkImageViewCreateInfo imgViewInfo = {};
15969 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15970 imgViewInfo.image = image.handle();
15971 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15972 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15973 imgViewInfo.subresourceRange.layerCount = 1;
15974 imgViewInfo.subresourceRange.baseMipLevel = 0;
15975 imgViewInfo.subresourceRange.levelCount = 1;
15976 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15977
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015978 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015979 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015980 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015981 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15982 m_errorMonitor->VerifyFound();
15983 imgViewInfo.subresourceRange.baseMipLevel = 0;
15984
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015985 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015986 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015988 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15989 m_errorMonitor->VerifyFound();
15990 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15991
Tony Barbourd6673642016-05-05 14:46:39 -060015992 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15993 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015995 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15996 m_errorMonitor->VerifyFound();
15997 imgViewInfo.subresourceRange.levelCount = 1;
15998
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015999 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16000 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016001 m_errorMonitor->SetDesiredFailureMsg(
16002 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16003 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016004 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16005 m_errorMonitor->VerifyFound();
16006 imgViewInfo.subresourceRange.layerCount = 1;
16007
Tony Barbourd6673642016-05-05 14:46:39 -060016008 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016009 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016010 m_errorMonitor->SetDesiredFailureMsg(
16011 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16012 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016013 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16014 m_errorMonitor->VerifyFound();
16015 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16016
Tony Barbourd6673642016-05-05 14:46:39 -060016017 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16018 // VIEW_CREATE_ERROR
16019 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016020 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016021 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16022 m_errorMonitor->VerifyFound();
16023 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16024
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016025 // TODO: Update framework to easily passing mutable flag into ImageObj init
16026 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016027 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16028 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16029 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016030 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16031 // VIEW_CREATE_ERROR
16032 VkImageCreateInfo mutImgInfo = image.create_info();
16033 VkImage mutImage;
16034 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016035 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016036 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16037 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016038 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016039 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016040
16041 VkMemoryRequirements requirements;
16042 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16043
16044 VkMemoryAllocateInfo alloc_info{};
16045 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16046 alloc_info.pNext = NULL;
16047 alloc_info.memoryTypeIndex = 0;
16048 alloc_info.allocationSize = requirements.size;
16049 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16050 ASSERT_TRUE(pass);
16051
16052 VkDeviceMemory memory;
16053 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16054 ASSERT_VK_SUCCESS(ret);
16055
16056 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16057 ASSERT_VK_SUCCESS(ret);
16058
Tony Barbourd6673642016-05-05 14:46:39 -060016059 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016061 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16062 m_errorMonitor->VerifyFound();
16063 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016064
16065 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016066 vkDestroyImage(m_device->handle(), mutImage, NULL);
16067}
16068
Dave Houlton75967fc2017-03-06 17:21:16 -070016069TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16070 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16071
Tony Barbour1fa09702017-03-16 12:09:08 -060016072 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016073
Jamie Madill35127872017-03-15 16:17:46 -040016074 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016075 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16076 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16077 if (device_features.textureCompressionBC) {
16078 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16079 } else if (device_features.textureCompressionETC2) {
16080 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16081 } else if (device_features.textureCompressionASTC_LDR) {
16082 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16083 } else {
16084 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16085 return;
16086 }
16087
16088 VkImageCreateInfo ci;
16089 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16090 ci.pNext = NULL;
16091 ci.flags = 0;
16092 ci.imageType = VK_IMAGE_TYPE_2D;
16093 ci.format = compressed_format;
16094 ci.extent = {32, 32, 1};
16095 ci.mipLevels = 6;
16096 ci.arrayLayers = 1;
16097 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16098 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16099 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16100 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16101 ci.queueFamilyIndexCount = 0;
16102 ci.pQueueFamilyIndices = NULL;
16103 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16104
16105 VkImageObj image(m_device);
16106 image.init(&ci);
16107 ASSERT_TRUE(image.initialized());
16108
16109 VkImageObj odd_image(m_device);
16110 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16111 odd_image.init(&ci);
16112 ASSERT_TRUE(odd_image.initialized());
16113
16114 // Allocate buffers
16115 VkMemoryPropertyFlags reqs = 0;
16116 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16117 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16118 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16119 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16120 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16121
16122 VkBufferImageCopy region = {};
16123 region.bufferRowLength = 0;
16124 region.bufferImageHeight = 0;
16125 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16126 region.imageSubresource.layerCount = 1;
16127 region.imageOffset = {0, 0, 0};
16128 region.bufferOffset = 0;
16129
16130 // start recording
16131 m_commandBuffer->BeginCommandBuffer();
16132
16133 // Mip level copies that work - 5 levels
16134 m_errorMonitor->ExpectSuccess();
16135
16136 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16137 region.imageExtent = {32, 32, 1};
16138 region.imageSubresource.mipLevel = 0;
16139 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16140 &region);
16141 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16142 &region);
16143
16144 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16145 region.imageExtent = {8, 8, 1};
16146 region.imageSubresource.mipLevel = 2;
16147 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16148 &region);
16149 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16150 &region);
16151
16152 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16153 region.imageExtent = {4, 4, 1};
16154 region.imageSubresource.mipLevel = 3;
16155 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16156 &region);
16157 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16158 &region);
16159
16160 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16161 region.imageExtent = {2, 2, 1};
16162 region.imageSubresource.mipLevel = 4;
16163 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16164 &region);
16165 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16166 &region);
16167
16168 region.imageExtent = {1, 1, 1};
16169 region.imageSubresource.mipLevel = 5;
16170 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16171 &region);
16172 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16173 &region);
16174 m_errorMonitor->VerifyNotFound();
16175
16176 // Buffer must accomodate a full compressed block, regardless of texel count
16177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16178 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16179 &region);
16180 m_errorMonitor->VerifyFound();
16181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16182 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16183 &region);
16184 m_errorMonitor->VerifyFound();
16185
16186 // Copy width < compressed block size, but not the full mip width
16187 region.imageExtent = {1, 2, 1};
16188 region.imageSubresource.mipLevel = 4;
16189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16190 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16191 &region);
16192 m_errorMonitor->VerifyFound();
16193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16194 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16195 &region);
16196 m_errorMonitor->VerifyFound();
16197
16198 // Copy height < compressed block size but not the full mip height
16199 region.imageExtent = {2, 1, 1};
16200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16201 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16202 &region);
16203 m_errorMonitor->VerifyFound();
16204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16205 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16206 &region);
16207 m_errorMonitor->VerifyFound();
16208
16209 // Offsets must be multiple of compressed block size
16210 region.imageOffset = {1, 1, 0};
16211 region.imageExtent = {1, 1, 1};
16212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16213 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16214 &region);
16215 m_errorMonitor->VerifyFound();
16216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16217 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16218 &region);
16219 m_errorMonitor->VerifyFound();
16220
16221 // Offset + extent width = mip width - should succeed
16222 region.imageOffset = {4, 4, 0};
16223 region.imageExtent = {3, 4, 1};
16224 region.imageSubresource.mipLevel = 2;
16225 m_errorMonitor->ExpectSuccess();
16226 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16227 &region);
16228 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16229 &region);
16230 m_errorMonitor->VerifyNotFound();
16231
16232 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16233 region.imageExtent = {4, 4, 1};
16234 m_errorMonitor->ExpectSuccess();
16235 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16236 &region);
16237 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16238 &region);
16239 m_errorMonitor->VerifyNotFound();
16240
16241 // Offset + extent width < mip width and not a multiple of block width - should fail
16242 region.imageExtent = {3, 3, 1};
16243 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16244 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16245 &region);
16246 m_errorMonitor->VerifyFound();
16247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16248 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16249 &region);
16250 m_errorMonitor->VerifyFound();
16251}
16252
Dave Houlton59a20702017-02-02 17:26:23 -070016253TEST_F(VkLayerTest, ImageBufferCopyTests) {
16254 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16255
Tony Barbour1fa09702017-03-16 12:09:08 -060016256 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016257 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16258 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16259 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16260 return;
16261 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016262
16263 // Bail if any dimension of transfer granularity is 0.
16264 auto index = m_device->graphics_queue_node_index_;
16265 auto queue_family_properties = m_device->phy().queue_properties();
16266 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16267 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16268 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16269 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16270 return;
16271 }
16272
Dave Houlton59a20702017-02-02 17:26:23 -070016273 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16274 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16275 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016276 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16277 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16278 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16279 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16280
Dave Houlton59a20702017-02-02 17:26:23 -070016281 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16282 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16283 VK_IMAGE_TILING_OPTIMAL, 0);
16284 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16285 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16286 VK_IMAGE_TILING_OPTIMAL, 0);
16287 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16288 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016289 ASSERT_TRUE(image_64k.initialized());
16290 ASSERT_TRUE(image_16k.initialized());
16291 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016292
Dave Houltonf3229d52017-02-21 15:59:08 -070016293 // Verify all needed Depth/Stencil formats are supported
16294 bool missing_ds_support = false;
16295 VkFormatProperties props = {0, 0, 0};
16296 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16297 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16298 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16299 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16300 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16301 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16302 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16303 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16304
16305 if (!missing_ds_support) {
16306 ds_image_4D_1S.init(
16307 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16308 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16309 VK_IMAGE_TILING_OPTIMAL, 0);
16310 ASSERT_TRUE(ds_image_4D_1S.initialized());
16311
16312 ds_image_3D_1S.init(
16313 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16314 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16315 VK_IMAGE_TILING_OPTIMAL, 0);
16316 ASSERT_TRUE(ds_image_3D_1S.initialized());
16317
16318 ds_image_2D.init(
16319 256, 256, VK_FORMAT_D16_UNORM,
16320 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16321 VK_IMAGE_TILING_OPTIMAL, 0);
16322 ASSERT_TRUE(ds_image_2D.initialized());
16323
16324 ds_image_1S.init(
16325 256, 256, VK_FORMAT_S8_UINT,
16326 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16327 VK_IMAGE_TILING_OPTIMAL, 0);
16328 ASSERT_TRUE(ds_image_1S.initialized());
16329 }
16330
16331 // Allocate buffers
16332 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016333 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016334 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16335 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16336 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16337 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016338
16339 VkBufferImageCopy region = {};
16340 region.bufferRowLength = 0;
16341 region.bufferImageHeight = 0;
16342 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16343 region.imageSubresource.layerCount = 1;
16344 region.imageOffset = {0, 0, 0};
16345 region.imageExtent = {64, 64, 1};
16346 region.bufferOffset = 0;
16347
16348 // attempt copies before putting command buffer in recording state
16349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16350 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16351 &region);
16352 m_errorMonitor->VerifyFound();
16353
16354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16355 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16356 &region);
16357 m_errorMonitor->VerifyFound();
16358
16359 // start recording
16360 m_commandBuffer->BeginCommandBuffer();
16361
16362 // successful copies
16363 m_errorMonitor->ExpectSuccess();
16364 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16365 &region);
16366 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16367 &region);
16368 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16369 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16370 &region);
16371 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16372 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16373 &region);
16374 region.imageOffset.x = 0;
16375 region.imageExtent.height = 64;
16376 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16377 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16378 &region);
16379 m_errorMonitor->VerifyNotFound();
16380
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016381 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016382 region.imageExtent = {65, 64, 1};
16383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16384 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16385 &region);
16386 m_errorMonitor->VerifyFound();
16387
16388 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16389 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16390 &region);
16391 m_errorMonitor->VerifyFound();
16392
16393 // image/buffer too small (offset) on copy to image
16394 region.imageExtent = {64, 64, 1};
16395 region.imageOffset = {0, 4, 0};
16396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16397 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16398 &region);
16399 m_errorMonitor->VerifyFound();
16400
16401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16402 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16403 &region);
16404 m_errorMonitor->VerifyFound();
16405
16406 // image/buffer too small on copy to buffer
16407 region.imageExtent = {64, 64, 1};
16408 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016409 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16411 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16412 &region);
16413 m_errorMonitor->VerifyFound();
16414
16415 region.imageExtent = {64, 65, 1};
16416 region.bufferOffset = 0;
16417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16418 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16419 &region);
16420 m_errorMonitor->VerifyFound();
16421
16422 // buffer size ok but rowlength causes loose packing
16423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16424 region.imageExtent = {64, 64, 1};
16425 region.bufferRowLength = 68;
16426 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16427 &region);
16428 m_errorMonitor->VerifyFound();
16429
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016430 // An extent with zero area should produce a warning, but no error
16431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16432 region.imageExtent.width = 0;
16433 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16434 &region);
16435 m_errorMonitor->VerifyFound();
16436
Dave Houlton59a20702017-02-02 17:26:23 -070016437 // aspect bits
16438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16439 region.imageExtent = {64, 64, 1};
16440 region.bufferRowLength = 0;
16441 region.bufferImageHeight = 0;
16442 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16443 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16444 buffer_16k.handle(), 1, &region);
16445 m_errorMonitor->VerifyFound();
16446
16447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16448 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16449 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16450 &region);
16451 m_errorMonitor->VerifyFound();
16452
16453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16454 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16455 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16456 buffer_16k.handle(), 1, &region);
16457 m_errorMonitor->VerifyFound();
16458
Dave Houltonf3229d52017-02-21 15:59:08 -070016459 // Test Depth/Stencil copies
16460 if (missing_ds_support) {
16461 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16462 } else {
16463 VkBufferImageCopy ds_region = {};
16464 ds_region.bufferOffset = 0;
16465 ds_region.bufferRowLength = 0;
16466 ds_region.bufferImageHeight = 0;
16467 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16468 ds_region.imageSubresource.mipLevel = 0;
16469 ds_region.imageSubresource.baseArrayLayer = 0;
16470 ds_region.imageSubresource.layerCount = 1;
16471 ds_region.imageOffset = {0, 0, 0};
16472 ds_region.imageExtent = {256, 256, 1};
16473
16474 // Depth copies that should succeed
16475 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16476 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16477 buffer_256k.handle(), 1, &ds_region);
16478 m_errorMonitor->VerifyNotFound();
16479
16480 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16481 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16482 buffer_256k.handle(), 1, &ds_region);
16483 m_errorMonitor->VerifyNotFound();
16484
16485 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16486 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16487 buffer_128k.handle(), 1, &ds_region);
16488 m_errorMonitor->VerifyNotFound();
16489
16490 // Depth copies that should fail
16491 ds_region.bufferOffset = 4;
16492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16493 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16494 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16495 buffer_256k.handle(), 1, &ds_region);
16496 m_errorMonitor->VerifyFound();
16497
16498 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16499 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16500 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16501 buffer_256k.handle(), 1, &ds_region);
16502 m_errorMonitor->VerifyFound();
16503
16504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16505 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16506 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16507 buffer_128k.handle(), 1, &ds_region);
16508 m_errorMonitor->VerifyFound();
16509
16510 // Stencil copies that should succeed
16511 ds_region.bufferOffset = 0;
16512 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16513 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16514 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16515 buffer_64k.handle(), 1, &ds_region);
16516 m_errorMonitor->VerifyNotFound();
16517
16518 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16519 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16520 buffer_64k.handle(), 1, &ds_region);
16521 m_errorMonitor->VerifyNotFound();
16522
16523 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16524 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16525 buffer_64k.handle(), 1, &ds_region);
16526 m_errorMonitor->VerifyNotFound();
16527
16528 // Stencil copies that should fail
16529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16530 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16531 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16532 buffer_16k.handle(), 1, &ds_region);
16533 m_errorMonitor->VerifyFound();
16534
16535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16536 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16537 ds_region.bufferRowLength = 260;
16538 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16539 buffer_64k.handle(), 1, &ds_region);
16540 m_errorMonitor->VerifyFound();
16541
16542 ds_region.bufferRowLength = 0;
16543 ds_region.bufferOffset = 4;
16544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16545 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16546 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16547 buffer_64k.handle(), 1, &ds_region);
16548 m_errorMonitor->VerifyFound();
16549 }
16550
Dave Houlton584d51e2017-02-16 12:52:54 -070016551 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016552 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016553 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016554 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16555 device_features.textureCompressionASTC_LDR)) {
16556 printf(" No compressed formats supported - block compression tests skipped.\n");
16557 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016558 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16559 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016560 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016561 image_16k_4x4comp.init(128, 128, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016562 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16563 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016564 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016565 image_16k_4x4comp.init(128, 128, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton584d51e2017-02-16 12:52:54 -070016566 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016567 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16568 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016569 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016570 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16571 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016572 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16573 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016574 }
16575 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016576
Dave Houlton584d51e2017-02-16 12:52:54 -070016577 // Just fits
16578 m_errorMonitor->ExpectSuccess();
16579 region.imageExtent = {128, 128, 1};
16580 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16581 buffer_16k.handle(), 1, &region);
16582 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016583
Dave Houlton584d51e2017-02-16 12:52:54 -070016584 // with offset, too big for buffer
16585 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16586 region.bufferOffset = 16;
16587 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16588 buffer_16k.handle(), 1, &region);
16589 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016590 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016591
Dave Houlton67e9b532017-03-02 17:00:10 -070016592 // extents that are not a multiple of compressed block size
16593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16594 region.imageExtent.width = 66;
16595 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16596 buffer_16k.handle(), 1, &region);
16597 m_errorMonitor->VerifyFound();
16598 region.imageExtent.width = 128;
16599
16600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016601 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016602 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16603 buffer_16k.handle(), 1, &region);
16604 m_errorMonitor->VerifyFound();
16605 region.imageExtent.height = 128;
16606
16607 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16608
16609 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16610 m_errorMonitor->ExpectSuccess();
16611 region.imageExtent.width = 66;
16612 region.imageOffset.x = 64;
16613 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16614 buffer_16k.handle(), 1, &region);
16615 region.imageExtent.width = 16;
16616 region.imageOffset.x = 0;
16617 region.imageExtent.height = 2;
16618 region.imageOffset.y = 128;
16619 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016620 buffer_16k.handle(), 1, &region);
16621 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016622 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016623
Dave Houlton584d51e2017-02-16 12:52:54 -070016624 // buffer offset must be a multiple of texel block size (16)
16625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16626 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16627 region.imageExtent = {64, 64, 1};
16628 region.bufferOffset = 24;
16629 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16630 buffer_16k.handle(), 1, &region);
16631 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016632
Dave Houlton584d51e2017-02-16 12:52:54 -070016633 // rowlength not a multiple of block width (4)
16634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16635 region.bufferOffset = 0;
16636 region.bufferRowLength = 130;
16637 region.bufferImageHeight = 0;
16638 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16639 buffer_64k.handle(), 1, &region);
16640 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016641
Dave Houlton584d51e2017-02-16 12:52:54 -070016642 // imageheight not a multiple of block height (4)
16643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16644 region.bufferRowLength = 0;
16645 region.bufferImageHeight = 130;
16646 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16647 buffer_64k.handle(), 1, &region);
16648 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016649 }
Dave Houlton59a20702017-02-02 17:26:23 -070016650}
16651
Tony Barbourd6673642016-05-05 14:46:39 -060016652TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016653 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016654
Tony Barbour1fa09702017-03-16 12:09:08 -060016655 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016656
Rene Lindsay135204f2016-12-22 17:11:09 -070016657 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016658 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016659 image.init(128, 128, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016660 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016661 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016662 vk_testing::Buffer buffer;
16663 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016664 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016665 VkBufferImageCopy region = {};
16666 region.bufferRowLength = 128;
16667 region.bufferImageHeight = 128;
16668 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16669 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016670 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016671 region.imageExtent.height = 4;
16672 region.imageExtent.width = 4;
16673 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016674
16675 VkImageObj image2(m_device);
16676 image2.init(128, 128, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016677 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016678 ASSERT_TRUE(image2.initialized());
16679 vk_testing::Buffer buffer2;
16680 VkMemoryPropertyFlags reqs2 = 0;
16681 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16682 VkBufferImageCopy region2 = {};
16683 region2.bufferRowLength = 128;
16684 region2.bufferImageHeight = 128;
16685 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16686 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16687 region2.imageSubresource.layerCount = 1;
16688 region2.imageExtent.height = 4;
16689 region2.imageExtent.width = 4;
16690 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016691 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016692
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016693 // Image must have offset.z of 0 and extent.depth of 1
16694 // Introduce failure by setting imageExtent.depth to 0
16695 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016696 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016697 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016698 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016699 m_errorMonitor->VerifyFound();
16700
16701 region.imageExtent.depth = 1;
16702
16703 // Image must have offset.z of 0 and extent.depth of 1
16704 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016705 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016706 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016709 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016710 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016711 m_errorMonitor->VerifyFound();
16712
16713 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016714 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16715 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016716 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016717 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016718 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16719 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016720 m_errorMonitor->VerifyFound();
16721
16722 // BufferOffset must be a multiple of 4
16723 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016724 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016726 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16727 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016728 m_errorMonitor->VerifyFound();
16729
16730 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16731 region.bufferOffset = 0;
16732 region.imageExtent.height = 128;
16733 region.imageExtent.width = 128;
16734 // Introduce failure by setting bufferRowLength > 0 but less than width
16735 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016737 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16738 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016739 m_errorMonitor->VerifyFound();
16740
16741 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16742 region.bufferRowLength = 128;
16743 // Introduce failure by setting bufferRowHeight > 0 but less than height
16744 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016746 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16747 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016748 m_errorMonitor->VerifyFound();
16749
16750 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016751 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016752 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16753 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016754 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016755 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16756 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016757 VkImageBlit blitRegion = {};
16758 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16759 blitRegion.srcSubresource.baseArrayLayer = 0;
16760 blitRegion.srcSubresource.layerCount = 1;
16761 blitRegion.srcSubresource.mipLevel = 0;
16762 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16763 blitRegion.dstSubresource.baseArrayLayer = 0;
16764 blitRegion.dstSubresource.layerCount = 1;
16765 blitRegion.dstSubresource.mipLevel = 0;
16766
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016767 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16769 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16771 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016772 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16773 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016774 m_errorMonitor->VerifyFound();
16775
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016777 VkImageMemoryBarrier img_barrier;
16778 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16779 img_barrier.pNext = NULL;
16780 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16781 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16782 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16783 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16784 img_barrier.image = image.handle();
16785 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16786 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16787 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16788 img_barrier.subresourceRange.baseArrayLayer = 0;
16789 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016790 img_barrier.subresourceRange.layerCount = 0;
16791 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016792 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16793 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016794 m_errorMonitor->VerifyFound();
16795 img_barrier.subresourceRange.layerCount = 1;
16796}
16797
16798TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016799 TEST_DESCRIPTION("Exceed the limits of image format ");
16800
Tony Barbour1fa09702017-03-16 12:09:08 -060016801 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016802
16803 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16804 {
16805 VkFormatProperties properties;
16806 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16807 if (properties.linearTilingFeatures == 0) {
16808 printf(" Image format not supported; skipped.\n");
16809 return;
16810 }
16811 }
16812
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016814 VkImageCreateInfo image_create_info = {};
16815 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16816 image_create_info.pNext = NULL;
16817 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016818 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016819 image_create_info.extent.width = 32;
16820 image_create_info.extent.height = 32;
16821 image_create_info.extent.depth = 1;
16822 image_create_info.mipLevels = 1;
16823 image_create_info.arrayLayers = 1;
16824 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16825 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16826 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16827 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16828 image_create_info.flags = 0;
16829
16830 VkImage nullImg;
16831 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016832 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16833 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016834 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016835 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16836 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16837 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016838 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016839
Tony Barbour0907e362017-03-09 15:05:30 -070016840 uint32_t maxDim =
16841 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16842 // If max mip levels exceeds image extents, skip the max mip levels test
16843 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16845 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16846 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16847 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16848 m_errorMonitor->VerifyFound();
16849 image_create_info.mipLevels = 1;
16850 }
Tony Barbourd6673642016-05-05 14:46:39 -060016851
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016853 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16854 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16855 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16856 m_errorMonitor->VerifyFound();
16857 image_create_info.arrayLayers = 1;
16858
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016860 int samples = imgFmtProps.sampleCounts >> 1;
16861 image_create_info.samples = (VkSampleCountFlagBits)samples;
16862 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16863 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16864 m_errorMonitor->VerifyFound();
16865 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16868 "pCreateInfo->initialLayout, must be "
16869 "VK_IMAGE_LAYOUT_UNDEFINED or "
16870 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016871 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16872 // Expect INVALID_LAYOUT
16873 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16874 m_errorMonitor->VerifyFound();
16875 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16876}
16877
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016878TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016879 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016881
Tony Barbour1fa09702017-03-16 12:09:08 -060016882 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016883
16884 VkImageObj src_image(m_device);
16885 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16886 VkImageObj dst_image(m_device);
16887 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16888
Tony Barbour552f6c02016-12-21 14:34:07 -070016889 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016890 VkImageCopy copy_region;
16891 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16892 copy_region.srcSubresource.mipLevel = 0;
16893 copy_region.srcSubresource.baseArrayLayer = 0;
16894 copy_region.srcSubresource.layerCount = 0;
16895 copy_region.srcOffset.x = 0;
16896 copy_region.srcOffset.y = 0;
16897 copy_region.srcOffset.z = 0;
16898 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16899 copy_region.dstSubresource.mipLevel = 0;
16900 copy_region.dstSubresource.baseArrayLayer = 0;
16901 copy_region.dstSubresource.layerCount = 0;
16902 copy_region.dstOffset.x = 0;
16903 copy_region.dstOffset.y = 0;
16904 copy_region.dstOffset.z = 0;
16905 copy_region.extent.width = 64;
16906 copy_region.extent.height = 64;
16907 copy_region.extent.depth = 1;
16908 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16909 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016910 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016911
16912 m_errorMonitor->VerifyFound();
16913}
16914
16915TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016916 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016918
Tony Barbour1fa09702017-03-16 12:09:08 -060016919 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016920
16921 VkImageObj src_image(m_device);
16922 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16923 VkImageObj dst_image(m_device);
16924 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16925
Tony Barbour552f6c02016-12-21 14:34:07 -070016926 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016927 VkImageCopy copy_region;
16928 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16929 copy_region.srcSubresource.mipLevel = 0;
16930 copy_region.srcSubresource.baseArrayLayer = 0;
16931 copy_region.srcSubresource.layerCount = 0;
16932 copy_region.srcOffset.x = 0;
16933 copy_region.srcOffset.y = 0;
16934 copy_region.srcOffset.z = 0;
16935 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16936 copy_region.dstSubresource.mipLevel = 0;
16937 copy_region.dstSubresource.baseArrayLayer = 0;
16938 copy_region.dstSubresource.layerCount = 0;
16939 copy_region.dstOffset.x = 0;
16940 copy_region.dstOffset.y = 0;
16941 copy_region.dstOffset.z = 0;
16942 copy_region.extent.width = 64;
16943 copy_region.extent.height = 64;
16944 copy_region.extent.depth = 1;
16945 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16946 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016947 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016948
16949 m_errorMonitor->VerifyFound();
16950}
16951
Karl Schultz6addd812016-02-02 17:17:23 -070016952TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016953 VkResult err;
16954 bool pass;
16955
16956 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016958
Tony Barbour1fa09702017-03-16 12:09:08 -060016959 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016960
16961 // Create two images of different types and try to copy between them
16962 VkImage srcImage;
16963 VkImage dstImage;
16964 VkDeviceMemory srcMem;
16965 VkDeviceMemory destMem;
16966 VkMemoryRequirements memReqs;
16967
16968 VkImageCreateInfo image_create_info = {};
16969 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16970 image_create_info.pNext = NULL;
16971 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16972 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16973 image_create_info.extent.width = 32;
16974 image_create_info.extent.height = 32;
16975 image_create_info.extent.depth = 1;
16976 image_create_info.mipLevels = 1;
16977 image_create_info.arrayLayers = 1;
16978 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16979 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16980 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16981 image_create_info.flags = 0;
16982
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016983 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016984 ASSERT_VK_SUCCESS(err);
16985
16986 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16987 // Introduce failure by creating second image with a different-sized format.
16988 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
16989
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016990 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016991 ASSERT_VK_SUCCESS(err);
16992
16993 // Allocate memory
16994 VkMemoryAllocateInfo memAlloc = {};
16995 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16996 memAlloc.pNext = NULL;
16997 memAlloc.allocationSize = 0;
16998 memAlloc.memoryTypeIndex = 0;
16999
17000 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17001 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017002 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017003 ASSERT_TRUE(pass);
17004 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17005 ASSERT_VK_SUCCESS(err);
17006
17007 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17008 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017009 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017010 ASSERT_TRUE(pass);
17011 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17012 ASSERT_VK_SUCCESS(err);
17013
17014 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17015 ASSERT_VK_SUCCESS(err);
17016 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17017 ASSERT_VK_SUCCESS(err);
17018
Tony Barbour552f6c02016-12-21 14:34:07 -070017019 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017020 VkImageCopy copyRegion;
17021 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17022 copyRegion.srcSubresource.mipLevel = 0;
17023 copyRegion.srcSubresource.baseArrayLayer = 0;
17024 copyRegion.srcSubresource.layerCount = 0;
17025 copyRegion.srcOffset.x = 0;
17026 copyRegion.srcOffset.y = 0;
17027 copyRegion.srcOffset.z = 0;
17028 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17029 copyRegion.dstSubresource.mipLevel = 0;
17030 copyRegion.dstSubresource.baseArrayLayer = 0;
17031 copyRegion.dstSubresource.layerCount = 0;
17032 copyRegion.dstOffset.x = 0;
17033 copyRegion.dstOffset.y = 0;
17034 copyRegion.dstOffset.z = 0;
17035 copyRegion.extent.width = 1;
17036 copyRegion.extent.height = 1;
17037 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017038 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017039 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017040
17041 m_errorMonitor->VerifyFound();
17042
17043 vkDestroyImage(m_device->device(), srcImage, NULL);
17044 vkDestroyImage(m_device->device(), dstImage, NULL);
17045 vkFreeMemory(m_device->device(), srcMem, NULL);
17046 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017047}
17048
Karl Schultz6addd812016-02-02 17:17:23 -070017049TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17050 VkResult err;
17051 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017052
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017053 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017054 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17055 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017056
Tony Barbour1fa09702017-03-16 12:09:08 -060017057 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060017058 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017059 if (!depth_format) {
17060 return;
17061 }
Mike Stroyana3082432015-09-25 13:39:21 -060017062
17063 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017064 VkImage srcImage;
17065 VkImage dstImage;
17066 VkDeviceMemory srcMem;
17067 VkDeviceMemory destMem;
17068 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017069
17070 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017071 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17072 image_create_info.pNext = NULL;
17073 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017074 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017075 image_create_info.extent.width = 32;
17076 image_create_info.extent.height = 32;
17077 image_create_info.extent.depth = 1;
17078 image_create_info.mipLevels = 1;
17079 image_create_info.arrayLayers = 1;
17080 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17081 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17082 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17083 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017084
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017085 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017086 ASSERT_VK_SUCCESS(err);
17087
Karl Schultzbdb75952016-04-19 11:36:49 -060017088 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17089
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017090 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017091 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017092 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017093 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017094
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017095 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017096 ASSERT_VK_SUCCESS(err);
17097
17098 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017099 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017100 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17101 memAlloc.pNext = NULL;
17102 memAlloc.allocationSize = 0;
17103 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017104
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017105 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017106 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017107 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017108 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017109 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017110 ASSERT_VK_SUCCESS(err);
17111
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017112 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017113 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017114 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017115 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017116 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017117 ASSERT_VK_SUCCESS(err);
17118
17119 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17120 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017121 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017122 ASSERT_VK_SUCCESS(err);
17123
Tony Barbour552f6c02016-12-21 14:34:07 -070017124 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017125 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017126 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017127 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017128 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017129 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017130 copyRegion.srcOffset.x = 0;
17131 copyRegion.srcOffset.y = 0;
17132 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017133 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017134 copyRegion.dstSubresource.mipLevel = 0;
17135 copyRegion.dstSubresource.baseArrayLayer = 0;
17136 copyRegion.dstSubresource.layerCount = 0;
17137 copyRegion.dstOffset.x = 0;
17138 copyRegion.dstOffset.y = 0;
17139 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017140 copyRegion.extent.width = 1;
17141 copyRegion.extent.height = 1;
17142 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017143 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017144 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017145
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017146 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017147
Chia-I Wuf7458c52015-10-26 21:10:41 +080017148 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017149 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017150 vkFreeMemory(m_device->device(), srcMem, NULL);
17151 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017152}
17153
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017154TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17155 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017156
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017157 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017158
17159 VkImageFormatProperties image_format_properties;
17160 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17161 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17162 &image_format_properties);
17163
17164 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17165 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17166 printf(" Image multi-sample support not found; skipped.\n");
17167 return;
17168 }
17169
17170 VkImageCreateInfo ci;
17171 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17172 ci.pNext = NULL;
17173 ci.flags = 0;
17174 ci.imageType = VK_IMAGE_TYPE_2D;
17175 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17176 ci.extent = {128, 128, 1};
17177 ci.mipLevels = 1;
17178 ci.arrayLayers = 1;
17179 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17180 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17181 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17182 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17183 ci.queueFamilyIndexCount = 0;
17184 ci.pQueueFamilyIndices = NULL;
17185 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17186
17187 VkImageObj image1(m_device);
17188 image1.init(&ci);
17189 ASSERT_TRUE(image1.initialized());
17190
17191 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17192 VkImageObj image2(m_device);
17193 image2.init(&ci);
17194 ASSERT_TRUE(image2.initialized());
17195
17196 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17197 VkImageObj image4(m_device);
17198 image4.init(&ci);
17199 ASSERT_TRUE(image4.initialized());
17200
17201 m_commandBuffer->BeginCommandBuffer();
17202
17203 VkImageCopy copyRegion;
17204 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17205 copyRegion.srcSubresource.mipLevel = 0;
17206 copyRegion.srcSubresource.baseArrayLayer = 0;
17207 copyRegion.srcSubresource.layerCount = 1;
17208 copyRegion.srcOffset = {0, 0, 0};
17209 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17210 copyRegion.dstSubresource.mipLevel = 0;
17211 copyRegion.dstSubresource.baseArrayLayer = 0;
17212 copyRegion.dstSubresource.layerCount = 1;
17213 copyRegion.dstOffset = {0, 0, 0};
17214 copyRegion.extent = {128, 128, 1};
17215
17216 // Copy a single sample image to/from a multi-sample image
17217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17218 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17219 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17220 m_errorMonitor->VerifyFound();
17221
17222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17223 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17224 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17225 m_errorMonitor->VerifyFound();
17226
17227 // Copy between multi-sample images with different sample counts
17228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17229 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17230 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17231 m_errorMonitor->VerifyFound();
17232
17233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17234 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17235 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17236 m_errorMonitor->VerifyFound();
17237
17238 m_commandBuffer->EndCommandBuffer();
17239}
17240
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017241TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17242 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017243 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060017244 auto ds_format = FindDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060017245 if (!ds_format) {
17246 return;
17247 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017248
17249 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17250 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17251 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
Tony Barbour9357d542017-03-24 15:42:21 -060017252 ds_image.init(128, 128, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL,
17253 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017254 ASSERT_TRUE(color_image.initialized());
17255 ASSERT_TRUE(depth_image.initialized());
17256 ASSERT_TRUE(ds_image.initialized());
17257
17258 VkImageCopy copyRegion;
17259 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17260 copyRegion.srcSubresource.mipLevel = 0;
17261 copyRegion.srcSubresource.baseArrayLayer = 0;
17262 copyRegion.srcSubresource.layerCount = 1;
17263 copyRegion.srcOffset = {0, 0, 0};
17264 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17265 copyRegion.dstSubresource.mipLevel = 0;
17266 copyRegion.dstSubresource.baseArrayLayer = 0;
17267 copyRegion.dstSubresource.layerCount = 1;
17268 copyRegion.dstOffset = {64, 0, 0};
17269 copyRegion.extent = {64, 128, 1};
17270
17271 // Submitting command before command buffer is in recording state
Dave Houlton3c9fca72017-03-27 17:25:54 -060017272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17273 "You must call vkBeginCommandBuffer"); // VALIDATION_ERROR_01192);
17274 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17275 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017276 m_errorMonitor->VerifyFound();
17277
17278 m_commandBuffer->BeginCommandBuffer();
17279
17280 // Src and dest aspect masks don't match
17281 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017283 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
17284 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017285 m_errorMonitor->VerifyFound();
17286 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17287
17288 // Illegal combinations of aspect bits - VU 01221
Dave Houlton3c9fca72017-03-27 17:25:54 -060017289 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017290 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17292 // These aspect/format mismatches are redundant but unavoidable here
17293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017295 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17296 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017297 m_errorMonitor->VerifyFound();
17298 // Metadata aspect is illegal - VU 01222
17299 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17300 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17302 // These aspect/format mismatches are redundant but unavoidable here
Dave Houlton3c9fca72017-03-27 17:25:54 -060017303 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
17304 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017305 m_errorMonitor->VerifyFound();
17306
17307 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17308 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17309
17310 // Aspect mask doesn't match source image format - VU 01200
17311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17312 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17313 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17314 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17315 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17316 m_errorMonitor->VerifyFound();
17317
17318 // Aspect mask doesn't match dest image format - VU 01201
17319 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17320 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17322 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17324 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17325 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17326 m_errorMonitor->VerifyFound();
17327
17328 m_commandBuffer->EndCommandBuffer();
17329}
17330
Karl Schultz6addd812016-02-02 17:17:23 -070017331TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17332 VkResult err;
17333 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017334
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17336 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017337
Tony Barbour1fa09702017-03-16 12:09:08 -060017338 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017339
17340 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017341 VkImage srcImage;
17342 VkImage dstImage;
17343 VkDeviceMemory srcMem;
17344 VkDeviceMemory destMem;
17345 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017346
17347 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017348 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17349 image_create_info.pNext = NULL;
17350 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17351 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17352 image_create_info.extent.width = 32;
17353 image_create_info.extent.height = 1;
17354 image_create_info.extent.depth = 1;
17355 image_create_info.mipLevels = 1;
17356 image_create_info.arrayLayers = 1;
17357 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17358 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17359 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17360 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017361
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017362 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017363 ASSERT_VK_SUCCESS(err);
17364
Karl Schultz6addd812016-02-02 17:17:23 -070017365 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017366
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017367 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017368 ASSERT_VK_SUCCESS(err);
17369
17370 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017371 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017372 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17373 memAlloc.pNext = NULL;
17374 memAlloc.allocationSize = 0;
17375 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017376
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017377 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017378 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017379 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017380 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017381 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017382 ASSERT_VK_SUCCESS(err);
17383
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017384 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017385 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017386 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017387 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017388 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017389 ASSERT_VK_SUCCESS(err);
17390
17391 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17392 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017393 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017394 ASSERT_VK_SUCCESS(err);
17395
Tony Barbour552f6c02016-12-21 14:34:07 -070017396 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017397 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017398 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17399 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017400 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017401 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017402 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017403 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017404 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017405 resolveRegion.srcOffset.x = 0;
17406 resolveRegion.srcOffset.y = 0;
17407 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017408 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017409 resolveRegion.dstSubresource.mipLevel = 0;
17410 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017411 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017412 resolveRegion.dstOffset.x = 0;
17413 resolveRegion.dstOffset.y = 0;
17414 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017415 resolveRegion.extent.width = 1;
17416 resolveRegion.extent.height = 1;
17417 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017418 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017419 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017420
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017421 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017422
Chia-I Wuf7458c52015-10-26 21:10:41 +080017423 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017424 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017425 vkFreeMemory(m_device->device(), srcMem, NULL);
17426 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017427}
17428
Karl Schultz6addd812016-02-02 17:17:23 -070017429TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17430 VkResult err;
17431 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17434 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017435
Tony Barbour1fa09702017-03-16 12:09:08 -060017436 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017437
Chris Forbesa7530692016-05-08 12:35:39 +120017438 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017439 VkImage srcImage;
17440 VkImage dstImage;
17441 VkDeviceMemory srcMem;
17442 VkDeviceMemory destMem;
17443 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017444
17445 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017446 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17447 image_create_info.pNext = NULL;
17448 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17449 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17450 image_create_info.extent.width = 32;
17451 image_create_info.extent.height = 1;
17452 image_create_info.extent.depth = 1;
17453 image_create_info.mipLevels = 1;
17454 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017455 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017456 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17457 // Note: Some implementations expect color attachment usage for any
17458 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017459 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017460 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017461
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017462 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017463 ASSERT_VK_SUCCESS(err);
17464
Karl Schultz6addd812016-02-02 17:17:23 -070017465 // Note: Some implementations expect color attachment usage for any
17466 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017467 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017468
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017469 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017470 ASSERT_VK_SUCCESS(err);
17471
17472 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017473 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017474 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17475 memAlloc.pNext = NULL;
17476 memAlloc.allocationSize = 0;
17477 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017478
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017479 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017480 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017481 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017482 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017483 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017484 ASSERT_VK_SUCCESS(err);
17485
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017486 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017487 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017488 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017489 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017490 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017491 ASSERT_VK_SUCCESS(err);
17492
17493 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17494 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017495 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017496 ASSERT_VK_SUCCESS(err);
17497
Tony Barbour552f6c02016-12-21 14:34:07 -070017498 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017499 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017500 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17501 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017502 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017503 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017504 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017505 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017506 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017507 resolveRegion.srcOffset.x = 0;
17508 resolveRegion.srcOffset.y = 0;
17509 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017510 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017511 resolveRegion.dstSubresource.mipLevel = 0;
17512 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017513 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017514 resolveRegion.dstOffset.x = 0;
17515 resolveRegion.dstOffset.y = 0;
17516 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017517 resolveRegion.extent.width = 1;
17518 resolveRegion.extent.height = 1;
17519 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017520 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017521 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017522
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017523 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017524
Chia-I Wuf7458c52015-10-26 21:10:41 +080017525 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017526 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017527 vkFreeMemory(m_device->device(), srcMem, NULL);
17528 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017529}
17530
Karl Schultz6addd812016-02-02 17:17:23 -070017531TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17532 VkResult err;
17533 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017534
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017535 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017536 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017537
Tony Barbour1fa09702017-03-16 12:09:08 -060017538 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017539
17540 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017541 VkImage srcImage;
17542 VkImage dstImage;
17543 VkDeviceMemory srcMem;
17544 VkDeviceMemory destMem;
17545 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017546
17547 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017548 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17549 image_create_info.pNext = NULL;
17550 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17551 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17552 image_create_info.extent.width = 32;
17553 image_create_info.extent.height = 1;
17554 image_create_info.extent.depth = 1;
17555 image_create_info.mipLevels = 1;
17556 image_create_info.arrayLayers = 1;
17557 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17558 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17559 // Note: Some implementations expect color attachment usage for any
17560 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017561 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017562 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017563
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017564 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017565 ASSERT_VK_SUCCESS(err);
17566
Karl Schultz6addd812016-02-02 17:17:23 -070017567 // Set format to something other than source image
17568 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17569 // Note: Some implementations expect color attachment usage for any
17570 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017571 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017572 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017573
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017575 ASSERT_VK_SUCCESS(err);
17576
17577 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017578 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017579 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17580 memAlloc.pNext = NULL;
17581 memAlloc.allocationSize = 0;
17582 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017583
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017584 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017585 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017586 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017587 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017588 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017589 ASSERT_VK_SUCCESS(err);
17590
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017591 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017592 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017593 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017594 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017595 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017596 ASSERT_VK_SUCCESS(err);
17597
17598 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17599 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017600 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017601 ASSERT_VK_SUCCESS(err);
17602
Tony Barbour552f6c02016-12-21 14:34:07 -070017603 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017604 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017605 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17606 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017607 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017608 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017609 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017610 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017611 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017612 resolveRegion.srcOffset.x = 0;
17613 resolveRegion.srcOffset.y = 0;
17614 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017615 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017616 resolveRegion.dstSubresource.mipLevel = 0;
17617 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017618 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017619 resolveRegion.dstOffset.x = 0;
17620 resolveRegion.dstOffset.y = 0;
17621 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017622 resolveRegion.extent.width = 1;
17623 resolveRegion.extent.height = 1;
17624 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017625 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017626 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017627
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017628 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017629
Chia-I Wuf7458c52015-10-26 21:10:41 +080017630 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017631 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017632 vkFreeMemory(m_device->device(), srcMem, NULL);
17633 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017634}
17635
Karl Schultz6addd812016-02-02 17:17:23 -070017636TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17637 VkResult err;
17638 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017639
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017641 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017642
Tony Barbour1fa09702017-03-16 12:09:08 -060017643 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017644
17645 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017646 VkImage srcImage;
17647 VkImage dstImage;
17648 VkDeviceMemory srcMem;
17649 VkDeviceMemory destMem;
17650 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017651
17652 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017653 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17654 image_create_info.pNext = NULL;
17655 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17656 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17657 image_create_info.extent.width = 32;
17658 image_create_info.extent.height = 1;
17659 image_create_info.extent.depth = 1;
17660 image_create_info.mipLevels = 1;
17661 image_create_info.arrayLayers = 1;
17662 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17663 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17664 // Note: Some implementations expect color attachment usage for any
17665 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017666 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017667 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017668
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017669 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017670 ASSERT_VK_SUCCESS(err);
17671
Karl Schultz6addd812016-02-02 17:17:23 -070017672 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17673 // Note: Some implementations expect color attachment usage for any
17674 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017675 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017676 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017677
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017678 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017679 ASSERT_VK_SUCCESS(err);
17680
17681 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017682 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017683 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17684 memAlloc.pNext = NULL;
17685 memAlloc.allocationSize = 0;
17686 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017687
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017688 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017689 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017690 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017691 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017692 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017693 ASSERT_VK_SUCCESS(err);
17694
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017695 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017696 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017697 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017698 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017699 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017700 ASSERT_VK_SUCCESS(err);
17701
17702 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17703 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017704 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017705 ASSERT_VK_SUCCESS(err);
17706
Tony Barbour552f6c02016-12-21 14:34:07 -070017707 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017708 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017709 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17710 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017711 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017712 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017713 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017714 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017715 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017716 resolveRegion.srcOffset.x = 0;
17717 resolveRegion.srcOffset.y = 0;
17718 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017719 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017720 resolveRegion.dstSubresource.mipLevel = 0;
17721 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017722 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017723 resolveRegion.dstOffset.x = 0;
17724 resolveRegion.dstOffset.y = 0;
17725 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017726 resolveRegion.extent.width = 1;
17727 resolveRegion.extent.height = 1;
17728 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017729 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017730 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017731
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017732 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017733
Chia-I Wuf7458c52015-10-26 21:10:41 +080017734 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017735 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017736 vkFreeMemory(m_device->device(), srcMem, NULL);
17737 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017738}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017739
Karl Schultz6addd812016-02-02 17:17:23 -070017740TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017741 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017742 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17743 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017744 // The image format check comes 2nd in validation so we trigger it first,
17745 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017746 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017747
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17749 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017750
Tony Barbour1fa09702017-03-16 12:09:08 -060017751 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060017752 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017753 if (!depth_format) {
17754 return;
17755 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017756
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017757 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017758 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17759 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017760
17761 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017762 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17763 ds_pool_ci.pNext = NULL;
17764 ds_pool_ci.maxSets = 1;
17765 ds_pool_ci.poolSizeCount = 1;
17766 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017767
17768 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017769 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017770 ASSERT_VK_SUCCESS(err);
17771
17772 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017773 dsl_binding.binding = 0;
17774 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17775 dsl_binding.descriptorCount = 1;
17776 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17777 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017778
17779 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017780 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17781 ds_layout_ci.pNext = NULL;
17782 ds_layout_ci.bindingCount = 1;
17783 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017784 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017785 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017786 ASSERT_VK_SUCCESS(err);
17787
17788 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017789 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017790 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017791 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017792 alloc_info.descriptorPool = ds_pool;
17793 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017794 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017795 ASSERT_VK_SUCCESS(err);
17796
Karl Schultz6addd812016-02-02 17:17:23 -070017797 VkImage image_bad;
17798 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017799 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017800 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017801 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017802 const int32_t tex_width = 32;
17803 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017804
17805 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017806 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17807 image_create_info.pNext = NULL;
17808 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17809 image_create_info.format = tex_format_bad;
17810 image_create_info.extent.width = tex_width;
17811 image_create_info.extent.height = tex_height;
17812 image_create_info.extent.depth = 1;
17813 image_create_info.mipLevels = 1;
17814 image_create_info.arrayLayers = 1;
17815 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17816 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017817 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017818 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017819
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017820 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017821 ASSERT_VK_SUCCESS(err);
17822 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017823 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17824 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017825 ASSERT_VK_SUCCESS(err);
17826
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017827 // ---Bind image memory---
17828 VkMemoryRequirements img_mem_reqs;
17829 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17830 VkMemoryAllocateInfo image_alloc_info = {};
17831 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17832 image_alloc_info.pNext = NULL;
17833 image_alloc_info.memoryTypeIndex = 0;
17834 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017835 bool pass =
17836 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 -070017837 ASSERT_TRUE(pass);
17838 VkDeviceMemory mem;
17839 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17840 ASSERT_VK_SUCCESS(err);
17841 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17842 ASSERT_VK_SUCCESS(err);
17843 // -----------------------
17844
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017845 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017846 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017847 image_view_create_info.image = image_bad;
17848 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17849 image_view_create_info.format = tex_format_bad;
17850 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17851 image_view_create_info.subresourceRange.baseMipLevel = 0;
17852 image_view_create_info.subresourceRange.layerCount = 1;
17853 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017854 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017855
17856 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017857 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017858
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017859 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017860
Chia-I Wuf7458c52015-10-26 21:10:41 +080017861 vkDestroyImage(m_device->device(), image_bad, NULL);
17862 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017863 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17864 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017865
17866 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017867}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017868
17869TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017870 TEST_DESCRIPTION(
17871 "Call ClearColorImage w/ a depth|stencil image and "
17872 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017873
Tony Barbour1fa09702017-03-16 12:09:08 -060017874 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060017875 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070017876 if (!depth_format) {
17877 return;
17878 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17880
Tony Barbour552f6c02016-12-21 14:34:07 -070017881 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017882
17883 // Color image
17884 VkClearColorValue clear_color;
17885 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17886 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17887 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17888 const int32_t img_width = 32;
17889 const int32_t img_height = 32;
17890 VkImageCreateInfo image_create_info = {};
17891 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17892 image_create_info.pNext = NULL;
17893 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17894 image_create_info.format = color_format;
17895 image_create_info.extent.width = img_width;
17896 image_create_info.extent.height = img_height;
17897 image_create_info.extent.depth = 1;
17898 image_create_info.mipLevels = 1;
17899 image_create_info.arrayLayers = 1;
17900 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17901 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17902 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17903
17904 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017905 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017906
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017907 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017908
17909 // Depth/Stencil image
17910 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017911 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017912 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17913 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017914 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017915 ds_image_create_info.extent.width = 64;
17916 ds_image_create_info.extent.height = 64;
17917 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017918 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 -060017919
17920 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017921 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017923 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 -060017924
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017926
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017927 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017928 &color_range);
17929
17930 m_errorMonitor->VerifyFound();
17931
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17933 "vkCmdClearColorImage called with "
17934 "image created without "
17935 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017936
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017937 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017938 &color_range);
17939
17940 m_errorMonitor->VerifyFound();
17941
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017942 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17944 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017945
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017946 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17947 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017948
17949 m_errorMonitor->VerifyFound();
17950}
Tobin Ehliscde08892015-09-22 10:11:37 -060017951
Mike Schuchardt35fece12017-03-07 14:40:28 -070017952TEST_F(VkLayerTest, CommandQueueFlags) {
17953 TEST_DESCRIPTION(
17954 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17955 "graphics-only command");
17956
17957 ASSERT_NO_FATAL_FAILURE(Init());
17958
17959 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
Dave Houlton3c9fca72017-03-27 17:25:54 -060017960 if (queueFamilyIndex == UINT32_MAX) {
Mike Schuchardt35fece12017-03-07 14:40:28 -070017961 printf(" Non-graphics queue family not found; skipped.\n");
17962 return;
17963 } else {
17964 // Create command pool on a non-graphics queue
17965 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17966
17967 // Setup command buffer on pool
17968 VkCommandBufferObj command_buffer(m_device, &command_pool);
17969 command_buffer.BeginCommandBuffer();
17970
17971 // Issue a graphics only command
17972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17973 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17974 command_buffer.SetViewport(0, 1, &viewport);
17975 m_errorMonitor->VerifyFound();
17976 }
17977}
17978
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017979// WSI Enabled Tests
17980//
Chris Forbes09368e42016-10-13 11:59:22 +130017981#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017982TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17983
17984#if defined(VK_USE_PLATFORM_XCB_KHR)
17985 VkSurfaceKHR surface = VK_NULL_HANDLE;
17986
17987 VkResult err;
17988 bool pass;
17989 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17990 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17991 // uint32_t swapchain_image_count = 0;
17992 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17993 // uint32_t image_index = 0;
17994 // VkPresentInfoKHR present_info = {};
17995
Tony Barbour1fa09702017-03-16 12:09:08 -060017996 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017997
17998 // Use the create function from one of the VK_KHR_*_surface extension in
17999 // order to create a surface, testing all known errors in the process,
18000 // before successfully creating a surface:
18001 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18003 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18004 pass = (err != VK_SUCCESS);
18005 ASSERT_TRUE(pass);
18006 m_errorMonitor->VerifyFound();
18007
18008 // Next, try to create a surface with the wrong
18009 // VkXcbSurfaceCreateInfoKHR::sType:
18010 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18011 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18013 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18014 pass = (err != VK_SUCCESS);
18015 ASSERT_TRUE(pass);
18016 m_errorMonitor->VerifyFound();
18017
18018 // Create a native window, and then correctly create a surface:
18019 xcb_connection_t *connection;
18020 xcb_screen_t *screen;
18021 xcb_window_t xcb_window;
18022 xcb_intern_atom_reply_t *atom_wm_delete_window;
18023
18024 const xcb_setup_t *setup;
18025 xcb_screen_iterator_t iter;
18026 int scr;
18027 uint32_t value_mask, value_list[32];
18028 int width = 1;
18029 int height = 1;
18030
18031 connection = xcb_connect(NULL, &scr);
18032 ASSERT_TRUE(connection != NULL);
18033 setup = xcb_get_setup(connection);
18034 iter = xcb_setup_roots_iterator(setup);
18035 while (scr-- > 0)
18036 xcb_screen_next(&iter);
18037 screen = iter.data;
18038
18039 xcb_window = xcb_generate_id(connection);
18040
18041 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18042 value_list[0] = screen->black_pixel;
18043 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18044
18045 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18046 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18047
18048 /* Magic code that will send notification when window is destroyed */
18049 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18050 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18051
18052 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18053 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18054 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18055 free(reply);
18056
18057 xcb_map_window(connection, xcb_window);
18058
18059 // Force the x/y coordinates to 100,100 results are identical in consecutive
18060 // runs
18061 const uint32_t coords[] = { 100, 100 };
18062 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18063
18064 // Finally, try to correctly create a surface:
18065 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18066 xcb_create_info.pNext = NULL;
18067 xcb_create_info.flags = 0;
18068 xcb_create_info.connection = connection;
18069 xcb_create_info.window = xcb_window;
18070 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18071 pass = (err == VK_SUCCESS);
18072 ASSERT_TRUE(pass);
18073
18074 // Check if surface supports presentation:
18075
18076 // 1st, do so without having queried the queue families:
18077 VkBool32 supported = false;
18078 // TODO: Get the following error to come out:
18079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18080 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18081 "function");
18082 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18083 pass = (err != VK_SUCCESS);
18084 // ASSERT_TRUE(pass);
18085 // m_errorMonitor->VerifyFound();
18086
18087 // Next, query a queue family index that's too large:
18088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18089 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18090 pass = (err != VK_SUCCESS);
18091 ASSERT_TRUE(pass);
18092 m_errorMonitor->VerifyFound();
18093
18094 // Finally, do so correctly:
18095 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18096 // SUPPORTED
18097 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18098 pass = (err == VK_SUCCESS);
18099 ASSERT_TRUE(pass);
18100
18101 // Before proceeding, try to create a swapchain without having called
18102 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18103 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18104 swapchain_create_info.pNext = NULL;
18105 swapchain_create_info.flags = 0;
18106 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18107 swapchain_create_info.surface = surface;
18108 swapchain_create_info.imageArrayLayers = 1;
18109 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18110 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18112 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18113 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18114 pass = (err != VK_SUCCESS);
18115 ASSERT_TRUE(pass);
18116 m_errorMonitor->VerifyFound();
18117
18118 // Get the surface capabilities:
18119 VkSurfaceCapabilitiesKHR surface_capabilities;
18120
18121 // Do so correctly (only error logged by this entrypoint is if the
18122 // extension isn't enabled):
18123 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18124 pass = (err == VK_SUCCESS);
18125 ASSERT_TRUE(pass);
18126
18127 // Get the surface formats:
18128 uint32_t surface_format_count;
18129
18130 // First, try without a pointer to surface_format_count:
18131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18132 "specified as NULL");
18133 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18134 pass = (err == VK_SUCCESS);
18135 ASSERT_TRUE(pass);
18136 m_errorMonitor->VerifyFound();
18137
18138 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18139 // correctly done a 1st try (to get the count):
18140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18141 surface_format_count = 0;
18142 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18143 pass = (err == VK_SUCCESS);
18144 ASSERT_TRUE(pass);
18145 m_errorMonitor->VerifyFound();
18146
18147 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18148 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18149 pass = (err == VK_SUCCESS);
18150 ASSERT_TRUE(pass);
18151
18152 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18153 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18154
18155 // Next, do a 2nd try with surface_format_count being set too high:
18156 surface_format_count += 5;
18157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18158 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18159 pass = (err == VK_SUCCESS);
18160 ASSERT_TRUE(pass);
18161 m_errorMonitor->VerifyFound();
18162
18163 // Finally, do a correct 1st and 2nd try:
18164 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18165 pass = (err == VK_SUCCESS);
18166 ASSERT_TRUE(pass);
18167 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18168 pass = (err == VK_SUCCESS);
18169 ASSERT_TRUE(pass);
18170
18171 // Get the surface present modes:
18172 uint32_t surface_present_mode_count;
18173
18174 // First, try without a pointer to surface_format_count:
18175 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18176 "specified as NULL");
18177
18178 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18179 pass = (err == VK_SUCCESS);
18180 ASSERT_TRUE(pass);
18181 m_errorMonitor->VerifyFound();
18182
18183 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18184 // correctly done a 1st try (to get the count):
18185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18186 surface_present_mode_count = 0;
18187 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18188 (VkPresentModeKHR *)&surface_present_mode_count);
18189 pass = (err == VK_SUCCESS);
18190 ASSERT_TRUE(pass);
18191 m_errorMonitor->VerifyFound();
18192
18193 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18194 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18195 pass = (err == VK_SUCCESS);
18196 ASSERT_TRUE(pass);
18197
18198 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18199 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18200
18201 // Next, do a 2nd try with surface_format_count being set too high:
18202 surface_present_mode_count += 5;
18203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18204 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18205 pass = (err == VK_SUCCESS);
18206 ASSERT_TRUE(pass);
18207 m_errorMonitor->VerifyFound();
18208
18209 // Finally, do a correct 1st and 2nd try:
18210 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18211 pass = (err == VK_SUCCESS);
18212 ASSERT_TRUE(pass);
18213 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18214 pass = (err == VK_SUCCESS);
18215 ASSERT_TRUE(pass);
18216
18217 // Create a swapchain:
18218
18219 // First, try without a pointer to swapchain_create_info:
18220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18221 "specified as NULL");
18222
18223 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18224 pass = (err != VK_SUCCESS);
18225 ASSERT_TRUE(pass);
18226 m_errorMonitor->VerifyFound();
18227
18228 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18229 // sType:
18230 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18232
18233 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18234 pass = (err != VK_SUCCESS);
18235 ASSERT_TRUE(pass);
18236 m_errorMonitor->VerifyFound();
18237
18238 // Next, call with a NULL swapchain pointer:
18239 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18240 swapchain_create_info.pNext = NULL;
18241 swapchain_create_info.flags = 0;
18242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18243 "specified as NULL");
18244
18245 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18246 pass = (err != VK_SUCCESS);
18247 ASSERT_TRUE(pass);
18248 m_errorMonitor->VerifyFound();
18249
18250 // TODO: Enhance swapchain layer so that
18251 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18252
18253 // Next, call with a queue family index that's too large:
18254 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18255 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18256 swapchain_create_info.queueFamilyIndexCount = 2;
18257 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18259 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18260 pass = (err != VK_SUCCESS);
18261 ASSERT_TRUE(pass);
18262 m_errorMonitor->VerifyFound();
18263
18264 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18265 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18266 swapchain_create_info.queueFamilyIndexCount = 1;
18267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18268 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18269 "pCreateInfo->pQueueFamilyIndices).");
18270 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18271 pass = (err != VK_SUCCESS);
18272 ASSERT_TRUE(pass);
18273 m_errorMonitor->VerifyFound();
18274
18275 // Next, call with an invalid imageSharingMode:
18276 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18277 swapchain_create_info.queueFamilyIndexCount = 1;
18278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18279 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18280 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18281 pass = (err != VK_SUCCESS);
18282 ASSERT_TRUE(pass);
18283 m_errorMonitor->VerifyFound();
18284 // Fix for the future:
18285 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18286 // SUPPORTED
18287 swapchain_create_info.queueFamilyIndexCount = 0;
18288 queueFamilyIndex[0] = 0;
18289 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18290
18291 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18292 // Get the images from a swapchain:
18293 // Acquire an image from a swapchain:
18294 // Present an image to a swapchain:
18295 // Destroy the swapchain:
18296
18297 // TODOs:
18298 //
18299 // - Try destroying the device without first destroying the swapchain
18300 //
18301 // - Try destroying the device without first destroying the surface
18302 //
18303 // - Try destroying the surface without first destroying the swapchain
18304
18305 // Destroy the surface:
18306 vkDestroySurfaceKHR(instance(), surface, NULL);
18307
18308 // Tear down the window:
18309 xcb_destroy_window(connection, xcb_window);
18310 xcb_disconnect(connection);
18311
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018312#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018313 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018314#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018315}
Chris Forbes09368e42016-10-13 11:59:22 +130018316#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018317
18318//
18319// POSITIVE VALIDATION TESTS
18320//
18321// These tests do not expect to encounter ANY validation errors pass only if this is true
18322
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018323TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18324 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18327
18328 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18329 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018330 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018331 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18332 command_buffer_allocate_info.commandBufferCount = 1;
18333
18334 VkCommandBuffer secondary_command_buffer;
18335 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18336 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18337 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18338 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18339 command_buffer_inheritance_info.renderPass = m_renderPass;
18340 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18341
18342 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18343 command_buffer_begin_info.flags =
18344 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18345 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18346
18347 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18348 VkClearAttachment color_attachment;
18349 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18350 color_attachment.clearValue.color.float32[0] = 0;
18351 color_attachment.clearValue.color.float32[1] = 0;
18352 color_attachment.clearValue.color.float32[2] = 0;
18353 color_attachment.clearValue.color.float32[3] = 0;
18354 color_attachment.colorAttachment = 0;
18355 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18356 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18357}
18358
Tobin Ehlise0006882016-11-03 10:14:28 -060018359TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018360 TEST_DESCRIPTION(
18361 "Perform an image layout transition in a secondary command buffer followed "
18362 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018363 VkResult err;
18364 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018365 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060018366 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070018367 if (!depth_format) {
18368 return;
18369 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018370 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18371 // Allocate a secondary and primary cmd buffer
18372 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18373 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018374 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018375 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18376 command_buffer_allocate_info.commandBufferCount = 1;
18377
18378 VkCommandBuffer secondary_command_buffer;
18379 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18380 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18381 VkCommandBuffer primary_command_buffer;
18382 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18383 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18384 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18385 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18386 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18387 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18388 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18389
18390 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18391 ASSERT_VK_SUCCESS(err);
18392 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018393 image.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlise0006882016-11-03 10:14:28 -060018394 ASSERT_TRUE(image.initialized());
18395 VkImageMemoryBarrier img_barrier = {};
18396 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18397 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18398 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18399 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18400 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18401 img_barrier.image = image.handle();
18402 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18403 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18404 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18405 img_barrier.subresourceRange.baseArrayLayer = 0;
18406 img_barrier.subresourceRange.baseMipLevel = 0;
18407 img_barrier.subresourceRange.layerCount = 1;
18408 img_barrier.subresourceRange.levelCount = 1;
18409 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18410 0, nullptr, 1, &img_barrier);
18411 err = vkEndCommandBuffer(secondary_command_buffer);
18412 ASSERT_VK_SUCCESS(err);
18413
18414 // Now update primary cmd buffer to execute secondary and transitions image
18415 command_buffer_begin_info.pInheritanceInfo = nullptr;
18416 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18417 ASSERT_VK_SUCCESS(err);
18418 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18419 VkImageMemoryBarrier img_barrier2 = {};
18420 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18421 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18422 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18423 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18424 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18425 img_barrier2.image = image.handle();
18426 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18427 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18428 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18429 img_barrier2.subresourceRange.baseArrayLayer = 0;
18430 img_barrier2.subresourceRange.baseMipLevel = 0;
18431 img_barrier2.subresourceRange.layerCount = 1;
18432 img_barrier2.subresourceRange.levelCount = 1;
18433 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18434 nullptr, 1, &img_barrier2);
18435 err = vkEndCommandBuffer(primary_command_buffer);
18436 ASSERT_VK_SUCCESS(err);
18437 VkSubmitInfo submit_info = {};
18438 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18439 submit_info.commandBufferCount = 1;
18440 submit_info.pCommandBuffers = &primary_command_buffer;
18441 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18442 ASSERT_VK_SUCCESS(err);
18443 m_errorMonitor->VerifyNotFound();
18444 err = vkDeviceWaitIdle(m_device->device());
18445 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018446 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18447 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018448}
18449
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018450// This is a positive test. No failures are expected.
18451TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018452 TEST_DESCRIPTION(
18453 "Ensure that the vkUpdateDescriptorSets validation code "
18454 "is ignoring VkWriteDescriptorSet members that are not "
18455 "related to the descriptor type specified by "
18456 "VkWriteDescriptorSet::descriptorType. Correct "
18457 "validation behavior will result in the test running to "
18458 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018459
18460 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18461
Tony Barbour1fa09702017-03-16 12:09:08 -060018462 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018463
18464 // Image Case
18465 {
18466 m_errorMonitor->ExpectSuccess();
18467
18468 VkImage image;
18469 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18470 const int32_t tex_width = 32;
18471 const int32_t tex_height = 32;
18472 VkImageCreateInfo image_create_info = {};
18473 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18474 image_create_info.pNext = NULL;
18475 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18476 image_create_info.format = tex_format;
18477 image_create_info.extent.width = tex_width;
18478 image_create_info.extent.height = tex_height;
18479 image_create_info.extent.depth = 1;
18480 image_create_info.mipLevels = 1;
18481 image_create_info.arrayLayers = 1;
18482 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18483 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18484 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18485 image_create_info.flags = 0;
18486 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18487 ASSERT_VK_SUCCESS(err);
18488
18489 VkMemoryRequirements memory_reqs;
18490 VkDeviceMemory image_memory;
18491 bool pass;
18492 VkMemoryAllocateInfo memory_info = {};
18493 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18494 memory_info.pNext = NULL;
18495 memory_info.allocationSize = 0;
18496 memory_info.memoryTypeIndex = 0;
18497 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18498 memory_info.allocationSize = memory_reqs.size;
18499 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18500 ASSERT_TRUE(pass);
18501 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18502 ASSERT_VK_SUCCESS(err);
18503 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18504 ASSERT_VK_SUCCESS(err);
18505
18506 VkImageViewCreateInfo image_view_create_info = {};
18507 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18508 image_view_create_info.image = image;
18509 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18510 image_view_create_info.format = tex_format;
18511 image_view_create_info.subresourceRange.layerCount = 1;
18512 image_view_create_info.subresourceRange.baseMipLevel = 0;
18513 image_view_create_info.subresourceRange.levelCount = 1;
18514 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18515
18516 VkImageView view;
18517 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18518 ASSERT_VK_SUCCESS(err);
18519
18520 VkDescriptorPoolSize ds_type_count = {};
18521 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18522 ds_type_count.descriptorCount = 1;
18523
18524 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18525 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18526 ds_pool_ci.pNext = NULL;
18527 ds_pool_ci.maxSets = 1;
18528 ds_pool_ci.poolSizeCount = 1;
18529 ds_pool_ci.pPoolSizes = &ds_type_count;
18530
18531 VkDescriptorPool ds_pool;
18532 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18533 ASSERT_VK_SUCCESS(err);
18534
18535 VkDescriptorSetLayoutBinding dsl_binding = {};
18536 dsl_binding.binding = 0;
18537 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18538 dsl_binding.descriptorCount = 1;
18539 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18540 dsl_binding.pImmutableSamplers = NULL;
18541
18542 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18543 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18544 ds_layout_ci.pNext = NULL;
18545 ds_layout_ci.bindingCount = 1;
18546 ds_layout_ci.pBindings = &dsl_binding;
18547 VkDescriptorSetLayout ds_layout;
18548 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18549 ASSERT_VK_SUCCESS(err);
18550
18551 VkDescriptorSet descriptor_set;
18552 VkDescriptorSetAllocateInfo alloc_info = {};
18553 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18554 alloc_info.descriptorSetCount = 1;
18555 alloc_info.descriptorPool = ds_pool;
18556 alloc_info.pSetLayouts = &ds_layout;
18557 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18558 ASSERT_VK_SUCCESS(err);
18559
18560 VkDescriptorImageInfo image_info = {};
18561 image_info.imageView = view;
18562 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18563
18564 VkWriteDescriptorSet descriptor_write;
18565 memset(&descriptor_write, 0, sizeof(descriptor_write));
18566 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18567 descriptor_write.dstSet = descriptor_set;
18568 descriptor_write.dstBinding = 0;
18569 descriptor_write.descriptorCount = 1;
18570 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18571 descriptor_write.pImageInfo = &image_info;
18572
18573 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18574 // be
18575 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18576 // This will most likely produce a crash if the parameter_validation
18577 // layer
18578 // does not correctly ignore pBufferInfo.
18579 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18580 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18581
18582 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18583
18584 m_errorMonitor->VerifyNotFound();
18585
18586 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18587 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18588 vkDestroyImageView(m_device->device(), view, NULL);
18589 vkDestroyImage(m_device->device(), image, NULL);
18590 vkFreeMemory(m_device->device(), image_memory, NULL);
18591 }
18592
18593 // Buffer Case
18594 {
18595 m_errorMonitor->ExpectSuccess();
18596
18597 VkBuffer buffer;
18598 uint32_t queue_family_index = 0;
18599 VkBufferCreateInfo buffer_create_info = {};
18600 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18601 buffer_create_info.size = 1024;
18602 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18603 buffer_create_info.queueFamilyIndexCount = 1;
18604 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18605
18606 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18607 ASSERT_VK_SUCCESS(err);
18608
18609 VkMemoryRequirements memory_reqs;
18610 VkDeviceMemory buffer_memory;
18611 bool pass;
18612 VkMemoryAllocateInfo memory_info = {};
18613 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18614 memory_info.pNext = NULL;
18615 memory_info.allocationSize = 0;
18616 memory_info.memoryTypeIndex = 0;
18617
18618 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18619 memory_info.allocationSize = memory_reqs.size;
18620 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18621 ASSERT_TRUE(pass);
18622
18623 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18624 ASSERT_VK_SUCCESS(err);
18625 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18626 ASSERT_VK_SUCCESS(err);
18627
18628 VkDescriptorPoolSize ds_type_count = {};
18629 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18630 ds_type_count.descriptorCount = 1;
18631
18632 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18633 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18634 ds_pool_ci.pNext = NULL;
18635 ds_pool_ci.maxSets = 1;
18636 ds_pool_ci.poolSizeCount = 1;
18637 ds_pool_ci.pPoolSizes = &ds_type_count;
18638
18639 VkDescriptorPool ds_pool;
18640 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18641 ASSERT_VK_SUCCESS(err);
18642
18643 VkDescriptorSetLayoutBinding dsl_binding = {};
18644 dsl_binding.binding = 0;
18645 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18646 dsl_binding.descriptorCount = 1;
18647 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18648 dsl_binding.pImmutableSamplers = NULL;
18649
18650 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18651 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18652 ds_layout_ci.pNext = NULL;
18653 ds_layout_ci.bindingCount = 1;
18654 ds_layout_ci.pBindings = &dsl_binding;
18655 VkDescriptorSetLayout ds_layout;
18656 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18657 ASSERT_VK_SUCCESS(err);
18658
18659 VkDescriptorSet descriptor_set;
18660 VkDescriptorSetAllocateInfo alloc_info = {};
18661 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18662 alloc_info.descriptorSetCount = 1;
18663 alloc_info.descriptorPool = ds_pool;
18664 alloc_info.pSetLayouts = &ds_layout;
18665 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18666 ASSERT_VK_SUCCESS(err);
18667
18668 VkDescriptorBufferInfo buffer_info = {};
18669 buffer_info.buffer = buffer;
18670 buffer_info.offset = 0;
18671 buffer_info.range = 1024;
18672
18673 VkWriteDescriptorSet descriptor_write;
18674 memset(&descriptor_write, 0, sizeof(descriptor_write));
18675 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18676 descriptor_write.dstSet = descriptor_set;
18677 descriptor_write.dstBinding = 0;
18678 descriptor_write.descriptorCount = 1;
18679 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18680 descriptor_write.pBufferInfo = &buffer_info;
18681
18682 // Set pImageInfo and pTexelBufferView to invalid values, which should
18683 // be
18684 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18685 // This will most likely produce a crash if the parameter_validation
18686 // layer
18687 // does not correctly ignore pImageInfo.
18688 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18689 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18690
18691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18692
18693 m_errorMonitor->VerifyNotFound();
18694
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018695 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18696 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18697 vkDestroyBuffer(m_device->device(), buffer, NULL);
18698 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18699 }
18700
18701 // Texel Buffer Case
18702 {
18703 m_errorMonitor->ExpectSuccess();
18704
18705 VkBuffer buffer;
18706 uint32_t queue_family_index = 0;
18707 VkBufferCreateInfo buffer_create_info = {};
18708 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18709 buffer_create_info.size = 1024;
18710 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18711 buffer_create_info.queueFamilyIndexCount = 1;
18712 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18713
18714 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18715 ASSERT_VK_SUCCESS(err);
18716
18717 VkMemoryRequirements memory_reqs;
18718 VkDeviceMemory buffer_memory;
18719 bool pass;
18720 VkMemoryAllocateInfo memory_info = {};
18721 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18722 memory_info.pNext = NULL;
18723 memory_info.allocationSize = 0;
18724 memory_info.memoryTypeIndex = 0;
18725
18726 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18727 memory_info.allocationSize = memory_reqs.size;
18728 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18729 ASSERT_TRUE(pass);
18730
18731 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18732 ASSERT_VK_SUCCESS(err);
18733 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18734 ASSERT_VK_SUCCESS(err);
18735
18736 VkBufferViewCreateInfo buff_view_ci = {};
18737 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18738 buff_view_ci.buffer = buffer;
18739 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18740 buff_view_ci.range = VK_WHOLE_SIZE;
18741 VkBufferView buffer_view;
18742 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18743
18744 VkDescriptorPoolSize ds_type_count = {};
18745 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18746 ds_type_count.descriptorCount = 1;
18747
18748 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18749 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18750 ds_pool_ci.pNext = NULL;
18751 ds_pool_ci.maxSets = 1;
18752 ds_pool_ci.poolSizeCount = 1;
18753 ds_pool_ci.pPoolSizes = &ds_type_count;
18754
18755 VkDescriptorPool ds_pool;
18756 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18757 ASSERT_VK_SUCCESS(err);
18758
18759 VkDescriptorSetLayoutBinding dsl_binding = {};
18760 dsl_binding.binding = 0;
18761 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18762 dsl_binding.descriptorCount = 1;
18763 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18764 dsl_binding.pImmutableSamplers = NULL;
18765
18766 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18767 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18768 ds_layout_ci.pNext = NULL;
18769 ds_layout_ci.bindingCount = 1;
18770 ds_layout_ci.pBindings = &dsl_binding;
18771 VkDescriptorSetLayout ds_layout;
18772 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18773 ASSERT_VK_SUCCESS(err);
18774
18775 VkDescriptorSet descriptor_set;
18776 VkDescriptorSetAllocateInfo alloc_info = {};
18777 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18778 alloc_info.descriptorSetCount = 1;
18779 alloc_info.descriptorPool = ds_pool;
18780 alloc_info.pSetLayouts = &ds_layout;
18781 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18782 ASSERT_VK_SUCCESS(err);
18783
18784 VkWriteDescriptorSet descriptor_write;
18785 memset(&descriptor_write, 0, sizeof(descriptor_write));
18786 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18787 descriptor_write.dstSet = descriptor_set;
18788 descriptor_write.dstBinding = 0;
18789 descriptor_write.descriptorCount = 1;
18790 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18791 descriptor_write.pTexelBufferView = &buffer_view;
18792
18793 // Set pImageInfo and pBufferInfo to invalid values, which should be
18794 // ignored for descriptorType ==
18795 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18796 // This will most likely produce a crash if the parameter_validation
18797 // layer
18798 // does not correctly ignore pImageInfo and pBufferInfo.
18799 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18800 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18801
18802 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18803
18804 m_errorMonitor->VerifyNotFound();
18805
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018806 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18807 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18808 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18809 vkDestroyBuffer(m_device->device(), buffer, NULL);
18810 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18811 }
18812}
18813
Tobin Ehlisf7428442016-10-25 07:58:24 -060018814TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18815 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18816
Tony Barbour1fa09702017-03-16 12:09:08 -060018817 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018818 // Create layout where two binding #s are "1"
18819 static const uint32_t NUM_BINDINGS = 3;
18820 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18821 dsl_binding[0].binding = 1;
18822 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18823 dsl_binding[0].descriptorCount = 1;
18824 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18825 dsl_binding[0].pImmutableSamplers = NULL;
18826 dsl_binding[1].binding = 0;
18827 dsl_binding[1].descriptorCount = 1;
18828 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18829 dsl_binding[1].descriptorCount = 1;
18830 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18831 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018832 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018833 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18834 dsl_binding[2].descriptorCount = 1;
18835 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18836 dsl_binding[2].pImmutableSamplers = NULL;
18837
18838 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18839 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18840 ds_layout_ci.pNext = NULL;
18841 ds_layout_ci.bindingCount = NUM_BINDINGS;
18842 ds_layout_ci.pBindings = dsl_binding;
18843 VkDescriptorSetLayout ds_layout;
18844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18845 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18846 m_errorMonitor->VerifyFound();
18847}
18848
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018849TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018850 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18851
Tony Barbour1fa09702017-03-16 12:09:08 -060018852 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018853
Tony Barbour552f6c02016-12-21 14:34:07 -070018854 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018855
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018856 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18857
18858 {
18859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18860 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18861 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18862 m_errorMonitor->VerifyFound();
18863 }
18864
18865 {
18866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18867 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18868 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18869 m_errorMonitor->VerifyFound();
18870 }
18871
18872 {
18873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18874 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18875 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18876 m_errorMonitor->VerifyFound();
18877 }
18878
18879 {
18880 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18881 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18882 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18883 m_errorMonitor->VerifyFound();
18884 }
18885
18886 {
18887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18888 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18889 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18890 m_errorMonitor->VerifyFound();
18891 }
18892
18893 {
18894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18895 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18896 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18897 m_errorMonitor->VerifyFound();
18898 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018899
18900 {
18901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18902 VkRect2D scissor = {{-1, 0}, {16, 16}};
18903 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18904 m_errorMonitor->VerifyFound();
18905 }
18906
18907 {
18908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18909 VkRect2D scissor = {{0, -2}, {16, 16}};
18910 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18911 m_errorMonitor->VerifyFound();
18912 }
18913
18914 {
18915 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18916 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18917 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18918 m_errorMonitor->VerifyFound();
18919 }
18920
18921 {
18922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18923 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18924 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18925 m_errorMonitor->VerifyFound();
18926 }
18927
Tony Barbour552f6c02016-12-21 14:34:07 -070018928 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018929}
18930
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018931// This is a positive test. No failures are expected.
18932TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18933 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18934 VkResult err;
18935
Tony Barbour1fa09702017-03-16 12:09:08 -060018936 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018937 m_errorMonitor->ExpectSuccess();
18938 VkDescriptorPoolSize ds_type_count = {};
18939 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18940 ds_type_count.descriptorCount = 2;
18941
18942 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18943 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18944 ds_pool_ci.pNext = NULL;
18945 ds_pool_ci.maxSets = 1;
18946 ds_pool_ci.poolSizeCount = 1;
18947 ds_pool_ci.pPoolSizes = &ds_type_count;
18948
18949 VkDescriptorPool ds_pool;
18950 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18951 ASSERT_VK_SUCCESS(err);
18952
18953 // Create layout with two uniform buffer descriptors w/ empty binding between them
18954 static const uint32_t NUM_BINDINGS = 3;
18955 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18956 dsl_binding[0].binding = 0;
18957 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18958 dsl_binding[0].descriptorCount = 1;
18959 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18960 dsl_binding[0].pImmutableSamplers = NULL;
18961 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018962 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018963 dsl_binding[2].binding = 2;
18964 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18965 dsl_binding[2].descriptorCount = 1;
18966 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18967 dsl_binding[2].pImmutableSamplers = NULL;
18968
18969 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18970 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18971 ds_layout_ci.pNext = NULL;
18972 ds_layout_ci.bindingCount = NUM_BINDINGS;
18973 ds_layout_ci.pBindings = dsl_binding;
18974 VkDescriptorSetLayout ds_layout;
18975 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18976 ASSERT_VK_SUCCESS(err);
18977
18978 VkDescriptorSet descriptor_set = {};
18979 VkDescriptorSetAllocateInfo alloc_info = {};
18980 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18981 alloc_info.descriptorSetCount = 1;
18982 alloc_info.descriptorPool = ds_pool;
18983 alloc_info.pSetLayouts = &ds_layout;
18984 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18985 ASSERT_VK_SUCCESS(err);
18986
18987 // Create a buffer to be used for update
18988 VkBufferCreateInfo buff_ci = {};
18989 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18990 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18991 buff_ci.size = 256;
18992 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18993 VkBuffer buffer;
18994 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
18995 ASSERT_VK_SUCCESS(err);
18996 // Have to bind memory to buffer before descriptor update
18997 VkMemoryAllocateInfo mem_alloc = {};
18998 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18999 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019000 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019001 mem_alloc.memoryTypeIndex = 0;
19002
19003 VkMemoryRequirements mem_reqs;
19004 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19005 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19006 if (!pass) {
19007 vkDestroyBuffer(m_device->device(), buffer, NULL);
19008 return;
19009 }
19010
19011 VkDeviceMemory mem;
19012 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19013 ASSERT_VK_SUCCESS(err);
19014 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19015 ASSERT_VK_SUCCESS(err);
19016
19017 // Only update the descriptor at binding 2
19018 VkDescriptorBufferInfo buff_info = {};
19019 buff_info.buffer = buffer;
19020 buff_info.offset = 0;
19021 buff_info.range = VK_WHOLE_SIZE;
19022 VkWriteDescriptorSet descriptor_write = {};
19023 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19024 descriptor_write.dstBinding = 2;
19025 descriptor_write.descriptorCount = 1;
19026 descriptor_write.pTexelBufferView = nullptr;
19027 descriptor_write.pBufferInfo = &buff_info;
19028 descriptor_write.pImageInfo = nullptr;
19029 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19030 descriptor_write.dstSet = descriptor_set;
19031
19032 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19033
19034 m_errorMonitor->VerifyNotFound();
19035 // Cleanup
19036 vkFreeMemory(m_device->device(), mem, NULL);
19037 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19038 vkDestroyBuffer(m_device->device(), buffer, NULL);
19039 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19040}
19041
19042// This is a positive test. No failures are expected.
19043TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19044 VkResult err;
19045 bool pass;
19046
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019047 TEST_DESCRIPTION(
19048 "Create a buffer, allocate memory, bind memory, destroy "
19049 "the buffer, create an image, and bind the same memory to "
19050 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019051
19052 m_errorMonitor->ExpectSuccess();
19053
Tony Barbour1fa09702017-03-16 12:09:08 -060019054 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019055
19056 VkBuffer buffer;
19057 VkImage image;
19058 VkDeviceMemory mem;
19059 VkMemoryRequirements mem_reqs;
19060
19061 VkBufferCreateInfo buf_info = {};
19062 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19063 buf_info.pNext = NULL;
19064 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19065 buf_info.size = 256;
19066 buf_info.queueFamilyIndexCount = 0;
19067 buf_info.pQueueFamilyIndices = NULL;
19068 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19069 buf_info.flags = 0;
19070 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19071 ASSERT_VK_SUCCESS(err);
19072
19073 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19074
19075 VkMemoryAllocateInfo alloc_info = {};
19076 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19077 alloc_info.pNext = NULL;
19078 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019079
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019080 // Ensure memory is big enough for both bindings
19081 alloc_info.allocationSize = 0x10000;
19082
19083 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19084 if (!pass) {
19085 vkDestroyBuffer(m_device->device(), buffer, NULL);
19086 return;
19087 }
19088
19089 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19090 ASSERT_VK_SUCCESS(err);
19091
19092 uint8_t *pData;
19093 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19094 ASSERT_VK_SUCCESS(err);
19095
19096 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19097
19098 vkUnmapMemory(m_device->device(), mem);
19099
19100 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19101 ASSERT_VK_SUCCESS(err);
19102
19103 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19104 // memory. In fact, it was never used by the GPU.
19105 // Just be be sure, wait for idle.
19106 vkDestroyBuffer(m_device->device(), buffer, NULL);
19107 vkDeviceWaitIdle(m_device->device());
19108
Tobin Ehlis6a005702016-12-28 15:25:56 -070019109 // Use optimal as some platforms report linear support but then fail image creation
19110 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19111 VkImageFormatProperties image_format_properties;
19112 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19113 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19114 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019115 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019116 vkFreeMemory(m_device->device(), mem, NULL);
19117 return;
19118 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019119 VkImageCreateInfo image_create_info = {};
19120 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19121 image_create_info.pNext = NULL;
19122 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19123 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19124 image_create_info.extent.width = 64;
19125 image_create_info.extent.height = 64;
19126 image_create_info.extent.depth = 1;
19127 image_create_info.mipLevels = 1;
19128 image_create_info.arrayLayers = 1;
19129 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019130 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019131 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19132 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19133 image_create_info.queueFamilyIndexCount = 0;
19134 image_create_info.pQueueFamilyIndices = NULL;
19135 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19136 image_create_info.flags = 0;
19137
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019138 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019139 * to be textures or it will be the staging image if they are not.
19140 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019141 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19142 ASSERT_VK_SUCCESS(err);
19143
19144 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19145
Tobin Ehlis6a005702016-12-28 15:25:56 -070019146 VkMemoryAllocateInfo mem_alloc = {};
19147 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19148 mem_alloc.pNext = NULL;
19149 mem_alloc.allocationSize = 0;
19150 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019151 mem_alloc.allocationSize = mem_reqs.size;
19152
19153 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19154 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019155 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019156 vkDestroyImage(m_device->device(), image, NULL);
19157 return;
19158 }
19159
19160 // VALIDATION FAILURE:
19161 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19162 ASSERT_VK_SUCCESS(err);
19163
19164 m_errorMonitor->VerifyNotFound();
19165
19166 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019167 vkDestroyImage(m_device->device(), image, NULL);
19168}
19169
Tony Barbourab713912017-02-02 14:17:35 -070019170// This is a positive test. No failures are expected.
19171TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19172 VkResult err;
19173
19174 TEST_DESCRIPTION(
19175 "Call all applicable destroy and free routines with NULL"
19176 "handles, expecting no validation errors");
19177
19178 m_errorMonitor->ExpectSuccess();
19179
Tony Barbour1fa09702017-03-16 12:09:08 -060019180 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019181 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19182 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19183 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19184 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19185 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19186 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19187 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19188 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19189 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19190 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19191 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19192 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19193 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19194 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19195 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19196 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19197 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19198 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19199 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19200 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19201
19202 VkCommandPool command_pool;
19203 VkCommandPoolCreateInfo pool_create_info{};
19204 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19205 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19206 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19207 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19208 VkCommandBuffer command_buffers[3] = {};
19209 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19210 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19211 command_buffer_allocate_info.commandPool = command_pool;
19212 command_buffer_allocate_info.commandBufferCount = 1;
19213 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19214 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19215 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19216 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19217
19218 VkDescriptorPoolSize ds_type_count = {};
19219 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19220 ds_type_count.descriptorCount = 1;
19221
19222 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19223 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19224 ds_pool_ci.pNext = NULL;
19225 ds_pool_ci.maxSets = 1;
19226 ds_pool_ci.poolSizeCount = 1;
19227 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19228 ds_pool_ci.pPoolSizes = &ds_type_count;
19229
19230 VkDescriptorPool ds_pool;
19231 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19232 ASSERT_VK_SUCCESS(err);
19233
19234 VkDescriptorSetLayoutBinding dsl_binding = {};
19235 dsl_binding.binding = 2;
19236 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19237 dsl_binding.descriptorCount = 1;
19238 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19239 dsl_binding.pImmutableSamplers = NULL;
19240 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19241 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19242 ds_layout_ci.pNext = NULL;
19243 ds_layout_ci.bindingCount = 1;
19244 ds_layout_ci.pBindings = &dsl_binding;
19245 VkDescriptorSetLayout ds_layout;
19246 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19247 ASSERT_VK_SUCCESS(err);
19248
19249 VkDescriptorSet descriptor_sets[3] = {};
19250 VkDescriptorSetAllocateInfo alloc_info = {};
19251 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19252 alloc_info.descriptorSetCount = 1;
19253 alloc_info.descriptorPool = ds_pool;
19254 alloc_info.pSetLayouts = &ds_layout;
19255 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19256 ASSERT_VK_SUCCESS(err);
19257 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19258 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19259 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19260
19261 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19262
19263 m_errorMonitor->VerifyNotFound();
19264}
19265
Tony Barbour626994c2017-02-08 15:29:37 -070019266TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019267 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019268
19269 m_errorMonitor->ExpectSuccess();
19270
Tony Barbour1fa09702017-03-16 12:09:08 -060019271 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019272 VkCommandBuffer cmd_bufs[4];
19273 VkCommandBufferAllocateInfo alloc_info;
19274 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19275 alloc_info.pNext = NULL;
19276 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019277 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019278 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19279 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19280 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019281 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19282 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19283 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019284 ASSERT_TRUE(image.initialized());
19285 VkCommandBufferBeginInfo cb_binfo;
19286 cb_binfo.pNext = NULL;
19287 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19288 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19289 cb_binfo.flags = 0;
19290 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19291 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19292 VkImageMemoryBarrier img_barrier = {};
19293 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19294 img_barrier.pNext = NULL;
19295 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19296 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19297 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19298 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19299 img_barrier.image = image.handle();
19300 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19301 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19302 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19303 img_barrier.subresourceRange.baseArrayLayer = 0;
19304 img_barrier.subresourceRange.baseMipLevel = 0;
19305 img_barrier.subresourceRange.layerCount = 1;
19306 img_barrier.subresourceRange.levelCount = 1;
19307 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19308 &img_barrier);
19309 vkEndCommandBuffer(cmd_bufs[0]);
19310 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19311 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19312 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19313 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19314 &img_barrier);
19315 vkEndCommandBuffer(cmd_bufs[1]);
19316 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19317 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19318 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19319 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19320 &img_barrier);
19321 vkEndCommandBuffer(cmd_bufs[2]);
19322 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19323 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19324 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19325 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19326 &img_barrier);
19327 vkEndCommandBuffer(cmd_bufs[3]);
19328
19329 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19330 VkSemaphore semaphore1, semaphore2;
19331 VkSemaphoreCreateInfo semaphore_create_info{};
19332 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19333 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19334 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19335 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19336 VkSubmitInfo submit_info[3];
19337 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19338 submit_info[0].pNext = nullptr;
19339 submit_info[0].commandBufferCount = 1;
19340 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19341 submit_info[0].signalSemaphoreCount = 1;
19342 submit_info[0].pSignalSemaphores = &semaphore1;
19343 submit_info[0].waitSemaphoreCount = 0;
19344 submit_info[0].pWaitDstStageMask = nullptr;
19345 submit_info[0].pWaitDstStageMask = flags;
19346 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19347 submit_info[1].pNext = nullptr;
19348 submit_info[1].commandBufferCount = 1;
19349 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19350 submit_info[1].waitSemaphoreCount = 1;
19351 submit_info[1].pWaitSemaphores = &semaphore1;
19352 submit_info[1].signalSemaphoreCount = 1;
19353 submit_info[1].pSignalSemaphores = &semaphore2;
19354 submit_info[1].pWaitDstStageMask = flags;
19355 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19356 submit_info[2].pNext = nullptr;
19357 submit_info[2].commandBufferCount = 2;
19358 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19359 submit_info[2].waitSemaphoreCount = 1;
19360 submit_info[2].pWaitSemaphores = &semaphore2;
19361 submit_info[2].signalSemaphoreCount = 0;
19362 submit_info[2].pSignalSemaphores = nullptr;
19363 submit_info[2].pWaitDstStageMask = flags;
19364 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19365 vkQueueWaitIdle(m_device->m_queue);
19366
19367 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19368 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19369 m_errorMonitor->VerifyNotFound();
19370}
19371
Tobin Ehlis953e8392016-11-17 10:54:13 -070019372TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19373 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19374 // We previously had a bug where dynamic offset of inactive bindings was still being used
19375 VkResult err;
19376 m_errorMonitor->ExpectSuccess();
19377
Tony Barbour1fa09702017-03-16 12:09:08 -060019378 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019379 ASSERT_NO_FATAL_FAILURE(InitViewport());
19380 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19381
19382 VkDescriptorPoolSize ds_type_count = {};
19383 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19384 ds_type_count.descriptorCount = 3;
19385
19386 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19387 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19388 ds_pool_ci.pNext = NULL;
19389 ds_pool_ci.maxSets = 1;
19390 ds_pool_ci.poolSizeCount = 1;
19391 ds_pool_ci.pPoolSizes = &ds_type_count;
19392
19393 VkDescriptorPool ds_pool;
19394 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19395 ASSERT_VK_SUCCESS(err);
19396
19397 const uint32_t BINDING_COUNT = 3;
19398 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019399 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019400 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19401 dsl_binding[0].descriptorCount = 1;
19402 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19403 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019404 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019405 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19406 dsl_binding[1].descriptorCount = 1;
19407 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19408 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019409 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019410 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19411 dsl_binding[2].descriptorCount = 1;
19412 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19413 dsl_binding[2].pImmutableSamplers = NULL;
19414
19415 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19416 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19417 ds_layout_ci.pNext = NULL;
19418 ds_layout_ci.bindingCount = BINDING_COUNT;
19419 ds_layout_ci.pBindings = dsl_binding;
19420 VkDescriptorSetLayout ds_layout;
19421 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19422 ASSERT_VK_SUCCESS(err);
19423
19424 VkDescriptorSet descriptor_set;
19425 VkDescriptorSetAllocateInfo alloc_info = {};
19426 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19427 alloc_info.descriptorSetCount = 1;
19428 alloc_info.descriptorPool = ds_pool;
19429 alloc_info.pSetLayouts = &ds_layout;
19430 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19431 ASSERT_VK_SUCCESS(err);
19432
19433 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19434 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19435 pipeline_layout_ci.pNext = NULL;
19436 pipeline_layout_ci.setLayoutCount = 1;
19437 pipeline_layout_ci.pSetLayouts = &ds_layout;
19438
19439 VkPipelineLayout pipeline_layout;
19440 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19441 ASSERT_VK_SUCCESS(err);
19442
19443 // Create two buffers to update the descriptors with
19444 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19445 uint32_t qfi = 0;
19446 VkBufferCreateInfo buffCI = {};
19447 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19448 buffCI.size = 2048;
19449 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19450 buffCI.queueFamilyIndexCount = 1;
19451 buffCI.pQueueFamilyIndices = &qfi;
19452
19453 VkBuffer dyub1;
19454 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19455 ASSERT_VK_SUCCESS(err);
19456 // buffer2
19457 buffCI.size = 1024;
19458 VkBuffer dyub2;
19459 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19460 ASSERT_VK_SUCCESS(err);
19461 // Allocate memory and bind to buffers
19462 VkMemoryAllocateInfo mem_alloc[2] = {};
19463 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19464 mem_alloc[0].pNext = NULL;
19465 mem_alloc[0].memoryTypeIndex = 0;
19466 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19467 mem_alloc[1].pNext = NULL;
19468 mem_alloc[1].memoryTypeIndex = 0;
19469
19470 VkMemoryRequirements mem_reqs1;
19471 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19472 VkMemoryRequirements mem_reqs2;
19473 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19474 mem_alloc[0].allocationSize = mem_reqs1.size;
19475 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19476 mem_alloc[1].allocationSize = mem_reqs2.size;
19477 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19478 if (!pass) {
19479 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19480 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19481 return;
19482 }
19483
19484 VkDeviceMemory mem1;
19485 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19486 ASSERT_VK_SUCCESS(err);
19487 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19488 ASSERT_VK_SUCCESS(err);
19489 VkDeviceMemory mem2;
19490 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19491 ASSERT_VK_SUCCESS(err);
19492 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19493 ASSERT_VK_SUCCESS(err);
19494 // Update descriptors
19495 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19496 buff_info[0].buffer = dyub1;
19497 buff_info[0].offset = 0;
19498 buff_info[0].range = 256;
19499 buff_info[1].buffer = dyub1;
19500 buff_info[1].offset = 256;
19501 buff_info[1].range = 512;
19502 buff_info[2].buffer = dyub2;
19503 buff_info[2].offset = 0;
19504 buff_info[2].range = 512;
19505
19506 VkWriteDescriptorSet descriptor_write;
19507 memset(&descriptor_write, 0, sizeof(descriptor_write));
19508 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19509 descriptor_write.dstSet = descriptor_set;
19510 descriptor_write.dstBinding = 0;
19511 descriptor_write.descriptorCount = BINDING_COUNT;
19512 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19513 descriptor_write.pBufferInfo = buff_info;
19514
19515 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19516
Tony Barbour552f6c02016-12-21 14:34:07 -070019517 m_commandBuffer->BeginCommandBuffer();
19518 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019519
19520 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019521 char const *vsSource =
19522 "#version 450\n"
19523 "\n"
19524 "out gl_PerVertex { \n"
19525 " vec4 gl_Position;\n"
19526 "};\n"
19527 "void main(){\n"
19528 " gl_Position = vec4(1);\n"
19529 "}\n";
19530 char const *fsSource =
19531 "#version 450\n"
19532 "\n"
19533 "layout(location=0) out vec4 x;\n"
19534 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19535 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19536 "void main(){\n"
19537 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19538 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019539 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19540 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19541 VkPipelineObj pipe(m_device);
19542 pipe.SetViewport(m_viewports);
19543 pipe.SetScissor(m_scissors);
19544 pipe.AddShader(&vs);
19545 pipe.AddShader(&fs);
19546 pipe.AddColorAttachment();
19547 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19548
19549 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19550 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19551 // we used to have a bug in this case.
19552 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19553 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19554 &descriptor_set, BINDING_COUNT, dyn_off);
19555 Draw(1, 0, 0, 0);
19556 m_errorMonitor->VerifyNotFound();
19557
19558 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19559 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19560 vkFreeMemory(m_device->device(), mem1, NULL);
19561 vkFreeMemory(m_device->device(), mem2, NULL);
19562
19563 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19564 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19565 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19566}
19567
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019568TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019569 TEST_DESCRIPTION(
19570 "Ensure that validations handling of non-coherent memory "
19571 "mapping while using VK_WHOLE_SIZE does not cause access "
19572 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019573 VkResult err;
19574 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019575 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019576
19577 VkDeviceMemory mem;
19578 VkMemoryRequirements mem_reqs;
19579 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019580 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019581 VkMemoryAllocateInfo alloc_info = {};
19582 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19583 alloc_info.pNext = NULL;
19584 alloc_info.memoryTypeIndex = 0;
19585
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019586 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019587 alloc_info.allocationSize = allocation_size;
19588
19589 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19590 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 -070019591 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019592 if (!pass) {
19593 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019594 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19595 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019596 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019597 pass = m_device->phy().set_memory_type(
19598 mem_reqs.memoryTypeBits, &alloc_info,
19599 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19600 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019601 if (!pass) {
19602 return;
19603 }
19604 }
19605 }
19606
19607 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19608 ASSERT_VK_SUCCESS(err);
19609
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019610 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019611 m_errorMonitor->ExpectSuccess();
19612 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19613 ASSERT_VK_SUCCESS(err);
19614 VkMappedMemoryRange mmr = {};
19615 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19616 mmr.memory = mem;
19617 mmr.offset = 0;
19618 mmr.size = VK_WHOLE_SIZE;
19619 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19620 ASSERT_VK_SUCCESS(err);
19621 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19622 ASSERT_VK_SUCCESS(err);
19623 m_errorMonitor->VerifyNotFound();
19624 vkUnmapMemory(m_device->device(), mem);
19625
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019626 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019627 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019628 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019629 ASSERT_VK_SUCCESS(err);
19630 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19631 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019632 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019633 mmr.size = VK_WHOLE_SIZE;
19634 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19635 ASSERT_VK_SUCCESS(err);
19636 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19637 ASSERT_VK_SUCCESS(err);
19638 m_errorMonitor->VerifyNotFound();
19639 vkUnmapMemory(m_device->device(), mem);
19640
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019641 // Map with offset and size
19642 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019643 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019644 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019645 ASSERT_VK_SUCCESS(err);
19646 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19647 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019648 mmr.offset = 4 * atom_size;
19649 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019650 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19651 ASSERT_VK_SUCCESS(err);
19652 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19653 ASSERT_VK_SUCCESS(err);
19654 m_errorMonitor->VerifyNotFound();
19655 vkUnmapMemory(m_device->device(), mem);
19656
19657 // Map without offset and flush WHOLE_SIZE with two separate offsets
19658 m_errorMonitor->ExpectSuccess();
19659 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19660 ASSERT_VK_SUCCESS(err);
19661 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19662 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019663 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019664 mmr.size = VK_WHOLE_SIZE;
19665 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19666 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019667 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019668 mmr.size = VK_WHOLE_SIZE;
19669 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19670 ASSERT_VK_SUCCESS(err);
19671 m_errorMonitor->VerifyNotFound();
19672 vkUnmapMemory(m_device->device(), mem);
19673
19674 vkFreeMemory(m_device->device(), mem, NULL);
19675}
19676
19677// This is a positive test. We used to expect error in this case but spec now allows it
19678TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19679 m_errorMonitor->ExpectSuccess();
19680 vk_testing::Fence testFence;
19681 VkFenceCreateInfo fenceInfo = {};
19682 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19683 fenceInfo.pNext = NULL;
19684
Tony Barbour1fa09702017-03-16 12:09:08 -060019685 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019686 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019687 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019688 VkResult result = vkResetFences(m_device->device(), 1, fences);
19689 ASSERT_VK_SUCCESS(result);
19690
19691 m_errorMonitor->VerifyNotFound();
19692}
19693
19694TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19695 m_errorMonitor->ExpectSuccess();
19696
Tony Barbour1fa09702017-03-16 12:09:08 -060019697 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019698 VkResult err;
19699
19700 // Record (empty!) command buffer that can be submitted multiple times
19701 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019702 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19703 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019704 m_commandBuffer->BeginCommandBuffer(&cbbi);
19705 m_commandBuffer->EndCommandBuffer();
19706
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019707 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019708 VkFence fence;
19709 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19710 ASSERT_VK_SUCCESS(err);
19711
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019712 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019713 VkSemaphore s1, s2;
19714 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19715 ASSERT_VK_SUCCESS(err);
19716 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19717 ASSERT_VK_SUCCESS(err);
19718
19719 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019720 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019721 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19722 ASSERT_VK_SUCCESS(err);
19723
19724 // Submit CB again, signaling s2.
19725 si.pSignalSemaphores = &s2;
19726 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19727 ASSERT_VK_SUCCESS(err);
19728
19729 // Wait for fence.
19730 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19731 ASSERT_VK_SUCCESS(err);
19732
19733 // CB is still in flight from second submission, but semaphore s1 is no
19734 // longer in flight. delete it.
19735 vkDestroySemaphore(m_device->device(), s1, nullptr);
19736
19737 m_errorMonitor->VerifyNotFound();
19738
19739 // Force device idle and clean up remaining objects
19740 vkDeviceWaitIdle(m_device->device());
19741 vkDestroySemaphore(m_device->device(), s2, nullptr);
19742 vkDestroyFence(m_device->device(), fence, nullptr);
19743}
19744
19745TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19746 m_errorMonitor->ExpectSuccess();
19747
Tony Barbour1fa09702017-03-16 12:09:08 -060019748 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019749 VkResult err;
19750
19751 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019752 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019753 VkFence f1;
19754 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19755 ASSERT_VK_SUCCESS(err);
19756
19757 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019758 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019759 VkFence f2;
19760 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19761 ASSERT_VK_SUCCESS(err);
19762
19763 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019764 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019765 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19766
19767 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019768 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019769 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19770
19771 // Should have both retired!
19772 vkDestroyFence(m_device->device(), f1, nullptr);
19773 vkDestroyFence(m_device->device(), f2, nullptr);
19774
19775 m_errorMonitor->VerifyNotFound();
19776}
19777
19778TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019779 TEST_DESCRIPTION(
19780 "Verify that creating an image view from an image with valid usage "
19781 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019782
Tony Barbour1fa09702017-03-16 12:09:08 -060019783 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019784
19785 m_errorMonitor->ExpectSuccess();
19786 // Verify that we can create a view with usage INPUT_ATTACHMENT
19787 VkImageObj image(m_device);
19788 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19789 ASSERT_TRUE(image.initialized());
19790 VkImageView imageView;
19791 VkImageViewCreateInfo ivci = {};
19792 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19793 ivci.image = image.handle();
19794 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19795 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19796 ivci.subresourceRange.layerCount = 1;
19797 ivci.subresourceRange.baseMipLevel = 0;
19798 ivci.subresourceRange.levelCount = 1;
19799 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19800
19801 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19802 m_errorMonitor->VerifyNotFound();
19803 vkDestroyImageView(m_device->device(), imageView, NULL);
19804}
19805
19806// This is a positive test. No failures are expected.
19807TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019808 TEST_DESCRIPTION(
19809 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19810 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019811
Tony Barbour1fa09702017-03-16 12:09:08 -060019812 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019813
19814 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019815 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019816 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019817
19818 m_errorMonitor->ExpectSuccess();
19819
19820 VkImage image;
19821 VkImageCreateInfo image_create_info = {};
19822 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19823 image_create_info.pNext = NULL;
19824 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19825 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19826 image_create_info.extent.width = 64;
19827 image_create_info.extent.height = 64;
19828 image_create_info.extent.depth = 1;
19829 image_create_info.mipLevels = 1;
19830 image_create_info.arrayLayers = 1;
19831 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19832 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19833 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19834 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19835 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19836 ASSERT_VK_SUCCESS(err);
19837
19838 VkMemoryRequirements memory_reqs;
19839 VkDeviceMemory memory_one, memory_two;
19840 bool pass;
19841 VkMemoryAllocateInfo memory_info = {};
19842 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19843 memory_info.pNext = NULL;
19844 memory_info.allocationSize = 0;
19845 memory_info.memoryTypeIndex = 0;
19846 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19847 // Find an image big enough to allow sparse mapping of 2 memory regions
19848 // Increase the image size until it is at least twice the
19849 // size of the required alignment, to ensure we can bind both
19850 // allocated memory blocks to the image on aligned offsets.
19851 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19852 vkDestroyImage(m_device->device(), image, nullptr);
19853 image_create_info.extent.width *= 2;
19854 image_create_info.extent.height *= 2;
19855 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19856 ASSERT_VK_SUCCESS(err);
19857 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19858 }
19859 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19860 // at the end of the first
19861 memory_info.allocationSize = memory_reqs.alignment;
19862 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19863 ASSERT_TRUE(pass);
19864 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19865 ASSERT_VK_SUCCESS(err);
19866 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19867 ASSERT_VK_SUCCESS(err);
19868 VkSparseMemoryBind binds[2];
19869 binds[0].flags = 0;
19870 binds[0].memory = memory_one;
19871 binds[0].memoryOffset = 0;
19872 binds[0].resourceOffset = 0;
19873 binds[0].size = memory_info.allocationSize;
19874 binds[1].flags = 0;
19875 binds[1].memory = memory_two;
19876 binds[1].memoryOffset = 0;
19877 binds[1].resourceOffset = memory_info.allocationSize;
19878 binds[1].size = memory_info.allocationSize;
19879
19880 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19881 opaqueBindInfo.image = image;
19882 opaqueBindInfo.bindCount = 2;
19883 opaqueBindInfo.pBinds = binds;
19884
19885 VkFence fence = VK_NULL_HANDLE;
19886 VkBindSparseInfo bindSparseInfo = {};
19887 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19888 bindSparseInfo.imageOpaqueBindCount = 1;
19889 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19890
19891 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19892 vkQueueWaitIdle(m_device->m_queue);
19893 vkDestroyImage(m_device->device(), image, NULL);
19894 vkFreeMemory(m_device->device(), memory_one, NULL);
19895 vkFreeMemory(m_device->device(), memory_two, NULL);
19896 m_errorMonitor->VerifyNotFound();
19897}
19898
19899TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019900 TEST_DESCRIPTION(
19901 "Ensure that CmdBeginRenderPass with an attachment's "
19902 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19903 "the command buffer has prior knowledge of that "
19904 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019905
19906 m_errorMonitor->ExpectSuccess();
19907
Tony Barbour1fa09702017-03-16 12:09:08 -060019908 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019909
19910 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019911 VkAttachmentDescription attachment = {0,
19912 VK_FORMAT_R8G8B8A8_UNORM,
19913 VK_SAMPLE_COUNT_1_BIT,
19914 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19915 VK_ATTACHMENT_STORE_OP_STORE,
19916 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19917 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19918 VK_IMAGE_LAYOUT_UNDEFINED,
19919 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019920
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019921 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019922
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019923 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019924
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019925 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019926
19927 VkRenderPass rp;
19928 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19929 ASSERT_VK_SUCCESS(err);
19930
19931 // A compatible framebuffer.
19932 VkImageObj image(m_device);
19933 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19934 ASSERT_TRUE(image.initialized());
19935
19936 VkImageViewCreateInfo ivci = {
19937 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19938 nullptr,
19939 0,
19940 image.handle(),
19941 VK_IMAGE_VIEW_TYPE_2D,
19942 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019943 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19944 VK_COMPONENT_SWIZZLE_IDENTITY},
19945 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019946 };
19947 VkImageView view;
19948 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19949 ASSERT_VK_SUCCESS(err);
19950
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019951 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019952 VkFramebuffer fb;
19953 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19954 ASSERT_VK_SUCCESS(err);
19955
19956 // Record a single command buffer which uses this renderpass twice. The
19957 // bug is triggered at the beginning of the second renderpass, when the
19958 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019959 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 -070019960 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019961 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19962 vkCmdEndRenderPass(m_commandBuffer->handle());
19963 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19964
19965 m_errorMonitor->VerifyNotFound();
19966
19967 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019968 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019969
19970 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19971 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19972 vkDestroyImageView(m_device->device(), view, nullptr);
19973}
19974
19975TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019976 TEST_DESCRIPTION(
19977 "This test should pass. Create a Framebuffer and "
19978 "command buffer, bind them together, then destroy "
19979 "command pool and framebuffer and verify there are no "
19980 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019981
19982 m_errorMonitor->ExpectSuccess();
19983
Tony Barbour1fa09702017-03-16 12:09:08 -060019984 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019985
19986 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019987 VkAttachmentDescription attachment = {0,
19988 VK_FORMAT_R8G8B8A8_UNORM,
19989 VK_SAMPLE_COUNT_1_BIT,
19990 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19991 VK_ATTACHMENT_STORE_OP_STORE,
19992 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19993 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19994 VK_IMAGE_LAYOUT_UNDEFINED,
19995 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019996
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019997 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019998
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019999 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020000
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020001 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020002
20003 VkRenderPass rp;
20004 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20005 ASSERT_VK_SUCCESS(err);
20006
20007 // A compatible framebuffer.
20008 VkImageObj image(m_device);
20009 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20010 ASSERT_TRUE(image.initialized());
20011
20012 VkImageViewCreateInfo ivci = {
20013 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20014 nullptr,
20015 0,
20016 image.handle(),
20017 VK_IMAGE_VIEW_TYPE_2D,
20018 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020019 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20020 VK_COMPONENT_SWIZZLE_IDENTITY},
20021 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020022 };
20023 VkImageView view;
20024 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20025 ASSERT_VK_SUCCESS(err);
20026
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020027 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020028 VkFramebuffer fb;
20029 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20030 ASSERT_VK_SUCCESS(err);
20031
20032 // Explicitly create a command buffer to bind the FB to so that we can then
20033 // destroy the command pool in order to implicitly free command buffer
20034 VkCommandPool command_pool;
20035 VkCommandPoolCreateInfo pool_create_info{};
20036 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20037 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20038 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20039 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20040
20041 VkCommandBuffer command_buffer;
20042 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20043 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20044 command_buffer_allocate_info.commandPool = command_pool;
20045 command_buffer_allocate_info.commandBufferCount = 1;
20046 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20047 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20048
20049 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020050 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 -060020051 VkCommandBufferBeginInfo begin_info{};
20052 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20053 vkBeginCommandBuffer(command_buffer, &begin_info);
20054
20055 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20056 vkCmdEndRenderPass(command_buffer);
20057 vkEndCommandBuffer(command_buffer);
20058 vkDestroyImageView(m_device->device(), view, nullptr);
20059 // Destroy command pool to implicitly free command buffer
20060 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20061 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20062 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20063 m_errorMonitor->VerifyNotFound();
20064}
20065
20066TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020067 TEST_DESCRIPTION(
20068 "Ensure that CmdBeginRenderPass applies the layout "
20069 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020070
20071 m_errorMonitor->ExpectSuccess();
20072
Tony Barbour1fa09702017-03-16 12:09:08 -060020073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020074
20075 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020076 VkAttachmentDescription attachment = {0,
20077 VK_FORMAT_R8G8B8A8_UNORM,
20078 VK_SAMPLE_COUNT_1_BIT,
20079 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20080 VK_ATTACHMENT_STORE_OP_STORE,
20081 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20082 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20083 VK_IMAGE_LAYOUT_UNDEFINED,
20084 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020085
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020086 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020087
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020088 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020089
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020090 VkSubpassDependency dep = {0,
20091 0,
20092 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20093 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20094 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20095 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20096 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020097
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020098 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020099
20100 VkResult err;
20101 VkRenderPass rp;
20102 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20103 ASSERT_VK_SUCCESS(err);
20104
20105 // A compatible framebuffer.
20106 VkImageObj image(m_device);
20107 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20108 ASSERT_TRUE(image.initialized());
20109
20110 VkImageViewCreateInfo ivci = {
20111 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20112 nullptr,
20113 0,
20114 image.handle(),
20115 VK_IMAGE_VIEW_TYPE_2D,
20116 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020117 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20118 VK_COMPONENT_SWIZZLE_IDENTITY},
20119 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020120 };
20121 VkImageView view;
20122 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20123 ASSERT_VK_SUCCESS(err);
20124
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020125 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020126 VkFramebuffer fb;
20127 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20128 ASSERT_VK_SUCCESS(err);
20129
20130 // Record a single command buffer which issues a pipeline barrier w/
20131 // image memory barrier for the attachment. This detects the previously
20132 // missing tracking of the subpass layout by throwing a validation error
20133 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020134 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 -070020135 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020136 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20137
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020138 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20139 nullptr,
20140 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20141 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20142 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20143 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20144 VK_QUEUE_FAMILY_IGNORED,
20145 VK_QUEUE_FAMILY_IGNORED,
20146 image.handle(),
20147 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020148 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020149 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20150 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020151
20152 vkCmdEndRenderPass(m_commandBuffer->handle());
20153 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020154 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020155
20156 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20157 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20158 vkDestroyImageView(m_device->device(), view, nullptr);
20159}
20160
20161TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020162 TEST_DESCRIPTION(
20163 "Validate that when an imageView of a depth/stencil image "
20164 "is used as a depth/stencil framebuffer attachment, the "
20165 "aspectMask is ignored and both depth and stencil image "
20166 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020167
Tony Barbour1fa09702017-03-16 12:09:08 -060020168 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020169 VkFormatProperties format_properties;
20170 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20171 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20172 return;
20173 }
20174
20175 m_errorMonitor->ExpectSuccess();
20176
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020177 VkAttachmentDescription attachment = {0,
20178 VK_FORMAT_D32_SFLOAT_S8_UINT,
20179 VK_SAMPLE_COUNT_1_BIT,
20180 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20181 VK_ATTACHMENT_STORE_OP_STORE,
20182 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20183 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20184 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20185 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020186
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020187 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020188
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020189 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020190
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020191 VkSubpassDependency dep = {0,
20192 0,
20193 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20194 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20195 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20196 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20197 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020198
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020199 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020200
20201 VkResult err;
20202 VkRenderPass rp;
20203 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20204 ASSERT_VK_SUCCESS(err);
20205
20206 VkImageObj image(m_device);
20207 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020208 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020209 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020210 ASSERT_TRUE(image.initialized());
20211 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20212
20213 VkImageViewCreateInfo ivci = {
20214 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20215 nullptr,
20216 0,
20217 image.handle(),
20218 VK_IMAGE_VIEW_TYPE_2D,
20219 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020220 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20221 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020222 };
20223 VkImageView view;
20224 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20225 ASSERT_VK_SUCCESS(err);
20226
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020227 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020228 VkFramebuffer fb;
20229 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20230 ASSERT_VK_SUCCESS(err);
20231
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020232 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 -070020233 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020234 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20235
20236 VkImageMemoryBarrier imb = {};
20237 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20238 imb.pNext = nullptr;
20239 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20240 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20241 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20242 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20243 imb.srcQueueFamilyIndex = 0;
20244 imb.dstQueueFamilyIndex = 0;
20245 imb.image = image.handle();
20246 imb.subresourceRange.aspectMask = 0x6;
20247 imb.subresourceRange.baseMipLevel = 0;
20248 imb.subresourceRange.levelCount = 0x1;
20249 imb.subresourceRange.baseArrayLayer = 0;
20250 imb.subresourceRange.layerCount = 0x1;
20251
20252 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020253 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20254 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020255
20256 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020257 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020258 QueueCommandBuffer(false);
20259 m_errorMonitor->VerifyNotFound();
20260
20261 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20262 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20263 vkDestroyImageView(m_device->device(), view, nullptr);
20264}
20265
20266TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020267 TEST_DESCRIPTION(
20268 "Ensure that layout transitions work correctly without "
20269 "errors, when an attachment reference is "
20270 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020271
20272 m_errorMonitor->ExpectSuccess();
20273
Tony Barbour1fa09702017-03-16 12:09:08 -060020274 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020275
20276 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020277 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020278
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020279 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020280
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020281 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020282
20283 VkRenderPass rp;
20284 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20285 ASSERT_VK_SUCCESS(err);
20286
20287 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020288 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020289 VkFramebuffer fb;
20290 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20291 ASSERT_VK_SUCCESS(err);
20292
20293 // Record a command buffer which just begins and ends the renderpass. The
20294 // bug manifests in BeginRenderPass.
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};
Tony Barbour552f6c02016-12-21 14:34:07 -070020296 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020297 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20298 vkCmdEndRenderPass(m_commandBuffer->handle());
20299 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020300 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020301
20302 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20303 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20304}
20305
20306// This is a positive test. No errors are expected.
20307TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020308 TEST_DESCRIPTION(
20309 "Create a stencil-only attachment with a LOAD_OP set to "
20310 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020311 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020312 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060020313 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070020314 if (!depth_format) {
20315 printf(" No Depth + Stencil format found. Skipped.\n");
20316 return;
20317 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020318 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020319 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020320 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20321 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020322 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20323 return;
20324 }
20325
Tony Barbourf887b162017-03-09 10:06:46 -070020326 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020327 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020328 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020329 VkAttachmentDescription att = {};
20330 VkAttachmentReference ref = {};
20331 att.format = depth_stencil_fmt;
20332 att.samples = VK_SAMPLE_COUNT_1_BIT;
20333 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20334 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20335 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20336 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20337 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20338 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20339
20340 VkClearValue clear;
20341 clear.depthStencil.depth = 1.0;
20342 clear.depthStencil.stencil = 0;
20343 ref.attachment = 0;
20344 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20345
20346 VkSubpassDescription subpass = {};
20347 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20348 subpass.flags = 0;
20349 subpass.inputAttachmentCount = 0;
20350 subpass.pInputAttachments = NULL;
20351 subpass.colorAttachmentCount = 0;
20352 subpass.pColorAttachments = NULL;
20353 subpass.pResolveAttachments = NULL;
20354 subpass.pDepthStencilAttachment = &ref;
20355 subpass.preserveAttachmentCount = 0;
20356 subpass.pPreserveAttachments = NULL;
20357
20358 VkRenderPass rp;
20359 VkRenderPassCreateInfo rp_info = {};
20360 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20361 rp_info.attachmentCount = 1;
20362 rp_info.pAttachments = &att;
20363 rp_info.subpassCount = 1;
20364 rp_info.pSubpasses = &subpass;
20365 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20366 ASSERT_VK_SUCCESS(result);
20367
20368 VkImageView *depthView = m_depthStencil->BindInfo();
20369 VkFramebufferCreateInfo fb_info = {};
20370 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20371 fb_info.pNext = NULL;
20372 fb_info.renderPass = rp;
20373 fb_info.attachmentCount = 1;
20374 fb_info.pAttachments = depthView;
20375 fb_info.width = 100;
20376 fb_info.height = 100;
20377 fb_info.layers = 1;
20378 VkFramebuffer fb;
20379 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20380 ASSERT_VK_SUCCESS(result);
20381
20382 VkRenderPassBeginInfo rpbinfo = {};
20383 rpbinfo.clearValueCount = 1;
20384 rpbinfo.pClearValues = &clear;
20385 rpbinfo.pNext = NULL;
20386 rpbinfo.renderPass = rp;
20387 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20388 rpbinfo.renderArea.extent.width = 100;
20389 rpbinfo.renderArea.extent.height = 100;
20390 rpbinfo.renderArea.offset.x = 0;
20391 rpbinfo.renderArea.offset.y = 0;
20392 rpbinfo.framebuffer = fb;
20393
20394 VkFence fence = {};
20395 VkFenceCreateInfo fence_ci = {};
20396 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20397 fence_ci.pNext = nullptr;
20398 fence_ci.flags = 0;
20399 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20400 ASSERT_VK_SUCCESS(result);
20401
20402 m_commandBuffer->BeginCommandBuffer();
20403 m_commandBuffer->BeginRenderPass(rpbinfo);
20404 m_commandBuffer->EndRenderPass();
20405 m_commandBuffer->EndCommandBuffer();
20406 m_commandBuffer->QueueCommandBuffer(fence);
20407
20408 VkImageObj destImage(m_device);
20409 destImage.init(100, 100, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020410 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020411 VkImageMemoryBarrier barrier = {};
20412 VkImageSubresourceRange range;
20413 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20414 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20415 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20416 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20417 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20418 barrier.image = m_depthStencil->handle();
20419 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20420 range.baseMipLevel = 0;
20421 range.levelCount = 1;
20422 range.baseArrayLayer = 0;
20423 range.layerCount = 1;
20424 barrier.subresourceRange = range;
20425 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20426 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20427 cmdbuf.BeginCommandBuffer();
20428 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 -070020429 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020430 barrier.srcAccessMask = 0;
20431 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20432 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20433 barrier.image = destImage.handle();
20434 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20435 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 -070020436 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020437 VkImageCopy cregion;
20438 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20439 cregion.srcSubresource.mipLevel = 0;
20440 cregion.srcSubresource.baseArrayLayer = 0;
20441 cregion.srcSubresource.layerCount = 1;
20442 cregion.srcOffset.x = 0;
20443 cregion.srcOffset.y = 0;
20444 cregion.srcOffset.z = 0;
20445 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20446 cregion.dstSubresource.mipLevel = 0;
20447 cregion.dstSubresource.baseArrayLayer = 0;
20448 cregion.dstSubresource.layerCount = 1;
20449 cregion.dstOffset.x = 0;
20450 cregion.dstOffset.y = 0;
20451 cregion.dstOffset.z = 0;
20452 cregion.extent.width = 100;
20453 cregion.extent.height = 100;
20454 cregion.extent.depth = 1;
20455 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020456 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020457 cmdbuf.EndCommandBuffer();
20458
20459 VkSubmitInfo submit_info;
20460 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20461 submit_info.pNext = NULL;
20462 submit_info.waitSemaphoreCount = 0;
20463 submit_info.pWaitSemaphores = NULL;
20464 submit_info.pWaitDstStageMask = NULL;
20465 submit_info.commandBufferCount = 1;
20466 submit_info.pCommandBuffers = &cmdbuf.handle();
20467 submit_info.signalSemaphoreCount = 0;
20468 submit_info.pSignalSemaphores = NULL;
20469
20470 m_errorMonitor->ExpectSuccess();
20471 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20472 m_errorMonitor->VerifyNotFound();
20473
20474 vkQueueWaitIdle(m_device->m_queue);
20475 vkDestroyFence(m_device->device(), fence, nullptr);
20476 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20477 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20478}
20479
20480// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020481TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20482 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20483
20484 m_errorMonitor->ExpectSuccess();
20485
Tony Barbour1fa09702017-03-16 12:09:08 -060020486 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060020487 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbour9357d542017-03-24 15:42:21 -060020488 if (!depth_format) {
20489 printf(" No Depth + Stencil format found. Skipped.\n");
20490 return;
20491 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20493
20494 VkImageMemoryBarrier img_barrier = {};
20495 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20496 img_barrier.pNext = NULL;
20497 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20498 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20499 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20500 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20501 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20502 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20503 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20504 img_barrier.subresourceRange.baseArrayLayer = 0;
20505 img_barrier.subresourceRange.baseMipLevel = 0;
20506 img_barrier.subresourceRange.layerCount = 1;
20507 img_barrier.subresourceRange.levelCount = 1;
20508
20509 {
20510 VkImageObj img_color(m_device);
20511 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20512 ASSERT_TRUE(img_color.initialized());
20513
20514 VkImageObj img_ds1(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020515 img_ds1.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020516 ASSERT_TRUE(img_ds1.initialized());
20517
20518 VkImageObj img_ds2(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020519 img_ds2.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020520 ASSERT_TRUE(img_ds2.initialized());
20521
20522 VkImageObj img_xfer_src(m_device);
20523 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20524 ASSERT_TRUE(img_xfer_src.initialized());
20525
20526 VkImageObj img_xfer_dst(m_device);
20527 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20528 ASSERT_TRUE(img_xfer_dst.initialized());
20529
20530 VkImageObj img_sampled(m_device);
20531 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20532 ASSERT_TRUE(img_sampled.initialized());
20533
20534 VkImageObj img_input(m_device);
20535 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20536 ASSERT_TRUE(img_input.initialized());
20537
20538 const struct {
20539 VkImageObj &image_obj;
20540 VkImageLayout old_layout;
20541 VkImageLayout new_layout;
20542 } buffer_layouts[] = {
20543 // clang-format off
20544 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20545 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20546 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20547 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20548 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20549 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20550 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20551 // clang-format on
20552 };
20553 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20554
20555 m_commandBuffer->BeginCommandBuffer();
20556 for (uint32_t i = 0; i < layout_count; ++i) {
20557 img_barrier.image = buffer_layouts[i].image_obj.handle();
20558 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20559 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20560 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20561 : VK_IMAGE_ASPECT_COLOR_BIT;
20562
20563 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20564 img_barrier.newLayout = buffer_layouts[i].new_layout;
20565 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20566 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20567
20568 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20569 img_barrier.newLayout = buffer_layouts[i].old_layout;
20570 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20571 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20572 }
20573 m_commandBuffer->EndCommandBuffer();
20574
20575 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20576 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20577 }
20578 m_errorMonitor->VerifyNotFound();
20579}
20580
20581// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020582TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20583 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20584
20585 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020586 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020587
20588 VkEvent event;
20589 VkEventCreateInfo event_create_info{};
20590 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20591 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20592
20593 VkCommandPool command_pool;
20594 VkCommandPoolCreateInfo pool_create_info{};
20595 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20596 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20597 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20598 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20599
20600 VkCommandBuffer command_buffer;
20601 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20602 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20603 command_buffer_allocate_info.commandPool = command_pool;
20604 command_buffer_allocate_info.commandBufferCount = 1;
20605 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20606 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20607
20608 VkQueue queue = VK_NULL_HANDLE;
20609 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20610
20611 {
20612 VkCommandBufferBeginInfo begin_info{};
20613 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20614 vkBeginCommandBuffer(command_buffer, &begin_info);
20615
20616 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 -070020617 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020618 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20619 vkEndCommandBuffer(command_buffer);
20620 }
20621 {
20622 VkSubmitInfo submit_info{};
20623 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20624 submit_info.commandBufferCount = 1;
20625 submit_info.pCommandBuffers = &command_buffer;
20626 submit_info.signalSemaphoreCount = 0;
20627 submit_info.pSignalSemaphores = nullptr;
20628 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20629 }
20630 { vkSetEvent(m_device->device(), event); }
20631
20632 vkQueueWaitIdle(queue);
20633
20634 vkDestroyEvent(m_device->device(), event, nullptr);
20635 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20636 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20637
20638 m_errorMonitor->VerifyNotFound();
20639}
20640// This is a positive test. No errors should be generated.
20641TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20642 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20643
Tony Barbour1fa09702017-03-16 12:09:08 -060020644 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020645 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020646
20647 m_errorMonitor->ExpectSuccess();
20648
20649 VkQueryPool query_pool;
20650 VkQueryPoolCreateInfo query_pool_create_info{};
20651 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20652 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20653 query_pool_create_info.queryCount = 1;
20654 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20655
20656 VkCommandPool command_pool;
20657 VkCommandPoolCreateInfo pool_create_info{};
20658 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20659 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20660 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20661 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20662
20663 VkCommandBuffer command_buffer;
20664 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20665 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20666 command_buffer_allocate_info.commandPool = command_pool;
20667 command_buffer_allocate_info.commandBufferCount = 1;
20668 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20669 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20670
20671 VkCommandBuffer secondary_command_buffer;
20672 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20673 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20674
20675 VkQueue queue = VK_NULL_HANDLE;
20676 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20677
20678 uint32_t qfi = 0;
20679 VkBufferCreateInfo buff_create_info = {};
20680 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20681 buff_create_info.size = 1024;
20682 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20683 buff_create_info.queueFamilyIndexCount = 1;
20684 buff_create_info.pQueueFamilyIndices = &qfi;
20685
20686 VkResult err;
20687 VkBuffer buffer;
20688 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20689 ASSERT_VK_SUCCESS(err);
20690 VkMemoryAllocateInfo mem_alloc = {};
20691 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20692 mem_alloc.pNext = NULL;
20693 mem_alloc.allocationSize = 1024;
20694 mem_alloc.memoryTypeIndex = 0;
20695
20696 VkMemoryRequirements memReqs;
20697 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20698 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20699 if (!pass) {
20700 vkDestroyBuffer(m_device->device(), buffer, NULL);
20701 return;
20702 }
20703
20704 VkDeviceMemory mem;
20705 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20706 ASSERT_VK_SUCCESS(err);
20707 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20708 ASSERT_VK_SUCCESS(err);
20709
20710 VkCommandBufferInheritanceInfo hinfo = {};
20711 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20712 hinfo.renderPass = VK_NULL_HANDLE;
20713 hinfo.subpass = 0;
20714 hinfo.framebuffer = VK_NULL_HANDLE;
20715 hinfo.occlusionQueryEnable = VK_FALSE;
20716 hinfo.queryFlags = 0;
20717 hinfo.pipelineStatistics = 0;
20718
20719 {
20720 VkCommandBufferBeginInfo begin_info{};
20721 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20722 begin_info.pInheritanceInfo = &hinfo;
20723 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20724
20725 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20726 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20727
20728 vkEndCommandBuffer(secondary_command_buffer);
20729
20730 begin_info.pInheritanceInfo = nullptr;
20731 vkBeginCommandBuffer(command_buffer, &begin_info);
20732
20733 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20734 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20735
20736 vkEndCommandBuffer(command_buffer);
20737 }
20738 {
20739 VkSubmitInfo submit_info{};
20740 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20741 submit_info.commandBufferCount = 1;
20742 submit_info.pCommandBuffers = &command_buffer;
20743 submit_info.signalSemaphoreCount = 0;
20744 submit_info.pSignalSemaphores = nullptr;
20745 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20746 }
20747
20748 vkQueueWaitIdle(queue);
20749
20750 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20751 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20752 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20753 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20754 vkDestroyBuffer(m_device->device(), buffer, NULL);
20755 vkFreeMemory(m_device->device(), mem, NULL);
20756
20757 m_errorMonitor->VerifyNotFound();
20758}
20759
20760// This is a positive test. No errors should be generated.
20761TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20762 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20763
Tony Barbour1fa09702017-03-16 12:09:08 -060020764 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020765 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020766
20767 m_errorMonitor->ExpectSuccess();
20768
20769 VkQueryPool query_pool;
20770 VkQueryPoolCreateInfo query_pool_create_info{};
20771 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20772 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20773 query_pool_create_info.queryCount = 1;
20774 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20775
20776 VkCommandPool command_pool;
20777 VkCommandPoolCreateInfo pool_create_info{};
20778 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20779 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20780 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20781 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20782
20783 VkCommandBuffer command_buffer[2];
20784 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20785 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20786 command_buffer_allocate_info.commandPool = command_pool;
20787 command_buffer_allocate_info.commandBufferCount = 2;
20788 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20789 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20790
20791 VkQueue queue = VK_NULL_HANDLE;
20792 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20793
20794 uint32_t qfi = 0;
20795 VkBufferCreateInfo buff_create_info = {};
20796 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20797 buff_create_info.size = 1024;
20798 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20799 buff_create_info.queueFamilyIndexCount = 1;
20800 buff_create_info.pQueueFamilyIndices = &qfi;
20801
20802 VkResult err;
20803 VkBuffer buffer;
20804 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20805 ASSERT_VK_SUCCESS(err);
20806 VkMemoryAllocateInfo mem_alloc = {};
20807 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20808 mem_alloc.pNext = NULL;
20809 mem_alloc.allocationSize = 1024;
20810 mem_alloc.memoryTypeIndex = 0;
20811
20812 VkMemoryRequirements memReqs;
20813 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20814 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20815 if (!pass) {
20816 vkDestroyBuffer(m_device->device(), buffer, NULL);
20817 return;
20818 }
20819
20820 VkDeviceMemory mem;
20821 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20822 ASSERT_VK_SUCCESS(err);
20823 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20824 ASSERT_VK_SUCCESS(err);
20825
20826 {
20827 VkCommandBufferBeginInfo begin_info{};
20828 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20829 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20830
20831 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20832 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20833
20834 vkEndCommandBuffer(command_buffer[0]);
20835
20836 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20837
20838 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20839
20840 vkEndCommandBuffer(command_buffer[1]);
20841 }
20842 {
20843 VkSubmitInfo submit_info{};
20844 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20845 submit_info.commandBufferCount = 2;
20846 submit_info.pCommandBuffers = command_buffer;
20847 submit_info.signalSemaphoreCount = 0;
20848 submit_info.pSignalSemaphores = nullptr;
20849 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20850 }
20851
20852 vkQueueWaitIdle(queue);
20853
20854 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20855 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20856 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20857 vkDestroyBuffer(m_device->device(), buffer, NULL);
20858 vkFreeMemory(m_device->device(), mem, NULL);
20859
20860 m_errorMonitor->VerifyNotFound();
20861}
20862
Tony Barbourc46924f2016-11-04 11:49:52 -060020863TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020864 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20865
Tony Barbour1fa09702017-03-16 12:09:08 -060020866 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020867 VkEvent event;
20868 VkEventCreateInfo event_create_info{};
20869 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20870 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20871
20872 VkCommandPool command_pool;
20873 VkCommandPoolCreateInfo pool_create_info{};
20874 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20875 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20876 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20877 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20878
20879 VkCommandBuffer command_buffer;
20880 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20881 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20882 command_buffer_allocate_info.commandPool = command_pool;
20883 command_buffer_allocate_info.commandBufferCount = 1;
20884 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20885 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20886
20887 VkQueue queue = VK_NULL_HANDLE;
20888 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20889
20890 {
20891 VkCommandBufferBeginInfo begin_info{};
20892 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20893 vkBeginCommandBuffer(command_buffer, &begin_info);
20894
20895 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020896 vkEndCommandBuffer(command_buffer);
20897 }
20898 {
20899 VkSubmitInfo submit_info{};
20900 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20901 submit_info.commandBufferCount = 1;
20902 submit_info.pCommandBuffers = &command_buffer;
20903 submit_info.signalSemaphoreCount = 0;
20904 submit_info.pSignalSemaphores = nullptr;
20905 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20906 }
20907 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20909 "that is already in use by a "
20910 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020911 vkSetEvent(m_device->device(), event);
20912 m_errorMonitor->VerifyFound();
20913 }
20914
20915 vkQueueWaitIdle(queue);
20916
20917 vkDestroyEvent(m_device->device(), event, nullptr);
20918 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20919 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20920}
20921
20922// This is a positive test. No errors should be generated.
20923TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020924 TEST_DESCRIPTION(
20925 "Two command buffers with two separate fences are each "
20926 "run through a Submit & WaitForFences cycle 3 times. This "
20927 "previously revealed a bug so running this positive test "
20928 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020929 m_errorMonitor->ExpectSuccess();
20930
Tony Barbour1fa09702017-03-16 12:09:08 -060020931 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020932 VkQueue queue = VK_NULL_HANDLE;
20933 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20934
20935 static const uint32_t NUM_OBJECTS = 2;
20936 static const uint32_t NUM_FRAMES = 3;
20937 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20938 VkFence fences[NUM_OBJECTS] = {};
20939
20940 VkCommandPool cmd_pool;
20941 VkCommandPoolCreateInfo cmd_pool_ci = {};
20942 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20943 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20944 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20945 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20946 ASSERT_VK_SUCCESS(err);
20947
20948 VkCommandBufferAllocateInfo cmd_buf_info = {};
20949 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20950 cmd_buf_info.commandPool = cmd_pool;
20951 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20952 cmd_buf_info.commandBufferCount = 1;
20953
20954 VkFenceCreateInfo fence_ci = {};
20955 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20956 fence_ci.pNext = nullptr;
20957 fence_ci.flags = 0;
20958
20959 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20960 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20961 ASSERT_VK_SUCCESS(err);
20962 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20963 ASSERT_VK_SUCCESS(err);
20964 }
20965
20966 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20967 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20968 // Create empty cmd buffer
20969 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20970 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20971
20972 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20973 ASSERT_VK_SUCCESS(err);
20974 err = vkEndCommandBuffer(cmd_buffers[obj]);
20975 ASSERT_VK_SUCCESS(err);
20976
20977 VkSubmitInfo submit_info = {};
20978 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20979 submit_info.commandBufferCount = 1;
20980 submit_info.pCommandBuffers = &cmd_buffers[obj];
20981 // Submit cmd buffer and wait for fence
20982 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20983 ASSERT_VK_SUCCESS(err);
20984 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20985 ASSERT_VK_SUCCESS(err);
20986 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20987 ASSERT_VK_SUCCESS(err);
20988 }
20989 }
20990 m_errorMonitor->VerifyNotFound();
20991 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20992 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20993 vkDestroyFence(m_device->device(), fences[i], nullptr);
20994 }
20995}
20996// This is a positive test. No errors should be generated.
20997TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020998 TEST_DESCRIPTION(
20999 "Two command buffers, each in a separate QueueSubmit call "
21000 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021001
Tony Barbour1fa09702017-03-16 12:09:08 -060021002 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021003 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021004
21005 m_errorMonitor->ExpectSuccess();
21006
21007 VkSemaphore semaphore;
21008 VkSemaphoreCreateInfo semaphore_create_info{};
21009 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21010 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21011
21012 VkCommandPool command_pool;
21013 VkCommandPoolCreateInfo pool_create_info{};
21014 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21015 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21016 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21017 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21018
21019 VkCommandBuffer command_buffer[2];
21020 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21021 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21022 command_buffer_allocate_info.commandPool = command_pool;
21023 command_buffer_allocate_info.commandBufferCount = 2;
21024 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21025 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21026
21027 VkQueue queue = VK_NULL_HANDLE;
21028 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21029
21030 {
21031 VkCommandBufferBeginInfo begin_info{};
21032 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21033 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21034
21035 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 -070021036 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021037
21038 VkViewport viewport{};
21039 viewport.maxDepth = 1.0f;
21040 viewport.minDepth = 0.0f;
21041 viewport.width = 512;
21042 viewport.height = 512;
21043 viewport.x = 0;
21044 viewport.y = 0;
21045 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21046 vkEndCommandBuffer(command_buffer[0]);
21047 }
21048 {
21049 VkCommandBufferBeginInfo begin_info{};
21050 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21051 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21052
21053 VkViewport viewport{};
21054 viewport.maxDepth = 1.0f;
21055 viewport.minDepth = 0.0f;
21056 viewport.width = 512;
21057 viewport.height = 512;
21058 viewport.x = 0;
21059 viewport.y = 0;
21060 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21061 vkEndCommandBuffer(command_buffer[1]);
21062 }
21063 {
21064 VkSubmitInfo submit_info{};
21065 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21066 submit_info.commandBufferCount = 1;
21067 submit_info.pCommandBuffers = &command_buffer[0];
21068 submit_info.signalSemaphoreCount = 1;
21069 submit_info.pSignalSemaphores = &semaphore;
21070 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21071 }
21072 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021073 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021074 VkSubmitInfo submit_info{};
21075 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21076 submit_info.commandBufferCount = 1;
21077 submit_info.pCommandBuffers = &command_buffer[1];
21078 submit_info.waitSemaphoreCount = 1;
21079 submit_info.pWaitSemaphores = &semaphore;
21080 submit_info.pWaitDstStageMask = flags;
21081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21082 }
21083
21084 vkQueueWaitIdle(m_device->m_queue);
21085
21086 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21087 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21088 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21089
21090 m_errorMonitor->VerifyNotFound();
21091}
21092
21093// This is a positive test. No errors should be generated.
21094TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021095 TEST_DESCRIPTION(
21096 "Two command buffers, each in a separate QueueSubmit call "
21097 "submitted on separate queues, the second having a fence"
21098 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021099
Tony Barbour1fa09702017-03-16 12:09:08 -060021100 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021101 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021102
21103 m_errorMonitor->ExpectSuccess();
21104
21105 VkFence fence;
21106 VkFenceCreateInfo fence_create_info{};
21107 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21108 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21109
21110 VkSemaphore semaphore;
21111 VkSemaphoreCreateInfo semaphore_create_info{};
21112 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21113 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21114
21115 VkCommandPool command_pool;
21116 VkCommandPoolCreateInfo pool_create_info{};
21117 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21118 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21119 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21120 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21121
21122 VkCommandBuffer command_buffer[2];
21123 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21124 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21125 command_buffer_allocate_info.commandPool = command_pool;
21126 command_buffer_allocate_info.commandBufferCount = 2;
21127 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21128 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21129
21130 VkQueue queue = VK_NULL_HANDLE;
21131 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21132
21133 {
21134 VkCommandBufferBeginInfo begin_info{};
21135 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21136 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21137
21138 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 -070021139 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021140
21141 VkViewport viewport{};
21142 viewport.maxDepth = 1.0f;
21143 viewport.minDepth = 0.0f;
21144 viewport.width = 512;
21145 viewport.height = 512;
21146 viewport.x = 0;
21147 viewport.y = 0;
21148 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21149 vkEndCommandBuffer(command_buffer[0]);
21150 }
21151 {
21152 VkCommandBufferBeginInfo begin_info{};
21153 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21154 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21155
21156 VkViewport viewport{};
21157 viewport.maxDepth = 1.0f;
21158 viewport.minDepth = 0.0f;
21159 viewport.width = 512;
21160 viewport.height = 512;
21161 viewport.x = 0;
21162 viewport.y = 0;
21163 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21164 vkEndCommandBuffer(command_buffer[1]);
21165 }
21166 {
21167 VkSubmitInfo submit_info{};
21168 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21169 submit_info.commandBufferCount = 1;
21170 submit_info.pCommandBuffers = &command_buffer[0];
21171 submit_info.signalSemaphoreCount = 1;
21172 submit_info.pSignalSemaphores = &semaphore;
21173 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21174 }
21175 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021176 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021177 VkSubmitInfo submit_info{};
21178 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21179 submit_info.commandBufferCount = 1;
21180 submit_info.pCommandBuffers = &command_buffer[1];
21181 submit_info.waitSemaphoreCount = 1;
21182 submit_info.pWaitSemaphores = &semaphore;
21183 submit_info.pWaitDstStageMask = flags;
21184 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21185 }
21186
21187 vkQueueWaitIdle(m_device->m_queue);
21188
21189 vkDestroyFence(m_device->device(), fence, nullptr);
21190 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21191 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21192 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21193
21194 m_errorMonitor->VerifyNotFound();
21195}
21196
21197// This is a positive test. No errors should be generated.
21198TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021199 TEST_DESCRIPTION(
21200 "Two command buffers, each in a separate QueueSubmit call "
21201 "submitted on separate queues, the second having a fence"
21202 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021203
Tony Barbour1fa09702017-03-16 12:09:08 -060021204 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021205 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021206
21207 m_errorMonitor->ExpectSuccess();
21208
21209 VkFence fence;
21210 VkFenceCreateInfo fence_create_info{};
21211 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21212 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21213
21214 VkSemaphore semaphore;
21215 VkSemaphoreCreateInfo semaphore_create_info{};
21216 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21217 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21218
21219 VkCommandPool command_pool;
21220 VkCommandPoolCreateInfo pool_create_info{};
21221 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21222 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21223 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21224 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21225
21226 VkCommandBuffer command_buffer[2];
21227 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21228 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21229 command_buffer_allocate_info.commandPool = command_pool;
21230 command_buffer_allocate_info.commandBufferCount = 2;
21231 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21232 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21233
21234 VkQueue queue = VK_NULL_HANDLE;
21235 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21236
21237 {
21238 VkCommandBufferBeginInfo begin_info{};
21239 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21240 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21241
21242 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 -070021243 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021244
21245 VkViewport viewport{};
21246 viewport.maxDepth = 1.0f;
21247 viewport.minDepth = 0.0f;
21248 viewport.width = 512;
21249 viewport.height = 512;
21250 viewport.x = 0;
21251 viewport.y = 0;
21252 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21253 vkEndCommandBuffer(command_buffer[0]);
21254 }
21255 {
21256 VkCommandBufferBeginInfo begin_info{};
21257 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21258 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21259
21260 VkViewport viewport{};
21261 viewport.maxDepth = 1.0f;
21262 viewport.minDepth = 0.0f;
21263 viewport.width = 512;
21264 viewport.height = 512;
21265 viewport.x = 0;
21266 viewport.y = 0;
21267 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21268 vkEndCommandBuffer(command_buffer[1]);
21269 }
21270 {
21271 VkSubmitInfo submit_info{};
21272 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21273 submit_info.commandBufferCount = 1;
21274 submit_info.pCommandBuffers = &command_buffer[0];
21275 submit_info.signalSemaphoreCount = 1;
21276 submit_info.pSignalSemaphores = &semaphore;
21277 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21278 }
21279 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021280 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021281 VkSubmitInfo submit_info{};
21282 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21283 submit_info.commandBufferCount = 1;
21284 submit_info.pCommandBuffers = &command_buffer[1];
21285 submit_info.waitSemaphoreCount = 1;
21286 submit_info.pWaitSemaphores = &semaphore;
21287 submit_info.pWaitDstStageMask = flags;
21288 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21289 }
21290
21291 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21292 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21293
21294 vkDestroyFence(m_device->device(), fence, nullptr);
21295 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21296 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21297 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21298
21299 m_errorMonitor->VerifyNotFound();
21300}
21301
21302TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021303 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021304 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021305 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021306 return;
21307 }
21308
21309 VkResult err;
21310
21311 m_errorMonitor->ExpectSuccess();
21312
21313 VkQueue q0 = m_device->m_queue;
21314 VkQueue q1 = nullptr;
21315 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21316 ASSERT_NE(q1, nullptr);
21317
21318 // An (empty) command buffer. We must have work in the first submission --
21319 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021320 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021321 VkCommandPool pool;
21322 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21323 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021324 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21325 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021326 VkCommandBuffer cb;
21327 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21328 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021329 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021330 err = vkBeginCommandBuffer(cb, &cbbi);
21331 ASSERT_VK_SUCCESS(err);
21332 err = vkEndCommandBuffer(cb);
21333 ASSERT_VK_SUCCESS(err);
21334
21335 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021336 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021337 VkSemaphore s;
21338 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21339 ASSERT_VK_SUCCESS(err);
21340
21341 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021342 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021343
21344 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21345 ASSERT_VK_SUCCESS(err);
21346
21347 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021348 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021349 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021350
21351 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21352 ASSERT_VK_SUCCESS(err);
21353
21354 // Wait for q0 idle
21355 err = vkQueueWaitIdle(q0);
21356 ASSERT_VK_SUCCESS(err);
21357
21358 // Command buffer should have been completed (it was on q0); reset the pool.
21359 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21360
21361 m_errorMonitor->VerifyNotFound();
21362
21363 // Force device completely idle and clean up resources
21364 vkDeviceWaitIdle(m_device->device());
21365 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21366 vkDestroySemaphore(m_device->device(), s, nullptr);
21367}
21368
21369// This is a positive test. No errors should be generated.
21370TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021371 TEST_DESCRIPTION(
21372 "Two command buffers, each in a separate QueueSubmit call "
21373 "submitted on separate queues, the second having a fence, "
21374 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021375
Tony Barbour1fa09702017-03-16 12:09:08 -060021376 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021377 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021378
21379 m_errorMonitor->ExpectSuccess();
21380
Tony Barbour1fa09702017-03-16 12:09:08 -060021381 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021382 VkFence fence;
21383 VkFenceCreateInfo fence_create_info{};
21384 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21385 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21386
21387 VkSemaphore semaphore;
21388 VkSemaphoreCreateInfo semaphore_create_info{};
21389 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21390 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21391
21392 VkCommandPool command_pool;
21393 VkCommandPoolCreateInfo pool_create_info{};
21394 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21395 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21396 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21397 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21398
21399 VkCommandBuffer command_buffer[2];
21400 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21401 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21402 command_buffer_allocate_info.commandPool = command_pool;
21403 command_buffer_allocate_info.commandBufferCount = 2;
21404 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21405 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21406
21407 VkQueue queue = VK_NULL_HANDLE;
21408 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21409
21410 {
21411 VkCommandBufferBeginInfo begin_info{};
21412 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21413 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21414
21415 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 -070021416 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021417
21418 VkViewport viewport{};
21419 viewport.maxDepth = 1.0f;
21420 viewport.minDepth = 0.0f;
21421 viewport.width = 512;
21422 viewport.height = 512;
21423 viewport.x = 0;
21424 viewport.y = 0;
21425 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21426 vkEndCommandBuffer(command_buffer[0]);
21427 }
21428 {
21429 VkCommandBufferBeginInfo begin_info{};
21430 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21431 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21432
21433 VkViewport viewport{};
21434 viewport.maxDepth = 1.0f;
21435 viewport.minDepth = 0.0f;
21436 viewport.width = 512;
21437 viewport.height = 512;
21438 viewport.x = 0;
21439 viewport.y = 0;
21440 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21441 vkEndCommandBuffer(command_buffer[1]);
21442 }
21443 {
21444 VkSubmitInfo submit_info{};
21445 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21446 submit_info.commandBufferCount = 1;
21447 submit_info.pCommandBuffers = &command_buffer[0];
21448 submit_info.signalSemaphoreCount = 1;
21449 submit_info.pSignalSemaphores = &semaphore;
21450 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21451 }
21452 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021453 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021454 VkSubmitInfo submit_info{};
21455 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21456 submit_info.commandBufferCount = 1;
21457 submit_info.pCommandBuffers = &command_buffer[1];
21458 submit_info.waitSemaphoreCount = 1;
21459 submit_info.pWaitSemaphores = &semaphore;
21460 submit_info.pWaitDstStageMask = flags;
21461 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21462 }
21463
21464 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21465
21466 vkDestroyFence(m_device->device(), fence, nullptr);
21467 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21468 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21469 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21470
21471 m_errorMonitor->VerifyNotFound();
21472}
21473
21474// This is a positive test. No errors should be generated.
21475TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021476 TEST_DESCRIPTION(
21477 "Two command buffers, each in a separate QueueSubmit call "
21478 "on the same queue, sharing a signal/wait semaphore, the "
21479 "second having a fence, "
21480 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021481
21482 m_errorMonitor->ExpectSuccess();
21483
Tony Barbour1fa09702017-03-16 12:09:08 -060021484 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021485 VkFence fence;
21486 VkFenceCreateInfo fence_create_info{};
21487 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21488 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21489
21490 VkSemaphore semaphore;
21491 VkSemaphoreCreateInfo semaphore_create_info{};
21492 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21493 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21494
21495 VkCommandPool command_pool;
21496 VkCommandPoolCreateInfo pool_create_info{};
21497 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21498 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21499 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21500 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21501
21502 VkCommandBuffer command_buffer[2];
21503 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21504 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21505 command_buffer_allocate_info.commandPool = command_pool;
21506 command_buffer_allocate_info.commandBufferCount = 2;
21507 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21508 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21509
21510 {
21511 VkCommandBufferBeginInfo begin_info{};
21512 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21513 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21514
21515 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 -070021516 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021517
21518 VkViewport viewport{};
21519 viewport.maxDepth = 1.0f;
21520 viewport.minDepth = 0.0f;
21521 viewport.width = 512;
21522 viewport.height = 512;
21523 viewport.x = 0;
21524 viewport.y = 0;
21525 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21526 vkEndCommandBuffer(command_buffer[0]);
21527 }
21528 {
21529 VkCommandBufferBeginInfo begin_info{};
21530 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21531 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21532
21533 VkViewport viewport{};
21534 viewport.maxDepth = 1.0f;
21535 viewport.minDepth = 0.0f;
21536 viewport.width = 512;
21537 viewport.height = 512;
21538 viewport.x = 0;
21539 viewport.y = 0;
21540 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21541 vkEndCommandBuffer(command_buffer[1]);
21542 }
21543 {
21544 VkSubmitInfo submit_info{};
21545 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21546 submit_info.commandBufferCount = 1;
21547 submit_info.pCommandBuffers = &command_buffer[0];
21548 submit_info.signalSemaphoreCount = 1;
21549 submit_info.pSignalSemaphores = &semaphore;
21550 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21551 }
21552 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021553 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021554 VkSubmitInfo submit_info{};
21555 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21556 submit_info.commandBufferCount = 1;
21557 submit_info.pCommandBuffers = &command_buffer[1];
21558 submit_info.waitSemaphoreCount = 1;
21559 submit_info.pWaitSemaphores = &semaphore;
21560 submit_info.pWaitDstStageMask = flags;
21561 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21562 }
21563
21564 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21565
21566 vkDestroyFence(m_device->device(), fence, nullptr);
21567 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21568 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21569 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21570
21571 m_errorMonitor->VerifyNotFound();
21572}
21573
21574// This is a positive test. No errors should be generated.
21575TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021576 TEST_DESCRIPTION(
21577 "Two command buffers, each in a separate QueueSubmit call "
21578 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21579 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021580
21581 m_errorMonitor->ExpectSuccess();
21582
Tony Barbour1fa09702017-03-16 12:09:08 -060021583 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021584 VkFence fence;
21585 VkFenceCreateInfo fence_create_info{};
21586 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21587 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21588
21589 VkCommandPool command_pool;
21590 VkCommandPoolCreateInfo pool_create_info{};
21591 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21592 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21593 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21594 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21595
21596 VkCommandBuffer command_buffer[2];
21597 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21598 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21599 command_buffer_allocate_info.commandPool = command_pool;
21600 command_buffer_allocate_info.commandBufferCount = 2;
21601 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21602 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21603
21604 {
21605 VkCommandBufferBeginInfo begin_info{};
21606 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21607 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21608
21609 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 -070021610 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021611
21612 VkViewport viewport{};
21613 viewport.maxDepth = 1.0f;
21614 viewport.minDepth = 0.0f;
21615 viewport.width = 512;
21616 viewport.height = 512;
21617 viewport.x = 0;
21618 viewport.y = 0;
21619 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21620 vkEndCommandBuffer(command_buffer[0]);
21621 }
21622 {
21623 VkCommandBufferBeginInfo begin_info{};
21624 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21625 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21626
21627 VkViewport viewport{};
21628 viewport.maxDepth = 1.0f;
21629 viewport.minDepth = 0.0f;
21630 viewport.width = 512;
21631 viewport.height = 512;
21632 viewport.x = 0;
21633 viewport.y = 0;
21634 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21635 vkEndCommandBuffer(command_buffer[1]);
21636 }
21637 {
21638 VkSubmitInfo submit_info{};
21639 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21640 submit_info.commandBufferCount = 1;
21641 submit_info.pCommandBuffers = &command_buffer[0];
21642 submit_info.signalSemaphoreCount = 0;
21643 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21644 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21645 }
21646 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021647 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021648 VkSubmitInfo submit_info{};
21649 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21650 submit_info.commandBufferCount = 1;
21651 submit_info.pCommandBuffers = &command_buffer[1];
21652 submit_info.waitSemaphoreCount = 0;
21653 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21654 submit_info.pWaitDstStageMask = flags;
21655 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21656 }
21657
21658 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21659
21660 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21661 ASSERT_VK_SUCCESS(err);
21662
21663 vkDestroyFence(m_device->device(), fence, nullptr);
21664 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21665 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21666
21667 m_errorMonitor->VerifyNotFound();
21668}
21669
21670// This is a positive test. No errors should be generated.
21671TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021672 TEST_DESCRIPTION(
21673 "Two command buffers, each in a separate QueueSubmit call "
21674 "on the same queue, the second having a fence, followed "
21675 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021676
21677 m_errorMonitor->ExpectSuccess();
21678
Tony Barbour1fa09702017-03-16 12:09:08 -060021679 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021680 VkFence fence;
21681 VkFenceCreateInfo fence_create_info{};
21682 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21683 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21684
21685 VkCommandPool command_pool;
21686 VkCommandPoolCreateInfo pool_create_info{};
21687 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21688 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21689 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21690 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21691
21692 VkCommandBuffer command_buffer[2];
21693 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21694 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21695 command_buffer_allocate_info.commandPool = command_pool;
21696 command_buffer_allocate_info.commandBufferCount = 2;
21697 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21698 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21699
21700 {
21701 VkCommandBufferBeginInfo begin_info{};
21702 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21703 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21704
21705 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 -070021706 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021707
21708 VkViewport viewport{};
21709 viewport.maxDepth = 1.0f;
21710 viewport.minDepth = 0.0f;
21711 viewport.width = 512;
21712 viewport.height = 512;
21713 viewport.x = 0;
21714 viewport.y = 0;
21715 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21716 vkEndCommandBuffer(command_buffer[0]);
21717 }
21718 {
21719 VkCommandBufferBeginInfo begin_info{};
21720 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21721 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21722
21723 VkViewport viewport{};
21724 viewport.maxDepth = 1.0f;
21725 viewport.minDepth = 0.0f;
21726 viewport.width = 512;
21727 viewport.height = 512;
21728 viewport.x = 0;
21729 viewport.y = 0;
21730 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21731 vkEndCommandBuffer(command_buffer[1]);
21732 }
21733 {
21734 VkSubmitInfo submit_info{};
21735 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21736 submit_info.commandBufferCount = 1;
21737 submit_info.pCommandBuffers = &command_buffer[0];
21738 submit_info.signalSemaphoreCount = 0;
21739 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21740 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21741 }
21742 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021743 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021744 VkSubmitInfo submit_info{};
21745 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21746 submit_info.commandBufferCount = 1;
21747 submit_info.pCommandBuffers = &command_buffer[1];
21748 submit_info.waitSemaphoreCount = 0;
21749 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21750 submit_info.pWaitDstStageMask = flags;
21751 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21752 }
21753
21754 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21755
21756 vkDestroyFence(m_device->device(), fence, nullptr);
21757 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21758 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21759
21760 m_errorMonitor->VerifyNotFound();
21761}
21762
21763// This is a positive test. No errors should be generated.
21764TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021765 TEST_DESCRIPTION(
21766 "Two command buffers each in a separate SubmitInfo sent in a single "
21767 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021768 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021769
21770 m_errorMonitor->ExpectSuccess();
21771
21772 VkFence fence;
21773 VkFenceCreateInfo fence_create_info{};
21774 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21775 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21776
21777 VkSemaphore semaphore;
21778 VkSemaphoreCreateInfo semaphore_create_info{};
21779 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21780 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21781
21782 VkCommandPool command_pool;
21783 VkCommandPoolCreateInfo pool_create_info{};
21784 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21785 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21786 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21787 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21788
21789 VkCommandBuffer command_buffer[2];
21790 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21791 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21792 command_buffer_allocate_info.commandPool = command_pool;
21793 command_buffer_allocate_info.commandBufferCount = 2;
21794 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21795 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21796
21797 {
21798 VkCommandBufferBeginInfo begin_info{};
21799 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21800 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21801
21802 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 -070021803 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021804
21805 VkViewport viewport{};
21806 viewport.maxDepth = 1.0f;
21807 viewport.minDepth = 0.0f;
21808 viewport.width = 512;
21809 viewport.height = 512;
21810 viewport.x = 0;
21811 viewport.y = 0;
21812 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21813 vkEndCommandBuffer(command_buffer[0]);
21814 }
21815 {
21816 VkCommandBufferBeginInfo begin_info{};
21817 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21818 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21819
21820 VkViewport viewport{};
21821 viewport.maxDepth = 1.0f;
21822 viewport.minDepth = 0.0f;
21823 viewport.width = 512;
21824 viewport.height = 512;
21825 viewport.x = 0;
21826 viewport.y = 0;
21827 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21828 vkEndCommandBuffer(command_buffer[1]);
21829 }
21830 {
21831 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021832 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021833
21834 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21835 submit_info[0].pNext = NULL;
21836 submit_info[0].commandBufferCount = 1;
21837 submit_info[0].pCommandBuffers = &command_buffer[0];
21838 submit_info[0].signalSemaphoreCount = 1;
21839 submit_info[0].pSignalSemaphores = &semaphore;
21840 submit_info[0].waitSemaphoreCount = 0;
21841 submit_info[0].pWaitSemaphores = NULL;
21842 submit_info[0].pWaitDstStageMask = 0;
21843
21844 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21845 submit_info[1].pNext = NULL;
21846 submit_info[1].commandBufferCount = 1;
21847 submit_info[1].pCommandBuffers = &command_buffer[1];
21848 submit_info[1].waitSemaphoreCount = 1;
21849 submit_info[1].pWaitSemaphores = &semaphore;
21850 submit_info[1].pWaitDstStageMask = flags;
21851 submit_info[1].signalSemaphoreCount = 0;
21852 submit_info[1].pSignalSemaphores = NULL;
21853 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21854 }
21855
21856 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21857
21858 vkDestroyFence(m_device->device(), fence, nullptr);
21859 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21860 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21861 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21862
21863 m_errorMonitor->VerifyNotFound();
21864}
21865
21866TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21867 m_errorMonitor->ExpectSuccess();
21868
Tony Barbour1fa09702017-03-16 12:09:08 -060021869 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21871
Tony Barbour552f6c02016-12-21 14:34:07 -070021872 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021873
21874 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21875 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21876 m_errorMonitor->VerifyNotFound();
21877 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21878 m_errorMonitor->VerifyNotFound();
21879 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21880 m_errorMonitor->VerifyNotFound();
21881
21882 m_commandBuffer->EndCommandBuffer();
21883 m_errorMonitor->VerifyNotFound();
21884}
21885
21886TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021887 TEST_DESCRIPTION(
21888 "Positive test where we create a renderpass with an "
21889 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21890 "has a valid layout, and a second subpass then uses a "
21891 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021892 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021893 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060021894 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021895 if (!depth_format) {
21896 printf(" No Depth + Stencil format found. Skipped.\n");
21897 return;
21898 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021899
21900 VkAttachmentReference attach[2] = {};
21901 attach[0].attachment = 0;
21902 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21903 attach[1].attachment = 0;
21904 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21905 VkSubpassDescription subpasses[2] = {};
21906 // First subpass clears DS attach on load
21907 subpasses[0].pDepthStencilAttachment = &attach[0];
21908 // 2nd subpass reads in DS as input attachment
21909 subpasses[1].inputAttachmentCount = 1;
21910 subpasses[1].pInputAttachments = &attach[1];
21911 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021912 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021913 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21914 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21915 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21916 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21917 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21918 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21919 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21920 VkRenderPassCreateInfo rpci = {};
21921 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21922 rpci.attachmentCount = 1;
21923 rpci.pAttachments = &attach_desc;
21924 rpci.subpassCount = 2;
21925 rpci.pSubpasses = subpasses;
21926
21927 // Now create RenderPass and verify no errors
21928 VkRenderPass rp;
21929 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21930 m_errorMonitor->VerifyNotFound();
21931
21932 vkDestroyRenderPass(m_device->device(), rp, NULL);
21933}
21934
Tobin Ehlis01103de2017-02-16 13:22:47 -070021935TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21936 TEST_DESCRIPTION(
21937 "Create a render pass with depth-stencil attachment where layout transition "
21938 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21939 "transition has correctly occurred at queue submit time with no validation errors.");
21940
Tony Barbour1fa09702017-03-16 12:09:08 -060021941 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton3c9fca72017-03-27 17:25:54 -060021942 auto depth_format = FindDepthStencilFormat(gpu());
Tony Barbourf887b162017-03-09 10:06:46 -070021943 if (!depth_format) {
21944 printf(" No Depth + Stencil format found. Skipped.\n");
21945 return;
21946 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021947 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021948 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021949 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21950 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021951 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021952 return;
21953 }
21954
21955 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21957
21958 // A renderpass with one depth/stencil attachment.
21959 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021960 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021961 VK_SAMPLE_COUNT_1_BIT,
21962 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21963 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21964 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21965 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21966 VK_IMAGE_LAYOUT_UNDEFINED,
21967 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21968
21969 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21970
21971 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21972
21973 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21974
21975 VkRenderPass rp;
21976 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21977 ASSERT_VK_SUCCESS(err);
21978 // A compatible ds image.
21979 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021980 image.init(32, 32, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis01103de2017-02-16 13:22:47 -070021981 ASSERT_TRUE(image.initialized());
21982
21983 VkImageViewCreateInfo ivci = {
21984 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21985 nullptr,
21986 0,
21987 image.handle(),
21988 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021989 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021990 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21991 VK_COMPONENT_SWIZZLE_IDENTITY},
21992 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21993 };
21994 VkImageView view;
21995 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21996 ASSERT_VK_SUCCESS(err);
21997
21998 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
21999 VkFramebuffer fb;
22000 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22001 ASSERT_VK_SUCCESS(err);
22002
22003 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22004 m_commandBuffer->BeginCommandBuffer();
22005 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22006 vkCmdEndRenderPass(m_commandBuffer->handle());
22007 m_commandBuffer->EndCommandBuffer();
22008 QueueCommandBuffer(false);
22009 m_errorMonitor->VerifyNotFound();
22010
22011 // Cleanup
22012 vkDestroyImageView(m_device->device(), view, NULL);
22013 vkDestroyRenderPass(m_device->device(), rp, NULL);
22014 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22015}
22016
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022017TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022018 TEST_DESCRIPTION(
22019 "Test that pipeline validation accepts matrices passed "
22020 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022021 m_errorMonitor->ExpectSuccess();
22022
Tony Barbour1fa09702017-03-16 12:09:08 -060022023 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22025
22026 VkVertexInputBindingDescription input_binding;
22027 memset(&input_binding, 0, sizeof(input_binding));
22028
22029 VkVertexInputAttributeDescription input_attribs[2];
22030 memset(input_attribs, 0, sizeof(input_attribs));
22031
22032 for (int i = 0; i < 2; i++) {
22033 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22034 input_attribs[i].location = i;
22035 }
22036
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022037 char const *vsSource =
22038 "#version 450\n"
22039 "\n"
22040 "layout(location=0) in mat2x4 x;\n"
22041 "out gl_PerVertex {\n"
22042 " vec4 gl_Position;\n"
22043 "};\n"
22044 "void main(){\n"
22045 " gl_Position = x[0] + x[1];\n"
22046 "}\n";
22047 char const *fsSource =
22048 "#version 450\n"
22049 "\n"
22050 "layout(location=0) out vec4 color;\n"
22051 "void main(){\n"
22052 " color = vec4(1);\n"
22053 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022054
22055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22057
22058 VkPipelineObj pipe(m_device);
22059 pipe.AddColorAttachment();
22060 pipe.AddShader(&vs);
22061 pipe.AddShader(&fs);
22062
22063 pipe.AddVertexInputBindings(&input_binding, 1);
22064 pipe.AddVertexInputAttribs(input_attribs, 2);
22065
22066 VkDescriptorSetObj descriptorSet(m_device);
22067 descriptorSet.AppendDummy();
22068 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22069
22070 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22071
22072 /* expect success */
22073 m_errorMonitor->VerifyNotFound();
22074}
22075
22076TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22077 m_errorMonitor->ExpectSuccess();
22078
Tony Barbour1fa09702017-03-16 12:09:08 -060022079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22081
22082 VkVertexInputBindingDescription input_binding;
22083 memset(&input_binding, 0, sizeof(input_binding));
22084
22085 VkVertexInputAttributeDescription input_attribs[2];
22086 memset(input_attribs, 0, sizeof(input_attribs));
22087
22088 for (int i = 0; i < 2; i++) {
22089 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22090 input_attribs[i].location = i;
22091 }
22092
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022093 char const *vsSource =
22094 "#version 450\n"
22095 "\n"
22096 "layout(location=0) in vec4 x[2];\n"
22097 "out gl_PerVertex {\n"
22098 " vec4 gl_Position;\n"
22099 "};\n"
22100 "void main(){\n"
22101 " gl_Position = x[0] + x[1];\n"
22102 "}\n";
22103 char const *fsSource =
22104 "#version 450\n"
22105 "\n"
22106 "layout(location=0) out vec4 color;\n"
22107 "void main(){\n"
22108 " color = vec4(1);\n"
22109 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022110
22111 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22112 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22113
22114 VkPipelineObj pipe(m_device);
22115 pipe.AddColorAttachment();
22116 pipe.AddShader(&vs);
22117 pipe.AddShader(&fs);
22118
22119 pipe.AddVertexInputBindings(&input_binding, 1);
22120 pipe.AddVertexInputAttribs(input_attribs, 2);
22121
22122 VkDescriptorSetObj descriptorSet(m_device);
22123 descriptorSet.AppendDummy();
22124 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22125
22126 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22127
22128 m_errorMonitor->VerifyNotFound();
22129}
22130
22131TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022132 TEST_DESCRIPTION(
22133 "Test that pipeline validation accepts consuming a vertex attribute "
22134 "through multiple vertex shader inputs, each consuming a different "
22135 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022136 m_errorMonitor->ExpectSuccess();
22137
Tony Barbour1fa09702017-03-16 12:09:08 -060022138 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022139 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22140
22141 VkVertexInputBindingDescription input_binding;
22142 memset(&input_binding, 0, sizeof(input_binding));
22143
22144 VkVertexInputAttributeDescription input_attribs[3];
22145 memset(input_attribs, 0, sizeof(input_attribs));
22146
22147 for (int i = 0; i < 3; i++) {
22148 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22149 input_attribs[i].location = i;
22150 }
22151
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022152 char const *vsSource =
22153 "#version 450\n"
22154 "\n"
22155 "layout(location=0) in vec4 x;\n"
22156 "layout(location=1) in vec3 y1;\n"
22157 "layout(location=1, component=3) in float y2;\n"
22158 "layout(location=2) in vec4 z;\n"
22159 "out gl_PerVertex {\n"
22160 " vec4 gl_Position;\n"
22161 "};\n"
22162 "void main(){\n"
22163 " gl_Position = x + vec4(y1, y2) + z;\n"
22164 "}\n";
22165 char const *fsSource =
22166 "#version 450\n"
22167 "\n"
22168 "layout(location=0) out vec4 color;\n"
22169 "void main(){\n"
22170 " color = vec4(1);\n"
22171 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022172
22173 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22174 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22175
22176 VkPipelineObj pipe(m_device);
22177 pipe.AddColorAttachment();
22178 pipe.AddShader(&vs);
22179 pipe.AddShader(&fs);
22180
22181 pipe.AddVertexInputBindings(&input_binding, 1);
22182 pipe.AddVertexInputAttribs(input_attribs, 3);
22183
22184 VkDescriptorSetObj descriptorSet(m_device);
22185 descriptorSet.AppendDummy();
22186 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22187
22188 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22189
22190 m_errorMonitor->VerifyNotFound();
22191}
22192
22193TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22194 m_errorMonitor->ExpectSuccess();
22195
Tony Barbour1fa09702017-03-16 12:09:08 -060022196 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022197 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22198
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022199 char const *vsSource =
22200 "#version 450\n"
22201 "out gl_PerVertex {\n"
22202 " vec4 gl_Position;\n"
22203 "};\n"
22204 "void main(){\n"
22205 " gl_Position = vec4(0);\n"
22206 "}\n";
22207 char const *fsSource =
22208 "#version 450\n"
22209 "\n"
22210 "layout(location=0) out vec4 color;\n"
22211 "void main(){\n"
22212 " color = vec4(1);\n"
22213 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022214
22215 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22216 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22217
22218 VkPipelineObj pipe(m_device);
22219 pipe.AddColorAttachment();
22220 pipe.AddShader(&vs);
22221 pipe.AddShader(&fs);
22222
22223 VkDescriptorSetObj descriptorSet(m_device);
22224 descriptorSet.AppendDummy();
22225 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22226
22227 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22228
22229 m_errorMonitor->VerifyNotFound();
22230}
22231
22232TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022233 TEST_DESCRIPTION(
22234 "Test that pipeline validation accepts the relaxed type matching rules "
22235 "set out in 14.1.3: fundamental type must match, and producer side must "
22236 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022237 m_errorMonitor->ExpectSuccess();
22238
22239 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22240
Tony Barbour1fa09702017-03-16 12:09:08 -060022241 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022242 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22243
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022244 char const *vsSource =
22245 "#version 450\n"
22246 "out gl_PerVertex {\n"
22247 " vec4 gl_Position;\n"
22248 "};\n"
22249 "layout(location=0) out vec3 x;\n"
22250 "layout(location=1) out ivec3 y;\n"
22251 "layout(location=2) out vec3 z;\n"
22252 "void main(){\n"
22253 " gl_Position = vec4(0);\n"
22254 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22255 "}\n";
22256 char const *fsSource =
22257 "#version 450\n"
22258 "\n"
22259 "layout(location=0) out vec4 color;\n"
22260 "layout(location=0) in float x;\n"
22261 "layout(location=1) flat in int y;\n"
22262 "layout(location=2) in vec2 z;\n"
22263 "void main(){\n"
22264 " color = vec4(1 + x + y + z.x);\n"
22265 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022266
22267 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22268 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22269
22270 VkPipelineObj pipe(m_device);
22271 pipe.AddColorAttachment();
22272 pipe.AddShader(&vs);
22273 pipe.AddShader(&fs);
22274
22275 VkDescriptorSetObj descriptorSet(m_device);
22276 descriptorSet.AppendDummy();
22277 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22278
22279 VkResult err = VK_SUCCESS;
22280 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22281 ASSERT_VK_SUCCESS(err);
22282
22283 m_errorMonitor->VerifyNotFound();
22284}
22285
22286TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022287 TEST_DESCRIPTION(
22288 "Test that pipeline validation accepts per-vertex variables "
22289 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022290 m_errorMonitor->ExpectSuccess();
22291
Tony Barbour1fa09702017-03-16 12:09:08 -060022292 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022293 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22294
22295 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022296 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022297 return;
22298 }
22299
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022300 char const *vsSource =
22301 "#version 450\n"
22302 "void main(){}\n";
22303 char const *tcsSource =
22304 "#version 450\n"
22305 "layout(location=0) out int x[];\n"
22306 "layout(vertices=3) out;\n"
22307 "void main(){\n"
22308 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22309 " gl_TessLevelInner[0] = 1;\n"
22310 " x[gl_InvocationID] = gl_InvocationID;\n"
22311 "}\n";
22312 char const *tesSource =
22313 "#version 450\n"
22314 "layout(triangles, equal_spacing, cw) in;\n"
22315 "layout(location=0) in int x[];\n"
22316 "out gl_PerVertex { vec4 gl_Position; };\n"
22317 "void main(){\n"
22318 " gl_Position.xyz = gl_TessCoord;\n"
22319 " gl_Position.w = x[0] + x[1] + x[2];\n"
22320 "}\n";
22321 char const *fsSource =
22322 "#version 450\n"
22323 "layout(location=0) out vec4 color;\n"
22324 "void main(){\n"
22325 " color = vec4(1);\n"
22326 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022327
22328 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22329 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22330 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22331 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22332
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022333 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22334 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022335
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022336 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022337
22338 VkPipelineObj pipe(m_device);
22339 pipe.SetInputAssembly(&iasci);
22340 pipe.SetTessellation(&tsci);
22341 pipe.AddColorAttachment();
22342 pipe.AddShader(&vs);
22343 pipe.AddShader(&tcs);
22344 pipe.AddShader(&tes);
22345 pipe.AddShader(&fs);
22346
22347 VkDescriptorSetObj descriptorSet(m_device);
22348 descriptorSet.AppendDummy();
22349 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22350
22351 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22352
22353 m_errorMonitor->VerifyNotFound();
22354}
22355
22356TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022357 TEST_DESCRIPTION(
22358 "Test that pipeline validation accepts a user-defined "
22359 "interface block passed into the geometry shader. This "
22360 "is interesting because the 'extra' array level is not "
22361 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022362 m_errorMonitor->ExpectSuccess();
22363
Tony Barbour1fa09702017-03-16 12:09:08 -060022364 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22366
22367 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022368 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022369 return;
22370 }
22371
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022372 char const *vsSource =
22373 "#version 450\n"
22374 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22375 "void main(){\n"
22376 " vs_out.x = vec4(1);\n"
22377 "}\n";
22378 char const *gsSource =
22379 "#version 450\n"
22380 "layout(triangles) in;\n"
22381 "layout(triangle_strip, max_vertices=3) out;\n"
22382 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22383 "out gl_PerVertex { vec4 gl_Position; };\n"
22384 "void main() {\n"
22385 " gl_Position = gs_in[0].x;\n"
22386 " EmitVertex();\n"
22387 "}\n";
22388 char const *fsSource =
22389 "#version 450\n"
22390 "layout(location=0) out vec4 color;\n"
22391 "void main(){\n"
22392 " color = vec4(1);\n"
22393 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022394
22395 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22396 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22397 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22398
22399 VkPipelineObj pipe(m_device);
22400 pipe.AddColorAttachment();
22401 pipe.AddShader(&vs);
22402 pipe.AddShader(&gs);
22403 pipe.AddShader(&fs);
22404
22405 VkDescriptorSetObj descriptorSet(m_device);
22406 descriptorSet.AppendDummy();
22407 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22408
22409 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22410
22411 m_errorMonitor->VerifyNotFound();
22412}
22413
22414TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022415 TEST_DESCRIPTION(
22416 "Test that pipeline validation accepts basic use of 64bit vertex "
22417 "attributes. This is interesting because they consume multiple "
22418 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022419 m_errorMonitor->ExpectSuccess();
22420
Tony Barbour1fa09702017-03-16 12:09:08 -060022421 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022422 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22423
22424 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022425 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022426 return;
22427 }
22428
22429 VkVertexInputBindingDescription input_bindings[1];
22430 memset(input_bindings, 0, sizeof(input_bindings));
22431
22432 VkVertexInputAttributeDescription input_attribs[4];
22433 memset(input_attribs, 0, sizeof(input_attribs));
22434 input_attribs[0].location = 0;
22435 input_attribs[0].offset = 0;
22436 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22437 input_attribs[1].location = 2;
22438 input_attribs[1].offset = 32;
22439 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22440 input_attribs[2].location = 4;
22441 input_attribs[2].offset = 64;
22442 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22443 input_attribs[3].location = 6;
22444 input_attribs[3].offset = 96;
22445 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22446
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022447 char const *vsSource =
22448 "#version 450\n"
22449 "\n"
22450 "layout(location=0) in dmat4 x;\n"
22451 "out gl_PerVertex {\n"
22452 " vec4 gl_Position;\n"
22453 "};\n"
22454 "void main(){\n"
22455 " gl_Position = vec4(x[0][0]);\n"
22456 "}\n";
22457 char const *fsSource =
22458 "#version 450\n"
22459 "\n"
22460 "layout(location=0) out vec4 color;\n"
22461 "void main(){\n"
22462 " color = vec4(1);\n"
22463 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022464
22465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22467
22468 VkPipelineObj pipe(m_device);
22469 pipe.AddColorAttachment();
22470 pipe.AddShader(&vs);
22471 pipe.AddShader(&fs);
22472
22473 pipe.AddVertexInputBindings(input_bindings, 1);
22474 pipe.AddVertexInputAttribs(input_attribs, 4);
22475
22476 VkDescriptorSetObj descriptorSet(m_device);
22477 descriptorSet.AppendDummy();
22478 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22479
22480 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22481
22482 m_errorMonitor->VerifyNotFound();
22483}
22484
22485TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22486 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22487 m_errorMonitor->ExpectSuccess();
22488
Tony Barbour1fa09702017-03-16 12:09:08 -060022489 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022490
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022491 char const *vsSource =
22492 "#version 450\n"
22493 "\n"
22494 "out gl_PerVertex {\n"
22495 " vec4 gl_Position;\n"
22496 "};\n"
22497 "void main(){\n"
22498 " gl_Position = vec4(1);\n"
22499 "}\n";
22500 char const *fsSource =
22501 "#version 450\n"
22502 "\n"
22503 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22504 "layout(location=0) out vec4 color;\n"
22505 "void main() {\n"
22506 " color = subpassLoad(x);\n"
22507 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022508
22509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22511
22512 VkPipelineObj pipe(m_device);
22513 pipe.AddShader(&vs);
22514 pipe.AddShader(&fs);
22515 pipe.AddColorAttachment();
22516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22517
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022518 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22519 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022520 VkDescriptorSetLayout dsl;
22521 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22522 ASSERT_VK_SUCCESS(err);
22523
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022524 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022525 VkPipelineLayout pl;
22526 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22527 ASSERT_VK_SUCCESS(err);
22528
22529 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022530 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22531 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22532 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22533 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22534 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 -060022535 };
22536 VkAttachmentReference color = {
22537 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22538 };
22539 VkAttachmentReference input = {
22540 1, VK_IMAGE_LAYOUT_GENERAL,
22541 };
22542
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022543 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022544
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022545 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022546 VkRenderPass rp;
22547 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22548 ASSERT_VK_SUCCESS(err);
22549
22550 // should be OK. would go wrong here if it's going to...
22551 pipe.CreateVKPipeline(pl, rp);
22552
22553 m_errorMonitor->VerifyNotFound();
22554
22555 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22556 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22557 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22558}
22559
22560TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022561 TEST_DESCRIPTION(
22562 "Test that pipeline validation accepts a compute pipeline which declares a "
22563 "descriptor-backed resource which is not provided, but the shader does not "
22564 "statically use it. This is interesting because it requires compute pipelines "
22565 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022566 m_errorMonitor->ExpectSuccess();
22567
Tony Barbour1fa09702017-03-16 12:09:08 -060022568 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022569
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022570 char const *csSource =
22571 "#version 450\n"
22572 "\n"
22573 "layout(local_size_x=1) in;\n"
22574 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22575 "void main(){\n"
22576 " // x is not used.\n"
22577 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022578
22579 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22580
22581 VkDescriptorSetObj descriptorSet(m_device);
22582 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22583
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022584 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22585 nullptr,
22586 0,
22587 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22588 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22589 descriptorSet.GetPipelineLayout(),
22590 VK_NULL_HANDLE,
22591 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022592
22593 VkPipeline pipe;
22594 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22595
22596 m_errorMonitor->VerifyNotFound();
22597
22598 if (err == VK_SUCCESS) {
22599 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22600 }
22601}
22602
22603TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022604 TEST_DESCRIPTION(
22605 "Test that pipeline validation accepts a shader consuming only the "
22606 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022607 m_errorMonitor->ExpectSuccess();
22608
Tony Barbour1fa09702017-03-16 12:09:08 -060022609 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022610
22611 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022612 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22613 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22614 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022615 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022616 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022617 VkDescriptorSetLayout dsl;
22618 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22619 ASSERT_VK_SUCCESS(err);
22620
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022621 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022622 VkPipelineLayout pl;
22623 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22624 ASSERT_VK_SUCCESS(err);
22625
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022626 char const *csSource =
22627 "#version 450\n"
22628 "\n"
22629 "layout(local_size_x=1) in;\n"
22630 "layout(set=0, binding=0) uniform sampler s;\n"
22631 "layout(set=0, binding=1) uniform texture2D t;\n"
22632 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22633 "void main() {\n"
22634 " x = texture(sampler2D(t, s), vec2(0));\n"
22635 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022636 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22637
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022638 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22639 nullptr,
22640 0,
22641 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22642 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22643 pl,
22644 VK_NULL_HANDLE,
22645 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022646
22647 VkPipeline pipe;
22648 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22649
22650 m_errorMonitor->VerifyNotFound();
22651
22652 if (err == VK_SUCCESS) {
22653 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22654 }
22655
22656 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22657 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22658}
22659
22660TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022661 TEST_DESCRIPTION(
22662 "Test that pipeline validation accepts a shader consuming only the "
22663 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022664 m_errorMonitor->ExpectSuccess();
22665
Tony Barbour1fa09702017-03-16 12:09:08 -060022666 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022667
22668 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022669 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22670 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22671 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022672 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022673 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022674 VkDescriptorSetLayout dsl;
22675 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22676 ASSERT_VK_SUCCESS(err);
22677
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022678 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022679 VkPipelineLayout pl;
22680 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22681 ASSERT_VK_SUCCESS(err);
22682
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022683 char const *csSource =
22684 "#version 450\n"
22685 "\n"
22686 "layout(local_size_x=1) in;\n"
22687 "layout(set=0, binding=0) uniform texture2D t;\n"
22688 "layout(set=0, binding=1) uniform sampler s;\n"
22689 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22690 "void main() {\n"
22691 " x = texture(sampler2D(t, s), vec2(0));\n"
22692 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022693 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22694
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022695 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22696 nullptr,
22697 0,
22698 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22699 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22700 pl,
22701 VK_NULL_HANDLE,
22702 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022703
22704 VkPipeline pipe;
22705 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22706
22707 m_errorMonitor->VerifyNotFound();
22708
22709 if (err == VK_SUCCESS) {
22710 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22711 }
22712
22713 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22714 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22715}
22716
22717TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022718 TEST_DESCRIPTION(
22719 "Test that pipeline validation accepts a shader consuming "
22720 "both the sampler and the image of a combined image+sampler "
22721 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022722 m_errorMonitor->ExpectSuccess();
22723
Tony Barbour1fa09702017-03-16 12:09:08 -060022724 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022725
22726 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022727 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22728 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022729 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022730 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022731 VkDescriptorSetLayout dsl;
22732 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22733 ASSERT_VK_SUCCESS(err);
22734
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022735 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022736 VkPipelineLayout pl;
22737 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22738 ASSERT_VK_SUCCESS(err);
22739
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022740 char const *csSource =
22741 "#version 450\n"
22742 "\n"
22743 "layout(local_size_x=1) in;\n"
22744 "layout(set=0, binding=0) uniform texture2D t;\n"
22745 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22746 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22747 "void main() {\n"
22748 " x = texture(sampler2D(t, s), vec2(0));\n"
22749 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022750 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22751
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022752 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22753 nullptr,
22754 0,
22755 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22756 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22757 pl,
22758 VK_NULL_HANDLE,
22759 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022760
22761 VkPipeline pipe;
22762 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22763
22764 m_errorMonitor->VerifyNotFound();
22765
22766 if (err == VK_SUCCESS) {
22767 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22768 }
22769
22770 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22771 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22772}
22773
Tony Barbour3ed87a02017-03-15 16:19:02 -060022774TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022775 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22776
Tony Barbour3ed87a02017-03-15 16:19:02 -060022777 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022778 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022779
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022780 // Ensure that extension is available and enabled.
22781 uint32_t extension_count = 0;
22782 bool supports_maintenance1_extension = false;
22783 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22784 ASSERT_VK_SUCCESS(err);
22785 if (extension_count > 0) {
22786 std::vector<VkExtensionProperties> available_extensions(extension_count);
22787
22788 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22789 ASSERT_VK_SUCCESS(err);
22790 for (const auto &extension_props : available_extensions) {
22791 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22792 supports_maintenance1_extension = true;
22793 }
22794 }
22795 }
22796
22797 // Proceed if extension is supported by hardware
22798 if (!supports_maintenance1_extension) {
22799 printf(" Maintenance1 Extension not supported, skipping tests\n");
22800 return;
22801 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022802
22803 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022804 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022805 VkCommandBuffer cmd_buf;
22806 VkCommandBufferAllocateInfo alloc_info;
22807 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22808 alloc_info.pNext = NULL;
22809 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022810 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022811 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22812 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22813
22814 VkCommandBufferBeginInfo cb_binfo;
22815 cb_binfo.pNext = NULL;
22816 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22817 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22818 cb_binfo.flags = 0;
22819 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22820 // Set Negative height, should give error if Maintenance 1 is not enabled
22821 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22822 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22823 vkEndCommandBuffer(cmd_buf);
22824
22825 m_errorMonitor->VerifyNotFound();
22826}
22827
Mark Lobodzinski35ecad32017-03-27 13:09:07 -060022828TEST_F(VkLayerTest, DuplicateValidPNextStructures) {
22829 TEST_DESCRIPTION("Create a pNext chain containing valid strutures, but with a duplicate structure type");
22830
22831 ASSERT_NO_FATAL_FAILURE(Init());
22832
22833 uint32_t extension_count = 0;
22834 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22835 ASSERT_VK_SUCCESS(err);
22836
22837 if (extension_count > 0) {
22838 std::vector<VkExtensionProperties> available_extensions(extension_count);
22839 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22840 ASSERT_VK_SUCCESS(err);
22841
22842 for (const auto &extension_props : available_extensions) {
22843 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22844 // Create two pNext structures which by themselves would be valid
22845 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22846 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info_2 = {};
22847 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22848 dedicated_buffer_create_info.pNext = &dedicated_buffer_create_info_2;
22849 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22850
22851 dedicated_buffer_create_info_2.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22852 dedicated_buffer_create_info_2.pNext = nullptr;
22853 dedicated_buffer_create_info_2.dedicatedAllocation = VK_TRUE;
22854
22855 uint32_t queue_family_index = 0;
22856 VkBufferCreateInfo buffer_create_info = {};
22857 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22858 buffer_create_info.pNext = &dedicated_buffer_create_info;
22859 buffer_create_info.size = 1024;
22860 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22861 buffer_create_info.queueFamilyIndexCount = 1;
22862 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22863
22864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "chain contains duplicate structure types");
22865 VkBuffer buffer;
22866 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
22867 m_errorMonitor->VerifyFound();
22868 }
22869 }
22870 }
22871}
22872
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022873TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22874 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22875
Tony Barbour1fa09702017-03-16 12:09:08 -060022876 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022877
22878 // Positive test to check parameter_validation and unique_objects support
22879 // for NV_dedicated_allocation
22880 uint32_t extension_count = 0;
22881 bool supports_nv_dedicated_allocation = false;
22882 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22883 ASSERT_VK_SUCCESS(err);
22884
22885 if (extension_count > 0) {
22886 std::vector<VkExtensionProperties> available_extensions(extension_count);
22887
22888 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22889 ASSERT_VK_SUCCESS(err);
22890
22891 for (const auto &extension_props : available_extensions) {
22892 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22893 supports_nv_dedicated_allocation = true;
22894 }
22895 }
22896 }
22897
22898 if (supports_nv_dedicated_allocation) {
22899 m_errorMonitor->ExpectSuccess();
22900
22901 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22902 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22903 dedicated_buffer_create_info.pNext = nullptr;
22904 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22905
22906 uint32_t queue_family_index = 0;
22907 VkBufferCreateInfo buffer_create_info = {};
22908 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22909 buffer_create_info.pNext = &dedicated_buffer_create_info;
22910 buffer_create_info.size = 1024;
22911 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22912 buffer_create_info.queueFamilyIndexCount = 1;
22913 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22914
22915 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022916 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022917 ASSERT_VK_SUCCESS(err);
22918
22919 VkMemoryRequirements memory_reqs;
22920 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22921
22922 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22923 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22924 dedicated_memory_info.pNext = nullptr;
22925 dedicated_memory_info.buffer = buffer;
22926 dedicated_memory_info.image = VK_NULL_HANDLE;
22927
22928 VkMemoryAllocateInfo memory_info = {};
22929 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22930 memory_info.pNext = &dedicated_memory_info;
22931 memory_info.allocationSize = memory_reqs.size;
22932
22933 bool pass;
22934 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22935 ASSERT_TRUE(pass);
22936
22937 VkDeviceMemory buffer_memory;
22938 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22939 ASSERT_VK_SUCCESS(err);
22940
22941 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22942 ASSERT_VK_SUCCESS(err);
22943
22944 vkDestroyBuffer(m_device->device(), buffer, NULL);
22945 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22946
22947 m_errorMonitor->VerifyNotFound();
22948 }
22949}
22950
22951TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22952 VkResult err;
22953
22954 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22955
Tony Barbour1fa09702017-03-16 12:09:08 -060022956 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22958
22959 std::vector<const char *> device_extension_names;
22960 auto features = m_device->phy().features();
22961 // Artificially disable support for non-solid fill modes
22962 features.fillModeNonSolid = false;
22963 // The sacrificial device object
22964 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22965
22966 VkRenderpassObj render_pass(&test_device);
22967
22968 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22969 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22970 pipeline_layout_ci.setLayoutCount = 0;
22971 pipeline_layout_ci.pSetLayouts = NULL;
22972
22973 VkPipelineLayout pipeline_layout;
22974 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22975 ASSERT_VK_SUCCESS(err);
22976
22977 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22978 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22979 rs_ci.pNext = nullptr;
22980 rs_ci.lineWidth = 1.0f;
22981 rs_ci.rasterizerDiscardEnable = true;
22982
22983 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22984 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22985
22986 // Set polygonMode=FILL. No error is expected
22987 m_errorMonitor->ExpectSuccess();
22988 {
22989 VkPipelineObj pipe(&test_device);
22990 pipe.AddShader(&vs);
22991 pipe.AddShader(&fs);
22992 pipe.AddColorAttachment();
22993 // Set polygonMode to a good value
22994 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22995 pipe.SetRasterization(&rs_ci);
22996 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22997 }
22998 m_errorMonitor->VerifyNotFound();
22999
23000 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
23001}
23002
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023003#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023004TEST_F(VkPositiveLayerTest, LongFenceChain)
23005{
23006 m_errorMonitor->ExpectSuccess();
23007
Tony Barbour1fa09702017-03-16 12:09:08 -060023008 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060023009 VkResult err;
23010
23011 std::vector<VkFence> fences;
23012
23013 const int chainLength = 32768;
23014
23015 for (int i = 0; i < chainLength; i++) {
23016 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
23017 VkFence fence;
23018 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
23019 ASSERT_VK_SUCCESS(err);
23020
23021 fences.push_back(fence);
23022
23023 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
23024 0, nullptr, 0, nullptr };
23025 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
23026 ASSERT_VK_SUCCESS(err);
23027
23028 }
23029
23030 // BOOM, stack overflow.
23031 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
23032
23033 for (auto fence : fences)
23034 vkDestroyFence(m_device->device(), fence, nullptr);
23035
23036 m_errorMonitor->VerifyNotFound();
23037}
23038#endif
23039
Cody Northrop1242dfd2016-07-13 17:24:59 -060023040#if defined(ANDROID) && defined(VALIDATION_APK)
23041static bool initialized = false;
23042static bool active = false;
23043
23044// Convert Intents to argv
23045// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023046std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023047 std::vector<std::string> args;
23048 JavaVM &vm = *app.activity->vm;
23049 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023050 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023051
23052 JNIEnv &env = *p_env;
23053 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023054 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023055 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023056 jmethodID get_string_extra_method =
23057 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023058 jvalue get_string_extra_args;
23059 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023060 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023061
23062 std::string args_str;
23063 if (extra_str) {
23064 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23065 args_str = extra_utf;
23066 env.ReleaseStringUTFChars(extra_str, extra_utf);
23067 env.DeleteLocalRef(extra_str);
23068 }
23069
23070 env.DeleteLocalRef(get_string_extra_args.l);
23071 env.DeleteLocalRef(intent);
23072 vm.DetachCurrentThread();
23073
23074 // split args_str
23075 std::stringstream ss(args_str);
23076 std::string arg;
23077 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023078 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023079 }
23080
23081 return args;
23082}
23083
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023084static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023085
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023086static void processCommand(struct android_app *app, int32_t cmd) {
23087 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023088 case APP_CMD_INIT_WINDOW: {
23089 if (app->window) {
23090 initialized = true;
23091 }
23092 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023093 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023094 case APP_CMD_GAINED_FOCUS: {
23095 active = true;
23096 break;
23097 }
23098 case APP_CMD_LOST_FOCUS: {
23099 active = false;
23100 break;
23101 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023102 }
23103}
23104
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023105void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023106 app_dummy();
23107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023108 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023109
23110 int vulkanSupport = InitVulkan();
23111 if (vulkanSupport == 0) {
23112 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23113 return;
23114 }
23115
23116 app->onAppCmd = processCommand;
23117 app->onInputEvent = processInput;
23118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023119 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023120 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023121 struct android_poll_source *source;
23122 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023123 if (source) {
23124 source->process(app, source);
23125 }
23126
23127 if (app->destroyRequested != 0) {
23128 VkTestFramework::Finish();
23129 return;
23130 }
23131 }
23132
23133 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023134 // Use the following key to send arguments to gtest, i.e.
23135 // --es args "--gtest_filter=-VkLayerTest.foo"
23136 const char key[] = "args";
23137 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023138
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023139 std::string filter = "";
23140 if (args.size() > 0) {
23141 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23142 filter += args[0];
23143 } else {
23144 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23145 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023146
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023147 int argc = 2;
23148 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23149 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023151 // Route output to files until we can override the gtest output
23152 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23153 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023155 ::testing::InitGoogleTest(&argc, argv);
23156 VkTestFramework::InitArgs(&argc, argv);
23157 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023158
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023159 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023160
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023161 if (result != 0) {
23162 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23163 } else {
23164 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23165 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023167 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023168
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023169 fclose(stdout);
23170 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023171
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023172 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023173 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023174 }
23175 }
23176}
23177#endif
23178
Tony Barbour300a6082015-04-07 13:44:53 -060023179int main(int argc, char **argv) {
23180 int result;
23181
Cody Northrop8e54a402016-03-08 22:25:52 -070023182#ifdef ANDROID
23183 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023184 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023185#endif
23186
Tony Barbour300a6082015-04-07 13:44:53 -060023187 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023188 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023189
23190 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23191
23192 result = RUN_ALL_TESTS();
23193
Tony Barbour6918cd52015-04-09 12:58:51 -060023194 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023195 return result;
23196}