blob: 54795bf4ac935cc83a893785cf4001bf5c7672e5 [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"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060038#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060039#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070040
41#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060042#include <limits.h>
43#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
49//--------------------------------------------------------------------------------------
50// Mesh and VertexFormat Data
51//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070052struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070053 float posX, posY, posZ, posW; // Position data
54 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055};
56
Karl Schultz6addd812016-02-02 17:17:23 -070057#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050058
59typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070060 BsoFailNone = 0x00000000,
61 BsoFailLineWidth = 0x00000001,
62 BsoFailDepthBias = 0x00000002,
63 BsoFailViewport = 0x00000004,
64 BsoFailScissor = 0x00000008,
65 BsoFailBlend = 0x00000010,
66 BsoFailDepthBounds = 0x00000020,
67 BsoFailStencilReadMask = 0x00000040,
68 BsoFailStencilWriteMask = 0x00000080,
69 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060070 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060071 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072} BsoFailSelect;
73
74struct vktriangle_vs_uniform {
75 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070076 float mvp[4][4];
77 float position[3][4];
78 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050079};
80
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070081static const char bindStateVertShaderText[] =
82 "#version 450\n"
83 "vec2 vertices[3];\n"
84 "out gl_PerVertex {\n"
85 " vec4 gl_Position;\n"
86 "};\n"
87 "void main() {\n"
88 " vertices[0] = vec2(-1.0, -1.0);\n"
89 " vertices[1] = vec2( 1.0, -1.0);\n"
90 " vertices[2] = vec2( 0.0, 1.0);\n"
91 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
92 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050093
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070094static const char bindStateFragShaderText[] =
95 "#version 450\n"
96 "\n"
97 "layout(location = 0) out vec4 uFragColor;\n"
98 "void main(){\n"
99 " uFragColor = vec4(0,1,0,1);\n"
100 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500101
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600102static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
103 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
104 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600105
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600106// ErrorMonitor Usage:
107//
Dave Houltonfbf52152017-01-06 12:55:29 -0700108// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600109// encountered log messages, or a validation error enum identifying
110// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
111// will match all log messages. logMsg will return true for skipCall
112// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600113//
Dave Houltonfbf52152017-01-06 12:55:29 -0700114// Call VerifyFound to determine if all desired failure messages
115// were encountered. Call VerifyNotFound to determine if any unexpected
116// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600117class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700118 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700119 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700120 test_platform_thread_create_mutex(&mutex_);
121 test_platform_thread_lock_mutex(&mutex_);
122 Reset();
123 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600124 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125
Dave Houltonfbf52152017-01-06 12:55:29 -0700126 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600127
Dave Houltonfbf52152017-01-06 12:55:29 -0700128 // Set monitor to pristine state
129 void Reset() {
130 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
131 bailout_ = NULL;
132 message_found_ = VK_FALSE;
133 failure_message_strings_.clear();
134 desired_message_strings_.clear();
135 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700136 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700137 other_messages_.clear();
138 message_outstanding_count_ = 0;
139 }
140
141 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700142 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700143 test_platform_thread_lock_mutex(&mutex_);
144 desired_message_strings_.insert(msgString);
145 message_flags_ |= msgFlags;
146 message_outstanding_count_++;
147 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600148 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700150 // ErrorMonitor will look for an error message containing the specified string(s)
151 template <typename Iter>
152 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
153 for (; iter != end; ++iter) {
154 SetDesiredFailureMsg(msgFlags, *iter);
155 }
156 }
157
Dave Houltonfbf52152017-01-06 12:55:29 -0700158 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700159 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700160 test_platform_thread_lock_mutex(&mutex_);
161 desired_message_ids_.insert(msg_id);
162 message_flags_ |= msgFlags;
163 message_outstanding_count_++;
164 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600165 }
166
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700167 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
168 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
169 // function and its definition.
170 void SetUnexpectedError(const char *const msg) {
171 test_platform_thread_lock_mutex(&mutex_);
172
173 ignore_message_strings_.emplace_back(msg);
174
175 test_platform_thread_unlock_mutex(&mutex_);
176 }
177
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700178 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600179 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700180 test_platform_thread_lock_mutex(&mutex_);
181 if (bailout_ != NULL) {
182 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600183 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600184 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600185 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600186
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700187 if (!IgnoreMessage(errorString)) {
188 for (auto desired_msg : desired_message_strings_) {
189 if (desired_msg.length() == 0) {
190 // An empty desired_msg string "" indicates a positive test - not expecting an error.
191 // Return true to avoid calling layers/driver with this error.
192 // And don't erase the "" string, so it remains if another error is found.
193 result = VK_TRUE;
194 found_expected = true;
195 message_found_ = VK_TRUE;
196 failure_message_strings_.insert(errorString);
197 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600198 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700199 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700200 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700201 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700202 result = VK_TRUE;
203 // We only want one match for each expected error so remove from set here
204 // Since we're about the break the loop it's ok to remove from set we're iterating over
205 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600206 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600207 }
208 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700209 for (auto desired_id : desired_message_ids_) {
210 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
211 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
212 // Return true to avoid calling layers/driver with this error.
213 result = VK_TRUE;
214 } else if (desired_id == message_code) {
215 // Double-check that the string matches the error enum
216 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
217 found_expected = true;
218 message_outstanding_count_--;
219 result = VK_TRUE;
220 message_found_ = VK_TRUE;
221 desired_message_ids_.erase(desired_id);
222 break;
223 } else {
224 // Treat this message as a regular unexpected error, but print a warning jic
225 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
226 errorString.c_str(), desired_id, validation_error_map[desired_id]);
227 }
228 }
229 }
230
231 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600232 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700233 other_messages_.push_back(errorString);
234 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600235 }
236
Dave Houltonfbf52152017-01-06 12:55:29 -0700237 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600238 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600239 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600240
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600241 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
242
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700243 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600244
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700245 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600246
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700247 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700248
249 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600250
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600251 void DumpFailureMsgs(void) const {
252 vector<string> otherMsgs = GetOtherFailureMsgs();
253 if (otherMsgs.size()) {
254 cout << "Other error messages logged for this test were:" << endl;
255 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
256 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600257 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600258 }
259 }
260
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600261 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200262
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600263 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700264 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600265 // Match ANY message matching specified type
266 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700267 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200268 }
269
270 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600271 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700272 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600273 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700274 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700275 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600276 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700277 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700278 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600279 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200280 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700281 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200282 }
283
284 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600285 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700286 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600287 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700289 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600290 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200291 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700292 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200293 }
294
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700295 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700296 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
297 // function and its definition.
298 bool IgnoreMessage(std::string const &msg) const {
299 if (ignore_message_strings_.empty()) {
300 return false;
301 }
302
303 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
304 return msg.find(str) != std::string::npos;
305 }) != ignore_message_strings_.end();
306 }
307
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700308 VkFlags message_flags_;
309 std::unordered_set<uint32_t> desired_message_ids_;
310 std::unordered_set<string> desired_message_strings_;
311 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700313 vector<string> other_messages_;
314 test_platform_thread_mutex mutex_;
315 bool *bailout_;
316 VkBool32 message_found_;
317 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600318};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500319
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600320static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
321 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
322 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600323 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
324 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600325 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600326 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600327 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600328}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500329
Karl Schultz6addd812016-02-02 17:17:23 -0700330class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700331 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600332 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
333 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700334 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600335 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
336 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700337 }
Tony Barbour300a6082015-04-07 13:44:53 -0600338
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600339 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
340 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700341 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600342 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700343 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600344 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700345 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600346 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
347 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
348 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700349 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
350 }
351 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
352 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
353 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600354 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
355 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
356 InitState(features, flags);
357 }
358
Karl Schultz6addd812016-02-02 17:17:23 -0700359
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");
Tony Barbour1fa09702017-03-16 12:09:08 -06001349 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001352 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001353 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1354
1355 // Mask out device features we don't want
1356 VkPhysicalDeviceFeatures desired_features = available_features;
1357 desired_features.sparseResidencyImage2D = VK_FALSE;
1358 desired_features.sparseResidencyImage3D = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001359 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001360
1361 VkImage image = VK_NULL_HANDLE;
1362 VkResult result = VK_RESULT_MAX_ENUM;
1363 VkImageCreateInfo image_create_info = {};
1364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1365 image_create_info.pNext = NULL;
1366 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1367 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1368 image_create_info.extent.width = 512;
1369 image_create_info.extent.height = 1;
1370 image_create_info.extent.depth = 1;
1371 image_create_info.mipLevels = 1;
1372 image_create_info.arrayLayers = 1;
1373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1381
1382 // 1D image w/ sparse residency is an error
1383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1384 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1385 m_errorMonitor->VerifyFound();
1386 if (VK_SUCCESS == result) {
1387 vkDestroyImage(m_device->device(), image, NULL);
1388 image = VK_NULL_HANDLE;
1389 }
1390
1391 // 2D image w/ sparse residency when feature isn't available
1392 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1393 image_create_info.extent.height = 64;
1394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1395 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1396 m_errorMonitor->VerifyFound();
1397 if (VK_SUCCESS == result) {
1398 vkDestroyImage(m_device->device(), image, NULL);
1399 image = VK_NULL_HANDLE;
1400 }
1401
1402 // 3D image w/ sparse residency when feature isn't available
1403 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1404 image_create_info.extent.depth = 8;
1405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1406 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1407 m_errorMonitor->VerifyFound();
1408 if (VK_SUCCESS == result) {
1409 vkDestroyImage(m_device->device(), image, NULL);
1410 image = VK_NULL_HANDLE;
1411 }
1412}
1413
1414TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1415 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
Tony Barbour1fa09702017-03-16 12:09:08 -06001416 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001417
1418 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001419 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001420 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1421
1422 // These tests all require that the device support sparse residency for 2D images
1423 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1424 return;
1425 }
1426
1427 // Mask out device features we don't want
1428 VkPhysicalDeviceFeatures desired_features = available_features;
1429 desired_features.sparseResidency2Samples = VK_FALSE;
1430 desired_features.sparseResidency4Samples = VK_FALSE;
1431 desired_features.sparseResidency8Samples = VK_FALSE;
1432 desired_features.sparseResidency16Samples = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001433 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001434
1435 VkImage image = VK_NULL_HANDLE;
1436 VkResult result = VK_RESULT_MAX_ENUM;
1437 VkImageCreateInfo image_create_info = {};
1438 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1439 image_create_info.pNext = NULL;
1440 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1441 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1442 image_create_info.extent.width = 64;
1443 image_create_info.extent.height = 64;
1444 image_create_info.extent.depth = 1;
1445 image_create_info.mipLevels = 1;
1446 image_create_info.arrayLayers = 1;
1447 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1448 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1449 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1450 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1451 image_create_info.queueFamilyIndexCount = 0;
1452 image_create_info.pQueueFamilyIndices = NULL;
1453 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1454 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1455
1456 // 2D image w/ sparse residency and linear tiling is an error
1457 m_errorMonitor->SetDesiredFailureMsg(
1458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1459 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1460 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1461 m_errorMonitor->VerifyFound();
1462 if (VK_SUCCESS == result) {
1463 vkDestroyImage(m_device->device(), image, NULL);
1464 image = VK_NULL_HANDLE;
1465 }
1466 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1467
1468 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1469 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495
1496 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1498 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1499 m_errorMonitor->VerifyFound();
1500 if (VK_SUCCESS == result) {
1501 vkDestroyImage(m_device->device(), image, NULL);
1502 image = VK_NULL_HANDLE;
1503 }
1504}
1505
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001507 TEST_DESCRIPTION(
1508 "Create a buffer and image, allocate memory, and bind the "
1509 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001510 VkResult err;
1511 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001513
Tobin Ehlis077ded32016-05-12 17:39:13 -06001514 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001515 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001516 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001517 VkDeviceMemory mem; // buffer will be bound first
1518 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001519 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001520 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001521
1522 VkBufferCreateInfo buf_info = {};
1523 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1524 buf_info.pNext = NULL;
1525 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1526 buf_info.size = 256;
1527 buf_info.queueFamilyIndexCount = 0;
1528 buf_info.pQueueFamilyIndices = NULL;
1529 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1530 buf_info.flags = 0;
1531 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1532 ASSERT_VK_SUCCESS(err);
1533
Tobin Ehlis077ded32016-05-12 17:39:13 -06001534 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
1536 VkImageCreateInfo image_create_info = {};
1537 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1538 image_create_info.pNext = NULL;
1539 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1540 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1541 image_create_info.extent.width = 64;
1542 image_create_info.extent.height = 64;
1543 image_create_info.extent.depth = 1;
1544 image_create_info.mipLevels = 1;
1545 image_create_info.arrayLayers = 1;
1546 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001547 // Image tiling must be optimal to trigger error when aliasing linear buffer
1548 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001549 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1550 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1551 image_create_info.queueFamilyIndexCount = 0;
1552 image_create_info.pQueueFamilyIndices = NULL;
1553 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1554 image_create_info.flags = 0;
1555
Tobin Ehlisf11be982016-05-11 13:52:53 -06001556 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1557 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001558 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1559 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001560
Tobin Ehlis077ded32016-05-12 17:39:13 -06001561 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1562
1563 VkMemoryAllocateInfo alloc_info = {};
1564 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1565 alloc_info.pNext = NULL;
1566 alloc_info.memoryTypeIndex = 0;
1567 // Ensure memory is big enough for both bindings
1568 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001569 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1570 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001572 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001573 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001574 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001575 return;
1576 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1578 ASSERT_VK_SUCCESS(err);
1579 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1580 ASSERT_VK_SUCCESS(err);
1581
Rene Lindsayd14f5572016-12-16 14:57:18 -07001582 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1583
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001585 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001586 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1587 m_errorMonitor->VerifyFound();
1588
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001589 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 // aliasing buffer2
1591 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1592 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1594 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001595 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001596 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001600 m_errorMonitor->VerifyFound();
1601
1602 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001603 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001604 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001606 vkFreeMemory(m_device->device(), mem, NULL);
1607 vkFreeMemory(m_device->device(), mem_img, NULL);
1608}
1609
Tobin Ehlis35372522016-05-12 08:32:31 -06001610TEST_F(VkLayerTest, InvalidMemoryMapping) {
1611 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1612 VkResult err;
1613 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001615
1616 VkBuffer buffer;
1617 VkDeviceMemory mem;
1618 VkMemoryRequirements mem_reqs;
1619
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001620 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1621
Tobin Ehlis35372522016-05-12 08:32:31 -06001622 VkBufferCreateInfo buf_info = {};
1623 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1624 buf_info.pNext = NULL;
1625 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1626 buf_info.size = 256;
1627 buf_info.queueFamilyIndexCount = 0;
1628 buf_info.pQueueFamilyIndices = NULL;
1629 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1630 buf_info.flags = 0;
1631 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1632 ASSERT_VK_SUCCESS(err);
1633
1634 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1635 VkMemoryAllocateInfo alloc_info = {};
1636 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1637 alloc_info.pNext = NULL;
1638 alloc_info.memoryTypeIndex = 0;
1639
1640 // Ensure memory is big enough for both bindings
1641 static const VkDeviceSize allocation_size = 0x10000;
1642 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001643 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 -06001644 if (!pass) {
1645 vkDestroyBuffer(m_device->device(), buffer, NULL);
1646 return;
1647 }
1648 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 uint8_t *pData;
1652 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001653 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 -06001654 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1655 m_errorMonitor->VerifyFound();
1656 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001658 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1660 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1661 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001662 m_errorMonitor->VerifyFound();
1663
1664 // Unmap the memory to avoid re-map error
1665 vkUnmapMemory(m_device->device(), mem);
1666 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1668 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1669 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001670 m_errorMonitor->VerifyFound();
1671 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1673 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 m_errorMonitor->VerifyFound();
1675 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001677 vkUnmapMemory(m_device->device(), mem);
1678 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001679
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 ASSERT_VK_SUCCESS(err);
1683 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001684 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001686 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001688 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1689 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001690
Tobin Ehlis35372522016-05-12 08:32:31 -06001691 // Now flush range that oversteps mapped range
1692 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001693 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001694 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001696 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1698 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1699 m_errorMonitor->VerifyFound();
1700
1701 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1702 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001704 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001705 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001706 mmr.size = VK_WHOLE_SIZE;
1707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001708 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1709 m_errorMonitor->VerifyFound();
1710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001711#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001712 // Some platforms have an atomsize of 1 which makes the test meaningless
1713 if (atom_size > 3) {
1714 // Now with an offset NOT a multiple of the device limit
1715 vkUnmapMemory(m_device->device(), mem);
1716 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1717 ASSERT_VK_SUCCESS(err);
1718 mmr.offset = 3; // Not a multiple of atom_size
1719 mmr.size = VK_WHOLE_SIZE;
1720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1721 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1722 m_errorMonitor->VerifyFound();
1723
1724 // Now with a size NOT a multiple of the device limit
1725 vkUnmapMemory(m_device->device(), mem);
1726 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1727 ASSERT_VK_SUCCESS(err);
1728 mmr.offset = atom_size;
1729 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1731 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1732 m_errorMonitor->VerifyFound();
1733 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001734#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001735 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1736 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001737 if (!pass) {
1738 vkFreeMemory(m_device->device(), mem, NULL);
1739 vkDestroyBuffer(m_device->device(), buffer, NULL);
1740 return;
1741 }
1742 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1743 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1744
1745 vkDestroyBuffer(m_device->device(), buffer, NULL);
1746 vkFreeMemory(m_device->device(), mem, NULL);
1747}
1748
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001749#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001750TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1751 VkResult err;
1752 bool pass;
1753
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001754 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1755 // following declaration (which is temporarily being moved below):
1756 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001757 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001758 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001759 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001762 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001763
Tony Barbour1fa09702017-03-16 12:09:08 -06001764 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001765
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1767#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1768 // Use the functions from the VK_KHR_android_surface extension without
1769 // enabling that extension:
1770
1771 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001772 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1774 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001775 pass = (err != VK_SUCCESS);
1776 ASSERT_TRUE(pass);
1777 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001778#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001779
Ian Elliott3f06ce52016-04-29 14:46:21 -06001780#if defined(VK_USE_PLATFORM_MIR_KHR)
1781 // Use the functions from the VK_KHR_mir_surface extension without enabling
1782 // that extension:
1783
1784 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001785 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1788 pass = (err != VK_SUCCESS);
1789 ASSERT_TRUE(pass);
1790 m_errorMonitor->VerifyFound();
1791
1792 // Tell whether an mir_connection supports presentation:
1793 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1795 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001797#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798
Ian Elliott3f06ce52016-04-29 14:46:21 -06001799#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1800 // Use the functions from the VK_KHR_wayland_surface extension without
1801 // enabling that extension:
1802
1803 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001804 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1806 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001807 pass = (err != VK_SUCCESS);
1808 ASSERT_TRUE(pass);
1809 m_errorMonitor->VerifyFound();
1810
1811 // Tell whether an wayland_display supports presentation:
1812 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1814 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001816#endif // VK_USE_PLATFORM_WAYLAND_KHR
1817#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818
Ian Elliott3f06ce52016-04-29 14:46:21 -06001819#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001820 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1821 // TO NON-LINUX PLATFORMS:
1822 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 // Use the functions from the VK_KHR_win32_surface extension without
1824 // enabling that extension:
1825
1826 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001827 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1829 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001830 pass = (err != VK_SUCCESS);
1831 ASSERT_TRUE(pass);
1832 m_errorMonitor->VerifyFound();
1833
1834 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001836 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001838// Set this (for now, until all platforms are supported and tested):
1839#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001840#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001841#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001845#endif
1846#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001847 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1848 // that extension:
1849
1850 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001851 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001853 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1854 pass = (err != VK_SUCCESS);
1855 ASSERT_TRUE(pass);
1856 m_errorMonitor->VerifyFound();
1857
1858 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001860 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1862 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001864// Set this (for now, until all platforms are supported and tested):
1865#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001866#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001867
Ian Elliott12630812016-04-29 14:35:43 -06001868#if defined(VK_USE_PLATFORM_XLIB_KHR)
1869 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an Xlib VisualID supports presentation:
1881 Display *dpy = NULL;
1882 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001884 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001889
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890// Use the functions from the VK_KHR_surface extension without enabling
1891// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001892
Ian Elliott489eec02016-05-05 14:12:44 -06001893#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001894 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001896 vkDestroySurfaceKHR(instance(), surface, NULL);
1897 m_errorMonitor->VerifyFound();
1898
1899 // Check if surface supports presentation:
1900 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1903 pass = (err != VK_SUCCESS);
1904 ASSERT_TRUE(pass);
1905 m_errorMonitor->VerifyFound();
1906
1907 // Check surface capabilities:
1908 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface formats:
1916 uint32_t format_count = 0;
1917 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
1923
1924 // Check surface present modes:
1925 uint32_t present_mode_count = 0;
1926 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1928 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001929 pass = (err != VK_SUCCESS);
1930 ASSERT_TRUE(pass);
1931 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001932#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001933
Ian Elliott1c32c772016-04-28 14:47:13 -06001934 // Use the functions from the VK_KHR_swapchain extension without enabling
1935 // that extension:
1936
1937 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001939 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1940 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001941 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1948 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 pass = (err != VK_SUCCESS);
1950 ASSERT_TRUE(pass);
1951 m_errorMonitor->VerifyFound();
1952
Chris Forbeseb7d5502016-09-13 18:19:21 +12001953 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1954 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1955 VkFence fence;
1956 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001960 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 pass = (err != VK_SUCCESS);
1962 ASSERT_TRUE(pass);
1963 m_errorMonitor->VerifyFound();
1964
Chris Forbeseb7d5502016-09-13 18:19:21 +12001965 vkDestroyFence(m_device->device(), fence, nullptr);
1966
Ian Elliott1c32c772016-04-28 14:47:13 -06001967 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001968 //
1969 // NOTE: Currently can't test this because a real swapchain is needed (as
1970 // opposed to the fake one we created) in order for the layer to lookup the
1971 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001972
1973 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001975 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1976 m_errorMonitor->VerifyFound();
1977}
Chris Forbes09368e42016-10-13 11:59:22 +13001978#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001979
Karl Schultz6addd812016-02-02 17:17:23 -07001980TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1981 VkResult err;
1982 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1985 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001986
Tony Barbour1fa09702017-03-16 12:09:08 -06001987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
1989 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001990 VkImage image;
1991 VkDeviceMemory mem;
1992 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001993
Karl Schultz6addd812016-02-02 17:17:23 -07001994 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1995 const int32_t tex_width = 32;
1996 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001997
Tony Barboureb254902015-07-15 12:50:33 -06001998 VkImageCreateInfo image_create_info = {};
1999 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.pNext = NULL;
2001 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2002 image_create_info.format = tex_format;
2003 image_create_info.extent.width = tex_width;
2004 image_create_info.extent.height = tex_height;
2005 image_create_info.extent.depth = 1;
2006 image_create_info.mipLevels = 1;
2007 image_create_info.arrayLayers = 1;
2008 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2009 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2010 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2011 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002012 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002018
Chia-I Wuf7458c52015-10-26 21:10:41 +08002019 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002020 ASSERT_VK_SUCCESS(err);
2021
Karl Schultz6addd812016-02-02 17:17:23 -07002022 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002023
Mark Lobodzinski23065352015-05-29 09:32:35 -05002024 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002026 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 -07002027 if (!pass) { // If we can't find any unmappable memory this test doesn't
2028 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002029 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002030 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002031 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002032
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002033 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002034 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035 ASSERT_VK_SUCCESS(err);
2036
2037 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002038 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039 ASSERT_VK_SUCCESS(err);
2040
2041 // Map memory as if to initialize the image
2042 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002043 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002045 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002046
Chia-I Wuf7458c52015-10-26 21:10:41 +08002047 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002048 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049}
2050
Karl Schultz6addd812016-02-02 17:17:23 -07002051TEST_F(VkLayerTest, RebindMemory) {
2052 VkResult err;
2053 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002054
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002056
Tony Barbour1fa09702017-03-16 12:09:08 -06002057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002058
2059 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002060 VkImage image;
2061 VkDeviceMemory mem1;
2062 VkDeviceMemory mem2;
2063 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002064
Karl Schultz6addd812016-02-02 17:17:23 -07002065 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2066 const int32_t tex_width = 32;
2067 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002068
Tony Barboureb254902015-07-15 12:50:33 -06002069 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002070 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2071 image_create_info.pNext = NULL;
2072 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2073 image_create_info.format = tex_format;
2074 image_create_info.extent.width = tex_width;
2075 image_create_info.extent.height = tex_height;
2076 image_create_info.extent.depth = 1;
2077 image_create_info.mipLevels = 1;
2078 image_create_info.arrayLayers = 1;
2079 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2080 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2081 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2082 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002084 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002085 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2086 mem_alloc.pNext = NULL;
2087 mem_alloc.allocationSize = 0;
2088 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002089
Karl Schultz6addd812016-02-02 17:17:23 -07002090 // Introduce failure, do NOT set memProps to
2091 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002092 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002093 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002094 ASSERT_VK_SUCCESS(err);
2095
Karl Schultz6addd812016-02-02 17:17:23 -07002096 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097
2098 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002099 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002100 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101
2102 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002103 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002104 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002105 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106 ASSERT_VK_SUCCESS(err);
2107
2108 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002109 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce validation failure, try to bind a different memory object to
2113 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002114 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002115
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002116 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002117
Chia-I Wuf7458c52015-10-26 21:10:41 +08002118 vkDestroyImage(m_device->device(), image, NULL);
2119 vkFreeMemory(m_device->device(), mem1, NULL);
2120 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002121}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002122
Karl Schultz6addd812016-02-02 17:17:23 -07002123TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002124 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002125
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2127 "submitted in SIGNALED state. Fences "
2128 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002129
2130 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002131 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2132 fenceInfo.pNext = NULL;
2133 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002134
Tony Barbour1fa09702017-03-16 12:09:08 -06002135 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002136 ASSERT_NO_FATAL_FAILURE(InitViewport());
2137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2138
Tony Barbour552f6c02016-12-21 14:34:07 -07002139 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002140 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002141 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002142
2143 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002144
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002146 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2147 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002148 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002149 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002150 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002151 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002153 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002154 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002155
2156 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002157 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002159 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002160}
Chris Forbes4e44c912016-06-16 10:20:00 +12002161
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002163 TEST_DESCRIPTION(
2164 "Specify wrong usage for image then create conflicting view of image "
2165 "Initialize buffer with wrong usage then perform copy expecting errors "
2166 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002168
Tony Barbour1fa09702017-03-16 12:09:08 -06002169 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002170
Tony Barbourf887b162017-03-09 10:06:46 -07002171 auto format = find_depth_stencil_format(m_device);
2172 if (!format) {
2173 printf(" No Depth + Stencil format found. Skipped.\n");
2174 return;
2175 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002176
Tony Barbourf92621a2016-05-02 14:28:12 -06002177 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002178 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002179 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002180 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002181
Tony Barbourf92621a2016-05-02 14:28:12 -06002182 VkImageView dsv;
2183 VkImageViewCreateInfo dsvci = {};
2184 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2185 dsvci.image = image.handle();
2186 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002187 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002188 dsvci.subresourceRange.layerCount = 1;
2189 dsvci.subresourceRange.baseMipLevel = 0;
2190 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002191 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002192
Tony Barbourf92621a2016-05-02 14:28:12 -06002193 // Create a view with depth / stencil aspect for image with different usage
2194 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002195
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002196 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002197
2198 // Initialize buffer with TRANSFER_DST usage
2199 vk_testing::Buffer buffer;
2200 VkMemoryPropertyFlags reqs = 0;
2201 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2202 VkBufferImageCopy region = {};
2203 region.bufferRowLength = 128;
2204 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002205 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002206 region.imageSubresource.layerCount = 1;
2207 region.imageExtent.height = 16;
2208 region.imageExtent.width = 16;
2209 region.imageExtent.depth = 1;
2210
Mark Lobodzinski80871462017-02-16 10:37:27 -07002211 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002212 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002213
Chris Forbesda581202016-10-06 18:25:26 +13002214 // two separate errors from this call:
2215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2217
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002218 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2219 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002220 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002221}
Tony Barbour75d79f02016-08-30 09:39:07 -06002222
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223TEST_F(VkLayerTest, LeakAnObject) {
2224 VkResult err;
2225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227
2228 // Note that we have to create a new device since destroying the
2229 // framework's device causes Teardown() to fail and just calling Teardown
2230 // will destroy the errorMonitor.
2231
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002233
Tony Barbour1fa09702017-03-16 12:09:08 -06002234 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002235
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002236 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002237 std::vector<VkDeviceQueueCreateInfo> queue_info;
2238 queue_info.reserve(queue_props.size());
2239 std::vector<std::vector<float>> queue_priorities;
2240 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2241 VkDeviceQueueCreateInfo qi = {};
2242 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2243 qi.pNext = NULL;
2244 qi.queueFamilyIndex = i;
2245 qi.queueCount = queue_props[i].queueCount;
2246 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2247 qi.pQueuePriorities = queue_priorities[i].data();
2248 queue_info.push_back(qi);
2249 }
2250
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002251 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252
2253 // The sacrificial device object
2254 VkDevice testDevice;
2255 VkDeviceCreateInfo device_create_info = {};
2256 auto features = m_device->phy().features();
2257 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2258 device_create_info.pNext = NULL;
2259 device_create_info.queueCreateInfoCount = queue_info.size();
2260 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002261 device_create_info.enabledLayerCount = 0;
2262 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002263 device_create_info.pEnabledFeatures = &features;
2264 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2265 ASSERT_VK_SUCCESS(err);
2266
2267 VkFence fence;
2268 VkFenceCreateInfo fence_create_info = {};
2269 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2270 fence_create_info.pNext = NULL;
2271 fence_create_info.flags = 0;
2272 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2273 ASSERT_VK_SUCCESS(err);
2274
2275 // Induce failure by not calling vkDestroyFence
2276 vkDestroyDevice(testDevice, NULL);
2277 m_errorMonitor->VerifyFound();
2278}
2279
2280TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002281 TEST_DESCRIPTION(
2282 "Allocate command buffers from one command pool and "
2283 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002286
Tony Barbour1fa09702017-03-16 12:09:08 -06002287 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002288 VkCommandPool command_pool_one;
2289 VkCommandPool command_pool_two;
2290
2291 VkCommandPoolCreateInfo pool_create_info{};
2292 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2293 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2294 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2295
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002296 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002298 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002300 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002302 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002304 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002306 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002308 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309
2310 m_errorMonitor->VerifyFound();
2311
2312 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2313 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2314}
2315
2316TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2317 VkResult err;
2318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002319 TEST_DESCRIPTION(
2320 "Allocate descriptor sets from one DS pool and "
2321 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
Tony Barbour1fa09702017-03-16 12:09:08 -06002325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2327
2328 VkDescriptorPoolSize ds_type_count = {};
2329 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2330 ds_type_count.descriptorCount = 1;
2331
2332 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2333 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2334 ds_pool_ci.pNext = NULL;
2335 ds_pool_ci.flags = 0;
2336 ds_pool_ci.maxSets = 1;
2337 ds_pool_ci.poolSizeCount = 1;
2338 ds_pool_ci.pPoolSizes = &ds_type_count;
2339
2340 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002341 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002342 ASSERT_VK_SUCCESS(err);
2343
2344 // Create a second descriptor pool
2345 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002346 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_VK_SUCCESS(err);
2348
2349 VkDescriptorSetLayoutBinding dsl_binding = {};
2350 dsl_binding.binding = 0;
2351 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2352 dsl_binding.descriptorCount = 1;
2353 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2354 dsl_binding.pImmutableSamplers = NULL;
2355
2356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2358 ds_layout_ci.pNext = NULL;
2359 ds_layout_ci.bindingCount = 1;
2360 ds_layout_ci.pBindings = &dsl_binding;
2361
2362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002364 ASSERT_VK_SUCCESS(err);
2365
2366 VkDescriptorSet descriptorSet;
2367 VkDescriptorSetAllocateInfo alloc_info = {};
2368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2369 alloc_info.descriptorSetCount = 1;
2370 alloc_info.descriptorPool = ds_pool_one;
2371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002373 ASSERT_VK_SUCCESS(err);
2374
2375 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2376
2377 m_errorMonitor->VerifyFound();
2378
2379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2380 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2381 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2382}
2383
2384TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002386
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388
Tony Barbour1fa09702017-03-16 12:09:08 -06002389 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002390
2391 // Pass bogus handle into GetImageMemoryRequirements
2392 VkMemoryRequirements mem_reqs;
2393 uint64_t fakeImageHandle = 0xCADECADE;
2394 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2395
2396 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2397
2398 m_errorMonitor->VerifyFound();
2399}
2400
Mike Schuchardt17838902017-02-21 09:48:06 -07002401TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2402 TEST_DESCRIPTION(
2403 "Try to destroy a render pass object using a device other than the one it was created on. "
2404 "This should generate a distinct error from the invalid handle error.");
2405 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002406 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2408
2409 // Create second device
2410 float priorities[] = {1.0f};
2411 VkDeviceQueueCreateInfo queue_info{};
2412 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2413 queue_info.pNext = NULL;
2414 queue_info.flags = 0;
2415 queue_info.queueFamilyIndex = 0;
2416 queue_info.queueCount = 1;
2417 queue_info.pQueuePriorities = &priorities[0];
2418
2419 VkDeviceCreateInfo device_create_info = {};
2420 auto features = m_device->phy().features();
2421 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2422 device_create_info.pNext = NULL;
2423 device_create_info.queueCreateInfoCount = 1;
2424 device_create_info.pQueueCreateInfos = &queue_info;
2425 device_create_info.enabledLayerCount = 0;
2426 device_create_info.ppEnabledLayerNames = NULL;
2427 device_create_info.pEnabledFeatures = &features;
2428
2429 VkDevice second_device;
2430 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2431
2432 // Try to destroy the renderpass from the first device using the second device
2433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2434 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2435 m_errorMonitor->VerifyFound();
2436
2437 vkDestroyDevice(second_device, NULL);
2438}
2439
Karl Schultz6addd812016-02-02 17:17:23 -07002440TEST_F(VkLayerTest, PipelineNotBound) {
2441 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002442
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002443 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002444
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002446
Tony Barbour1fa09702017-03-16 12:09:08 -06002447 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002449
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002450 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002451 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2452 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453
2454 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002455 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2456 ds_pool_ci.pNext = NULL;
2457 ds_pool_ci.maxSets = 1;
2458 ds_pool_ci.poolSizeCount = 1;
2459 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002460
2461 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002462 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_VK_SUCCESS(err);
2464
2465 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 dsl_binding.binding = 0;
2467 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2468 dsl_binding.descriptorCount = 1;
2469 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2470 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002471
2472 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002473 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2474 ds_layout_ci.pNext = NULL;
2475 ds_layout_ci.bindingCount = 1;
2476 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002477
2478 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002479 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002480 ASSERT_VK_SUCCESS(err);
2481
2482 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002483 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002484 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002485 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002486 alloc_info.descriptorPool = ds_pool;
2487 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002492 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2493 pipeline_layout_ci.pNext = NULL;
2494 pipeline_layout_ci.setLayoutCount = 1;
2495 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002496
2497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499 ASSERT_VK_SUCCESS(err);
2500
Mark Youngad779052016-01-06 14:26:04 -07002501 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002502
Tony Barbour552f6c02016-12-21 14:34:07 -07002503 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002506 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002507
Chia-I Wuf7458c52015-10-26 21:10:41 +08002508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002511}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002512
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002513TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2514 VkResult err;
2515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002516 TEST_DESCRIPTION(
2517 "Test validation check for an invalid memory type index "
2518 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002519
Tony Barbour1fa09702017-03-16 12:09:08 -06002520 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002521
2522 // Create an image, allocate memory, set a bad typeIndex and then try to
2523 // bind it
2524 VkImage image;
2525 VkDeviceMemory mem;
2526 VkMemoryRequirements mem_reqs;
2527 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2528 const int32_t tex_width = 32;
2529 const int32_t tex_height = 32;
2530
2531 VkImageCreateInfo image_create_info = {};
2532 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2533 image_create_info.pNext = NULL;
2534 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2535 image_create_info.format = tex_format;
2536 image_create_info.extent.width = tex_width;
2537 image_create_info.extent.height = tex_height;
2538 image_create_info.extent.depth = 1;
2539 image_create_info.mipLevels = 1;
2540 image_create_info.arrayLayers = 1;
2541 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2542 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2543 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2544 image_create_info.flags = 0;
2545
2546 VkMemoryAllocateInfo mem_alloc = {};
2547 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2548 mem_alloc.pNext = NULL;
2549 mem_alloc.allocationSize = 0;
2550 mem_alloc.memoryTypeIndex = 0;
2551
2552 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2553 ASSERT_VK_SUCCESS(err);
2554
2555 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2556 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002557
2558 // Introduce Failure, select invalid TypeIndex
2559 VkPhysicalDeviceMemoryProperties memory_info;
2560
2561 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2562 unsigned int i;
2563 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2564 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2565 mem_alloc.memoryTypeIndex = i;
2566 break;
2567 }
2568 }
2569 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002570 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002571 vkDestroyImage(m_device->device(), image, NULL);
2572 return;
2573 }
2574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002575 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 -06002576
2577 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2578 ASSERT_VK_SUCCESS(err);
2579
2580 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2581 (void)err;
2582
2583 m_errorMonitor->VerifyFound();
2584
2585 vkDestroyImage(m_device->device(), image, NULL);
2586 vkFreeMemory(m_device->device(), mem, NULL);
2587}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002588
Karl Schultz6addd812016-02-02 17:17:23 -07002589TEST_F(VkLayerTest, BindInvalidMemory) {
2590 VkResult err;
2591 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002592
Tony Barbour1fa09702017-03-16 12:09:08 -06002593 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002594
Cortf801b982017-01-17 18:10:21 -08002595 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002596 const int32_t tex_width = 256;
2597 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002598
2599 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002600 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2601 image_create_info.pNext = NULL;
2602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2603 image_create_info.format = tex_format;
2604 image_create_info.extent.width = tex_width;
2605 image_create_info.extent.height = tex_height;
2606 image_create_info.extent.depth = 1;
2607 image_create_info.mipLevels = 1;
2608 image_create_info.arrayLayers = 1;
2609 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002610 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002611 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2612 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Cortf801b982017-01-17 18:10:21 -08002614 VkBufferCreateInfo buffer_create_info = {};
2615 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2616 buffer_create_info.pNext = NULL;
2617 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002618 buffer_create_info.size = 4 * 1024 * 1024;
2619 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002620 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002621
Cortf801b982017-01-17 18:10:21 -08002622 // Create an image/buffer, allocate memory, free it, and then try to bind it
2623 {
2624 VkImage image = VK_NULL_HANDLE;
2625 VkBuffer buffer = VK_NULL_HANDLE;
2626 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2627 ASSERT_VK_SUCCESS(err);
2628 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2629 ASSERT_VK_SUCCESS(err);
2630 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2631 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2632 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2635 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2636 image_mem_alloc.allocationSize = image_mem_reqs.size;
2637 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2638 ASSERT_TRUE(pass);
2639 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2640 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2641 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2642 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002643
Cortf801b982017-01-17 18:10:21 -08002644 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2645 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2646 ASSERT_VK_SUCCESS(err);
2647 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2648 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002649
Cortf801b982017-01-17 18:10:21 -08002650 vkFreeMemory(device(), image_mem, NULL);
2651 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2654 err = vkBindImageMemory(device(), image, image_mem, 0);
2655 (void)err; // This may very well return an error.
2656 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002657
Cortf801b982017-01-17 18:10:21 -08002658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2659 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2660 (void)err; // This may very well return an error.
2661 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002662
Cortf801b982017-01-17 18:10:21 -08002663 vkDestroyImage(m_device->device(), image, NULL);
2664 vkDestroyBuffer(m_device->device(), buffer, NULL);
2665 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002666
2667 // Try to bind memory to an object that already has a memory binding
2668 {
2669 VkImage image = VK_NULL_HANDLE;
2670 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2671 ASSERT_VK_SUCCESS(err);
2672 VkBuffer buffer = VK_NULL_HANDLE;
2673 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2674 ASSERT_VK_SUCCESS(err);
2675 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2676 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2677 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2678 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2679 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2680 image_alloc_info.allocationSize = image_mem_reqs.size;
2681 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2682 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2683 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2684 ASSERT_TRUE(pass);
2685 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2686 ASSERT_TRUE(pass);
2687 VkDeviceMemory image_mem, buffer_mem;
2688 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2689 ASSERT_VK_SUCCESS(err);
2690 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2691 ASSERT_VK_SUCCESS(err);
2692
2693 err = vkBindImageMemory(device(), image, image_mem, 0);
2694 ASSERT_VK_SUCCESS(err);
2695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2696 err = vkBindImageMemory(device(), image, image_mem, 0);
2697 (void)err; // This may very well return an error.
2698 m_errorMonitor->VerifyFound();
2699
2700 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2701 ASSERT_VK_SUCCESS(err);
2702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2703 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2704 (void)err; // This may very well return an error.
2705 m_errorMonitor->VerifyFound();
2706
2707 vkFreeMemory(device(), image_mem, NULL);
2708 vkFreeMemory(device(), buffer_mem, NULL);
2709 vkDestroyImage(device(), image, NULL);
2710 vkDestroyBuffer(device(), buffer, NULL);
2711 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002712
Cort Strattonde748202017-02-17 12:50:01 -08002713 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002714 {
2715 VkImage image = VK_NULL_HANDLE;
2716 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2717 ASSERT_VK_SUCCESS(err);
2718 VkBuffer buffer = VK_NULL_HANDLE;
2719 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2720 ASSERT_VK_SUCCESS(err);
2721 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2722 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2723 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2724 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2725 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002726 // Leave some extra space for alignment wiggle room
2727 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002728 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002729 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002730 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2731 ASSERT_TRUE(pass);
2732 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2733 ASSERT_TRUE(pass);
2734 VkDeviceMemory image_mem, buffer_mem;
2735 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2736 ASSERT_VK_SUCCESS(err);
2737 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2738 ASSERT_VK_SUCCESS(err);
2739
Cort Strattonde748202017-02-17 12:50:01 -08002740 // Test unaligned memory offset
2741 {
2742 if (image_mem_reqs.alignment > 1) {
2743 VkDeviceSize image_offset = 1;
2744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2745 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2746 (void)err; // This may very well return an error.
2747 m_errorMonitor->VerifyFound();
2748 }
Cort6c7dff72017-01-27 18:34:50 -08002749
Cort Strattonde748202017-02-17 12:50:01 -08002750 if (buffer_mem_reqs.alignment > 1) {
2751 VkDeviceSize buffer_offset = 1;
2752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2753 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2754 (void)err; // This may very well return an error.
2755 m_errorMonitor->VerifyFound();
2756 }
2757 }
2758
2759 // Test memory offsets outside the memory allocation
2760 {
2761 VkDeviceSize image_offset =
2762 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2764 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2765 (void)err; // This may very well return an error.
2766 m_errorMonitor->VerifyFound();
2767
2768 VkDeviceSize buffer_offset =
2769 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2771 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2772 (void)err; // This may very well return an error.
2773 m_errorMonitor->VerifyFound();
2774 }
2775
2776 // Test memory offsets within the memory allocation, but which leave too little memory for
2777 // the resource.
2778 {
2779 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
2780 if (image_offset > 0) {
2781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2782 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2783 (void)err; // This may very well return an error.
2784 m_errorMonitor->VerifyFound();
2785 }
2786
2787 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2788 if (buffer_offset > 0) {
2789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2790 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2791 (void)err; // This may very well return an error.
2792 m_errorMonitor->VerifyFound();
2793 }
2794 }
Cort6c7dff72017-01-27 18:34:50 -08002795
2796 vkFreeMemory(device(), image_mem, NULL);
2797 vkFreeMemory(device(), buffer_mem, NULL);
2798 vkDestroyImage(device(), image, NULL);
2799 vkDestroyBuffer(device(), buffer, NULL);
2800 }
2801
Cort Stratton4c38bb52017-01-28 13:33:10 -08002802 // Try to bind memory to an object with an invalid memory type
2803 {
2804 VkImage image = VK_NULL_HANDLE;
2805 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2806 ASSERT_VK_SUCCESS(err);
2807 VkBuffer buffer = VK_NULL_HANDLE;
2808 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2809 ASSERT_VK_SUCCESS(err);
2810 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2811 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2812 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2813 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2814 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2815 image_alloc_info.allocationSize = image_mem_reqs.size;
2816 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2817 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002818 // Create a mask of available memory types *not* supported by these resources,
2819 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002820 VkPhysicalDeviceMemoryProperties memory_properties = {};
2821 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002822 VkDeviceMemory image_mem, buffer_mem;
2823
Cort Stratton4c38bb52017-01-28 13:33:10 -08002824 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002826 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2827 ASSERT_TRUE(pass);
2828 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2829 ASSERT_VK_SUCCESS(err);
2830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2831 err = vkBindImageMemory(device(), image, image_mem, 0);
2832 (void)err; // This may very well return an error.
2833 m_errorMonitor->VerifyFound();
2834 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002835 }
2836
Cort Stratton4c38bb52017-01-28 13:33:10 -08002837 uint32_t buffer_unsupported_mem_type_bits =
2838 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002840 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2841 ASSERT_TRUE(pass);
2842 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2843 ASSERT_VK_SUCCESS(err);
2844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2845 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2846 (void)err; // This may very well return an error.
2847 m_errorMonitor->VerifyFound();
2848 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002849 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002850
Cort Stratton4c38bb52017-01-28 13:33:10 -08002851 vkDestroyImage(device(), image, NULL);
2852 vkDestroyBuffer(device(), buffer, NULL);
2853 }
2854
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002855 // Try to bind memory to an image created with sparse memory flags
2856 {
2857 VkImageCreateInfo sparse_image_create_info = image_create_info;
2858 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2859 VkImageFormatProperties image_format_properties = {};
2860 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2861 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2862 sparse_image_create_info.usage, sparse_image_create_info.flags,
2863 &image_format_properties);
2864 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2865 // most likely means sparse formats aren't supported here; skip this test.
2866 } else {
2867 ASSERT_VK_SUCCESS(err);
2868 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002869 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 return;
2871 } else {
2872 VkImage sparse_image = VK_NULL_HANDLE;
2873 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2874 ASSERT_VK_SUCCESS(err);
2875 VkMemoryRequirements sparse_mem_reqs = {};
2876 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2877 if (sparse_mem_reqs.memoryTypeBits != 0) {
2878 VkMemoryAllocateInfo sparse_mem_alloc = {};
2879 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2880 sparse_mem_alloc.pNext = NULL;
2881 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2882 sparse_mem_alloc.memoryTypeIndex = 0;
2883 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2884 ASSERT_TRUE(pass);
2885 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2886 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2887 ASSERT_VK_SUCCESS(err);
2888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2889 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2890 // This may very well return an error.
2891 (void)err;
2892 m_errorMonitor->VerifyFound();
2893 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2894 }
2895 vkDestroyImage(m_device->device(), sparse_image, NULL);
2896 }
2897 }
2898 }
2899
2900 // Try to bind memory to a buffer created with sparse memory flags
2901 {
2902 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2903 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2904 if (!m_device->phy().features().sparseResidencyBuffer) {
2905 // most likely means sparse formats aren't supported here; skip this test.
2906 } else {
2907 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2908 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2909 ASSERT_VK_SUCCESS(err);
2910 VkMemoryRequirements sparse_mem_reqs = {};
2911 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2912 if (sparse_mem_reqs.memoryTypeBits != 0) {
2913 VkMemoryAllocateInfo sparse_mem_alloc = {};
2914 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2915 sparse_mem_alloc.pNext = NULL;
2916 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2917 sparse_mem_alloc.memoryTypeIndex = 0;
2918 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2919 ASSERT_TRUE(pass);
2920 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2921 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2922 ASSERT_VK_SUCCESS(err);
2923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2924 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2925 // This may very well return an error.
2926 (void)err;
2927 m_errorMonitor->VerifyFound();
2928 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2929 }
2930 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2931 }
2932 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002933}
2934
Karl Schultz6addd812016-02-02 17:17:23 -07002935TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2936 VkResult err;
2937 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002940
Tony Barbour1fa09702017-03-16 12:09:08 -06002941 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
Karl Schultz6addd812016-02-02 17:17:23 -07002943 // Create an image object, allocate memory, destroy the object and then try
2944 // to bind it
2945 VkImage image;
2946 VkDeviceMemory mem;
2947 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002948
Karl Schultz6addd812016-02-02 17:17:23 -07002949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2950 const int32_t tex_width = 32;
2951 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002952
2953 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2955 image_create_info.pNext = NULL;
2956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2957 image_create_info.format = tex_format;
2958 image_create_info.extent.width = tex_width;
2959 image_create_info.extent.height = tex_height;
2960 image_create_info.extent.depth = 1;
2961 image_create_info.mipLevels = 1;
2962 image_create_info.arrayLayers = 1;
2963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2964 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2965 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2966 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002968 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2970 mem_alloc.pNext = NULL;
2971 mem_alloc.allocationSize = 0;
2972 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
Chia-I Wuf7458c52015-10-26 21:10:41 +08002974 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002978
2979 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002980 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002981 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
2983 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002984 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002985 ASSERT_VK_SUCCESS(err);
2986
2987 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002989 ASSERT_VK_SUCCESS(err);
2990
2991 // Now Try to bind memory to this destroyed object
2992 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2993 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002994 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002995
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002996 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002997
Chia-I Wuf7458c52015-10-26 21:10:41 +08002998 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002999}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003000
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003001TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3002 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3003
Tony Barbour1fa09702017-03-16 12:09:08 -06003004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3006
3007 VkVertexInputBindingDescription input_binding;
3008 memset(&input_binding, 0, sizeof(input_binding));
3009
3010 VkVertexInputAttributeDescription input_attribs;
3011 memset(&input_attribs, 0, sizeof(input_attribs));
3012
3013 // Pick a really bad format for this purpose and make sure it should fail
3014 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3015 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3016 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003017 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003018 return;
3019 }
3020
3021 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003022 char const *vsSource =
3023 "#version 450\n"
3024 "\n"
3025 "out gl_PerVertex {\n"
3026 " vec4 gl_Position;\n"
3027 "};\n"
3028 "void main(){\n"
3029 " gl_Position = vec4(1);\n"
3030 "}\n";
3031 char const *fsSource =
3032 "#version 450\n"
3033 "\n"
3034 "layout(location=0) out vec4 color;\n"
3035 "void main(){\n"
3036 " color = vec4(1);\n"
3037 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003038
3039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3042
3043 VkPipelineObj pipe(m_device);
3044 pipe.AddColorAttachment();
3045 pipe.AddShader(&vs);
3046 pipe.AddShader(&fs);
3047
3048 pipe.AddVertexInputBindings(&input_binding, 1);
3049 pipe.AddVertexInputAttribs(&input_attribs, 1);
3050
3051 VkDescriptorSetObj descriptorSet(m_device);
3052 descriptorSet.AppendDummy();
3053 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3054
3055 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3056
3057 m_errorMonitor->VerifyFound();
3058}
3059
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003060TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003061 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003062 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003063
3064 VkMemoryPropertyFlags reqs = 0;
3065 VkImageCreateInfo image_create_info = {};
3066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3067 image_create_info.pNext = NULL;
3068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3069 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3070 image_create_info.extent.width = 256;
3071 image_create_info.extent.height = 256;
3072 image_create_info.extent.depth = 1;
3073 image_create_info.mipLevels = 1;
3074 image_create_info.arrayLayers = 1;
3075 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3076 image_create_info.flags = 0;
3077
3078 VkImageBlit blit_region = {};
3079 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3080 blit_region.srcSubresource.baseArrayLayer = 0;
3081 blit_region.srcSubresource.layerCount = 1;
3082 blit_region.srcSubresource.mipLevel = 0;
3083 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3084 blit_region.dstSubresource.baseArrayLayer = 0;
3085 blit_region.dstSubresource.layerCount = 1;
3086 blit_region.dstSubresource.mipLevel = 0;
3087
3088 // Create two images, the source with sampleCount = 2, and attempt to blit
3089 // between them
3090 {
3091 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003092 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003093 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003094 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003096 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003097 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003098 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003099 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3102 "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 -06003103 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3104 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003105 m_errorMonitor->VerifyFound();
3106 m_commandBuffer->EndCommandBuffer();
3107 }
3108
3109 // Create two images, the dest with sampleCount = 4, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "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 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 VkBufferImageCopy copy_region = {};
3131 copy_region.bufferRowLength = 128;
3132 copy_region.bufferImageHeight = 128;
3133 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3134 copy_region.imageSubresource.layerCount = 1;
3135 copy_region.imageExtent.height = 64;
3136 copy_region.imageExtent.width = 64;
3137 copy_region.imageExtent.depth = 1;
3138
3139 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3140 // buffer to image
3141 {
3142 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003143 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3144 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003146 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003147 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003148 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003149 m_errorMonitor->SetDesiredFailureMsg(
3150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3151 "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 -06003152 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3153 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003154 m_errorMonitor->VerifyFound();
3155 m_commandBuffer->EndCommandBuffer();
3156 }
3157
3158 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3159 // image to buffer
3160 {
3161 vk_testing::Buffer dst_buffer;
3162 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3163 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003164 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003165 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003168 m_errorMonitor->SetDesiredFailureMsg(
3169 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3170 "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 -06003171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003172 dst_buffer.handle(), 1, &copy_region);
3173 m_errorMonitor->VerifyFound();
3174 m_commandBuffer->EndCommandBuffer();
3175 }
3176}
3177
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003178TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003179 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003180
3181 VkImageObj src_image(m_device);
3182 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3183 VkImageObj dst_image(m_device);
3184 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3185 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003186 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 -06003187
3188 VkImageBlit blitRegion = {};
3189 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3190 blitRegion.srcSubresource.baseArrayLayer = 0;
3191 blitRegion.srcSubresource.layerCount = 1;
3192 blitRegion.srcSubresource.mipLevel = 0;
3193 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3194 blitRegion.dstSubresource.baseArrayLayer = 0;
3195 blitRegion.dstSubresource.layerCount = 1;
3196 blitRegion.dstSubresource.mipLevel = 0;
3197
Dave Houlton34df4cb2016-12-01 16:43:06 -07003198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3199
3200 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3201 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003202
3203 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003204 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
3208 m_errorMonitor->VerifyFound();
3209
Dave Houlton34df4cb2016-12-01 16:43:06 -07003210 // Test should generate 2 VU failures
3211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213
3214 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003215 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3216 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
Dave Houlton34df4cb2016-12-01 16:43:06 -07003218 // TODO: Note that this only verifies that at least one of the VU enums was found
3219 // 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 -06003220 m_errorMonitor->VerifyFound();
3221
Tony Barbour552f6c02016-12-21 14:34:07 -07003222 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223}
3224
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003225TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3226 VkResult err;
3227 bool pass;
3228
3229 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003230 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003231
3232 // If w/d/h granularity is 1, test is not meaningful
3233 // TODO: When virtual device limits are available, create a set of limits for this test that
3234 // will always have a granularity of > 1 for w, h, and d
3235 auto index = m_device->graphics_queue_node_index_;
3236 auto queue_family_properties = m_device->phy().queue_properties();
3237
3238 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3239 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3240 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3241 return;
3242 }
3243
3244 // Create two images of different types and try to copy between them
3245 VkImage srcImage;
3246 VkImage dstImage;
3247 VkDeviceMemory srcMem;
3248 VkDeviceMemory destMem;
3249 VkMemoryRequirements memReqs;
3250
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003251 VkImageCreateInfo image_create_info = {};
3252 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3253 image_create_info.pNext = NULL;
3254 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3255 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3256 image_create_info.extent.width = 32;
3257 image_create_info.extent.height = 32;
3258 image_create_info.extent.depth = 1;
3259 image_create_info.mipLevels = 1;
3260 image_create_info.arrayLayers = 4;
3261 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3262 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3263 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3264 image_create_info.flags = 0;
3265
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003266 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003267 ASSERT_VK_SUCCESS(err);
3268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003269 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003270 ASSERT_VK_SUCCESS(err);
3271
3272 // Allocate memory
3273 VkMemoryAllocateInfo memAlloc = {};
3274 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3275 memAlloc.pNext = NULL;
3276 memAlloc.allocationSize = 0;
3277 memAlloc.memoryTypeIndex = 0;
3278
3279 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3280 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_TRUE(pass);
3283 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3284 ASSERT_VK_SUCCESS(err);
3285
3286 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3287 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003288 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 ASSERT_VK_SUCCESS(err);
3290 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3291 ASSERT_VK_SUCCESS(err);
3292
3293 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3294 ASSERT_VK_SUCCESS(err);
3295 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3296 ASSERT_VK_SUCCESS(err);
3297
Tony Barbour552f6c02016-12-21 14:34:07 -07003298 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003299 VkImageCopy copyRegion;
3300 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3301 copyRegion.srcSubresource.mipLevel = 0;
3302 copyRegion.srcSubresource.baseArrayLayer = 0;
3303 copyRegion.srcSubresource.layerCount = 1;
3304 copyRegion.srcOffset.x = 0;
3305 copyRegion.srcOffset.y = 0;
3306 copyRegion.srcOffset.z = 0;
3307 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3308 copyRegion.dstSubresource.mipLevel = 0;
3309 copyRegion.dstSubresource.baseArrayLayer = 0;
3310 copyRegion.dstSubresource.layerCount = 1;
3311 copyRegion.dstOffset.x = 0;
3312 copyRegion.dstOffset.y = 0;
3313 copyRegion.dstOffset.z = 0;
3314 copyRegion.extent.width = 1;
3315 copyRegion.extent.height = 1;
3316 copyRegion.extent.depth = 1;
3317
3318 // Introduce failure by setting srcOffset to a bad granularity value
3319 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3321 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003322 m_errorMonitor->VerifyFound();
3323
3324 // Introduce failure by setting extent to a bad granularity value
3325 copyRegion.srcOffset.y = 0;
3326 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3328 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003329 m_errorMonitor->VerifyFound();
3330
3331 // Now do some buffer/image copies
3332 vk_testing::Buffer buffer;
3333 VkMemoryPropertyFlags reqs = 0;
3334 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3335 VkBufferImageCopy region = {};
3336 region.bufferOffset = 0;
3337 region.bufferRowLength = 3;
3338 region.bufferImageHeight = 128;
3339 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3340 region.imageSubresource.layerCount = 1;
3341 region.imageExtent.height = 16;
3342 region.imageExtent.width = 16;
3343 region.imageExtent.depth = 1;
3344 region.imageOffset.x = 0;
3345 region.imageOffset.y = 0;
3346 region.imageOffset.z = 0;
3347
3348 // Introduce failure by setting bufferRowLength to a bad granularity value
3349 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3351 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3352 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003353 m_errorMonitor->VerifyFound();
3354 region.bufferRowLength = 128;
3355
3356 // Introduce failure by setting bufferOffset to a bad granularity value
3357 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3359 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3360 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003361 m_errorMonitor->VerifyFound();
3362 region.bufferOffset = 0;
3363
3364 // Introduce failure by setting bufferImageHeight to a bad granularity value
3365 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3367 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3368 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003369 m_errorMonitor->VerifyFound();
3370 region.bufferImageHeight = 128;
3371
3372 // Introduce failure by setting imageExtent to a bad granularity value
3373 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3376 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003377 m_errorMonitor->VerifyFound();
3378 region.imageExtent.width = 16;
3379
3380 // Introduce failure by setting imageOffset to a bad granularity value
3381 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3384 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003385 m_errorMonitor->VerifyFound();
3386
Tony Barbour552f6c02016-12-21 14:34:07 -07003387 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003388
3389 vkDestroyImage(m_device->device(), srcImage, NULL);
3390 vkDestroyImage(m_device->device(), dstImage, NULL);
3391 vkFreeMemory(m_device->device(), srcMem, NULL);
3392 vkFreeMemory(m_device->device(), destMem, NULL);
3393}
3394
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003395TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003396 TEST_DESCRIPTION(
3397 "Submit command buffer created using one queue family and "
3398 "attempt to submit them on a queue created in a different "
3399 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003400
Tony Barbour1fa09702017-03-16 12:09:08 -06003401 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003402
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003403 // This test is meaningless unless we have multiple queue families
3404 auto queue_family_properties = m_device->phy().queue_properties();
3405 if (queue_family_properties.size() < 2) {
3406 return;
3407 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003409 // Get safe index of another queue family
3410 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Tony Barbour1fa09702017-03-16 12:09:08 -06003411 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003412 // Create a second queue using a different queue family
3413 VkQueue other_queue;
3414 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3415
3416 // Record an empty cmd buffer
3417 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3418 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3419 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3420 vkEndCommandBuffer(m_commandBuffer->handle());
3421
3422 // And submit on the wrong queue
3423 VkSubmitInfo submit_info = {};
3424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3425 submit_info.commandBufferCount = 1;
3426 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003427 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003428
3429 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430}
3431
Chris Forbes4c24a922016-11-16 08:59:10 +13003432TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003433 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003434
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003435 // There are no attachments, but refer to attachment 0.
3436 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003437 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003438 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003439 };
3440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003441 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003442 VkRenderPass rp;
3443
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003444 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003446 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3447 m_errorMonitor->VerifyFound();
3448}
3449
Chris Forbesa58c4522016-09-28 15:19:39 +13003450TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3451 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003453
3454 // A renderpass with two subpasses, both writing the same attachment.
3455 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003456 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3457 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3458 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003459 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003462 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3463 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003464 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003465 VkSubpassDependency dep = {0,
3466 1,
3467 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3468 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3469 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3470 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3471 VK_DEPENDENCY_BY_REGION_BIT};
3472 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003473 VkRenderPass rp;
3474 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3475 ASSERT_VK_SUCCESS(err);
3476
3477 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 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 +13003479 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3480
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003482 VkFramebuffer fb;
3483 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3484 ASSERT_VK_SUCCESS(err);
3485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003486 char const *vsSource =
3487 "#version 450\n"
3488 "void main() { gl_Position = vec4(1); }\n";
3489 char const *fsSource =
3490 "#version 450\n"
3491 "layout(location=0) out vec4 color;\n"
3492 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003493
3494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3496 VkPipelineObj pipe(m_device);
3497 pipe.AddColorAttachment();
3498 pipe.AddShader(&vs);
3499 pipe.AddShader(&fs);
3500 VkViewport view_port = {};
3501 m_viewports.push_back(view_port);
3502 pipe.SetViewport(m_viewports);
3503 VkRect2D rect = {};
3504 m_scissors.push_back(rect);
3505 pipe.SetScissor(m_scissors);
3506
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003507 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003508 VkPipelineLayout pl;
3509 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3510 ASSERT_VK_SUCCESS(err);
3511 pipe.CreateVKPipeline(pl, rp);
3512
Tony Barbour552f6c02016-12-21 14:34:07 -07003513 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003514
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003515 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3516 nullptr,
3517 rp,
3518 fb,
3519 {{
3520 0, 0,
3521 },
3522 {32, 32}},
3523 0,
3524 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003525
3526 // subtest 1: bind in the wrong subpass
3527 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3528 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003529 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 +13003530 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3531 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3532 m_errorMonitor->VerifyFound();
3533
3534 vkCmdEndRenderPass(m_commandBuffer->handle());
3535
3536 // subtest 2: bind in correct subpass, then transition to next subpass
3537 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3538 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3539 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003540 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 +13003541 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3542 m_errorMonitor->VerifyFound();
3543
3544 vkCmdEndRenderPass(m_commandBuffer->handle());
3545
Tony Barbour552f6c02016-12-21 14:34:07 -07003546 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003547
3548 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3549 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3550 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3551}
3552
Tony Barbour4e919972016-08-09 13:27:40 -06003553TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003554 TEST_DESCRIPTION(
3555 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3556 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003557 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3559
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 "Cannot execute a render pass with renderArea "
3562 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003563
3564 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3565 m_renderPassBeginInfo.renderArea.extent.width = 257;
3566 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003567 m_commandBuffer->BeginCommandBuffer();
3568 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003569 m_errorMonitor->VerifyFound();
3570}
3571
3572TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INDEPENDENT_BLEND by disabling independent "
3575 "blend and then specifying different blend states for two "
3576 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003577 VkPhysicalDeviceFeatures features = {};
3578 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003579 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3582 "Invalid Pipeline CreateInfo: If independent blend feature not "
3583 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003584
Cody Northropc31a84f2016-08-22 10:41:47 -06003585 VkDescriptorSetObj descriptorSet(m_device);
3586 descriptorSet.AppendDummy();
3587 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003588
Cody Northropc31a84f2016-08-22 10:41:47 -06003589 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003590 // Create a renderPass with two color attachments
3591 VkAttachmentReference attachments[2] = {};
3592 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003594 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3595
3596 VkSubpassDescription subpass = {};
3597 subpass.pColorAttachments = attachments;
3598 subpass.colorAttachmentCount = 2;
3599
3600 VkRenderPassCreateInfo rpci = {};
3601 rpci.subpassCount = 1;
3602 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604
Tony Barbourffd60bd2017-03-09 12:04:55 -07003605 VkAttachmentDescription attach_desc[2] = {};
3606 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3607 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3608 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3609 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3610 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3611 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3612 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3613 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003614
Tony Barbourffd60bd2017-03-09 12:04:55 -07003615 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003616 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3617
3618 VkRenderPass renderpass;
3619 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003620 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003621 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003622
Cody Northropc31a84f2016-08-22 10:41:47 -06003623 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3624 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3625 att_state1.blendEnable = VK_TRUE;
3626 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3627 att_state2.blendEnable = VK_FALSE;
3628 pipeline.AddColorAttachment(0, &att_state1);
3629 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003630 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003631 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003632 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003633}
3634
Mike Weiblen40b160e2017-02-06 19:21:52 -07003635// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3636TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3637 TEST_DESCRIPTION(
3638 "Create a graphics pipeline that is incompatible with the requirements "
3639 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003640 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003641
3642 VkDescriptorSetObj ds_obj(m_device);
3643 ds_obj.AppendDummy();
3644 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3645
3646 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3647
3648 VkPipelineColorBlendAttachmentState att_state1 = {};
3649 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3650 att_state1.blendEnable = VK_TRUE;
3651
3652 VkRenderpassObj rp_obj(m_device);
3653
3654 {
3655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3656 VkPipelineObj pipeline(m_device);
3657 pipeline.AddShader(&vs_obj);
3658 pipeline.AddColorAttachment(0, &att_state1);
3659
3660 VkGraphicsPipelineCreateInfo info = {};
3661 pipeline.InitGraphicsPipelineCreateInfo(&info);
3662 info.pColorBlendState = nullptr;
3663
3664 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3665 m_errorMonitor->VerifyFound();
3666 }
3667}
3668
Chris Forbes26ec2122016-11-29 08:58:33 +13003669#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003670TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3671 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3672 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003673 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3676 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003677
3678 // Create a renderPass with a single color attachment
3679 VkAttachmentReference attach = {};
3680 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3681 VkSubpassDescription subpass = {};
3682 VkRenderPassCreateInfo rpci = {};
3683 rpci.subpassCount = 1;
3684 rpci.pSubpasses = &subpass;
3685 rpci.attachmentCount = 1;
3686 VkAttachmentDescription attach_desc = {};
3687 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3688 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3689 rpci.pAttachments = &attach_desc;
3690 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3691 VkRenderPass rp;
3692 subpass.pDepthStencilAttachment = &attach;
3693 subpass.pColorAttachments = NULL;
3694 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3695 m_errorMonitor->VerifyFound();
3696}
Chris Forbes26ec2122016-11-29 08:58:33 +13003697#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003698
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003699TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003700 TEST_DESCRIPTION(
3701 "Create a framebuffer where a subpass has a preserve "
3702 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003703
Tony Barbour1fa09702017-03-16 12:09:08 -06003704 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3706
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003708
3709 VkAttachmentReference color_attach = {};
3710 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3711 color_attach.attachment = 0;
3712 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3713 VkSubpassDescription subpass = {};
3714 subpass.colorAttachmentCount = 1;
3715 subpass.pColorAttachments = &color_attach;
3716 subpass.preserveAttachmentCount = 1;
3717 subpass.pPreserveAttachments = &preserve_attachment;
3718
3719 VkRenderPassCreateInfo rpci = {};
3720 rpci.subpassCount = 1;
3721 rpci.pSubpasses = &subpass;
3722 rpci.attachmentCount = 1;
3723 VkAttachmentDescription attach_desc = {};
3724 attach_desc.format = VK_FORMAT_UNDEFINED;
3725 rpci.pAttachments = &attach_desc;
3726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3727 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003728 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003729
3730 m_errorMonitor->VerifyFound();
3731
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003732 if (result == VK_SUCCESS) {
3733 vkDestroyRenderPass(m_device->device(), rp, NULL);
3734 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003735}
3736
Chris Forbesc5389742016-06-29 11:49:23 +12003737TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003738 TEST_DESCRIPTION(
3739 "Ensure that CreateRenderPass produces a validation error "
3740 "when the source of a subpass multisample resolve "
3741 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003742
Tony Barbour1fa09702017-03-16 12:09:08 -06003743 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3746 "Subpass 0 requests multisample resolve from attachment 0 which has "
3747 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003748
3749 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003750 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3751 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3752 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3753 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3754 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3755 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003756 };
3757
3758 VkAttachmentReference color = {
3759 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3760 };
3761
3762 VkAttachmentReference resolve = {
3763 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3764 };
3765
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003766 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003767
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003768 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003769
3770 VkRenderPass rp;
3771 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3772
3773 m_errorMonitor->VerifyFound();
3774
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003775 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003776}
3777
3778TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003779 TEST_DESCRIPTION(
3780 "Ensure CreateRenderPass produces a validation error "
3781 "when a subpass multisample resolve operation is "
3782 "requested, and the destination of that resolve has "
3783 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003784
Tony Barbour1fa09702017-03-16 12:09:08 -06003785 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3788 "Subpass 0 requests multisample resolve into attachment 1, which "
3789 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003790
3791 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003792 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3793 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3794 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3795 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3797 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003798 };
3799
3800 VkAttachmentReference color = {
3801 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3802 };
3803
3804 VkAttachmentReference resolve = {
3805 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3806 };
3807
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003808 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003809
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003810 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003811
3812 VkRenderPass rp;
3813 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3814
3815 m_errorMonitor->VerifyFound();
3816
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003817 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003818}
3819
Chris Forbes3f128ef2016-06-29 14:58:53 +12003820TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003821 TEST_DESCRIPTION(
3822 "Ensure CreateRenderPass produces a validation error "
3823 "when the color and depth attachments used by a subpass "
3824 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003825
Tony Barbour1fa09702017-03-16 12:09:08 -06003826 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003827
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3829 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003830
3831 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003832 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3833 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3834 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3835 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3836 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3837 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003838 };
3839
3840 VkAttachmentReference color[] = {
3841 {
3842 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3843 },
3844 {
3845 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3846 },
3847 };
3848
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003849 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003850
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003852
3853 VkRenderPass rp;
3854 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3855
3856 m_errorMonitor->VerifyFound();
3857
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003858 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003859}
3860
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003861TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003862 TEST_DESCRIPTION(
3863 "Hit errors when attempting to create a framebuffer :\n"
3864 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3865 " 2. Use a color image as depthStencil attachment\n"
3866 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3867 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3868 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3869 " 6. Framebuffer attachment where dimensions don't match\n"
3870 " 7. Framebuffer attachment w/o identity swizzle\n"
3871 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003872
Tony Barbour1fa09702017-03-16 12:09:08 -06003873 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003874 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3875
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003876 m_errorMonitor->SetDesiredFailureMsg(
3877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3878 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003881 VkAttachmentReference attach = {};
3882 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3883 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003884 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885 VkRenderPassCreateInfo rpci = {};
3886 rpci.subpassCount = 1;
3887 rpci.pSubpasses = &subpass;
3888 rpci.attachmentCount = 1;
3889 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003890 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003891 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 rpci.pAttachments = &attach_desc;
3893 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3894 VkRenderPass rp;
3895 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3896 ASSERT_VK_SUCCESS(err);
3897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 VkImageView ivs[2];
3899 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3900 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003901 VkFramebufferCreateInfo fb_info = {};
3902 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3903 fb_info.pNext = NULL;
3904 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003905 // Set mis-matching attachmentCount
3906 fb_info.attachmentCount = 2;
3907 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003908 fb_info.width = 100;
3909 fb_info.height = 100;
3910 fb_info.layers = 1;
3911
3912 VkFramebuffer fb;
3913 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3914
3915 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003916 if (err == VK_SUCCESS) {
3917 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3918 }
3919 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003920
3921 // Create a renderPass with a depth-stencil attachment created with
3922 // IMAGE_USAGE_COLOR_ATTACHMENT
3923 // Add our color attachment to pDepthStencilAttachment
3924 subpass.pDepthStencilAttachment = &attach;
3925 subpass.pColorAttachments = NULL;
3926 VkRenderPass rp_ds;
3927 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3928 ASSERT_VK_SUCCESS(err);
3929 // Set correct attachment count, but attachment has COLOR usage bit set
3930 fb_info.attachmentCount = 1;
3931 fb_info.renderPass = rp_ds;
3932
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003934 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3935
3936 m_errorMonitor->VerifyFound();
3937 if (err == VK_SUCCESS) {
3938 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3939 }
3940 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003941
3942 // Create new renderpass with alternate attachment format from fb
3943 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3944 subpass.pDepthStencilAttachment = NULL;
3945 subpass.pColorAttachments = &attach;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3947 ASSERT_VK_SUCCESS(err);
3948
3949 // Cause error due to mis-matched formats between rp & fb
3950 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3951 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3953 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3955
3956 m_errorMonitor->VerifyFound();
3957 if (err == VK_SUCCESS) {
3958 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3959 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003960 vkDestroyRenderPass(m_device->device(), rp, NULL);
3961
3962 // Create new renderpass with alternate sample count from fb
3963 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3964 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched sample count between rp & fb
3969 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003971 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003972 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3973
3974 m_errorMonitor->VerifyFound();
3975 if (err == VK_SUCCESS) {
3976 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3977 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003978
3979 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
3981 // Create a custom imageView with non-1 mip levels
3982 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003983 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 -06003984 ASSERT_TRUE(image.initialized());
3985
3986 VkImageView view;
3987 VkImageViewCreateInfo ivci = {};
3988 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3989 ivci.image = image.handle();
3990 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3991 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3992 ivci.subresourceRange.layerCount = 1;
3993 ivci.subresourceRange.baseMipLevel = 0;
3994 // Set level count 2 (only 1 is allowed for FB attachment)
3995 ivci.subresourceRange.levelCount = 2;
3996 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3997 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3998 ASSERT_VK_SUCCESS(err);
3999 // Re-create renderpass to have matching sample count
4000 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4001 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4002 ASSERT_VK_SUCCESS(err);
4003
4004 fb_info.renderPass = rp;
4005 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004007 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4008
4009 m_errorMonitor->VerifyFound();
4010 if (err == VK_SUCCESS) {
4011 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4012 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004013 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004014 // Update view to original color buffer and grow FB dimensions too big
4015 fb_info.pAttachments = ivs;
4016 fb_info.height = 1024;
4017 fb_info.width = 1024;
4018 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004020 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4021
4022 m_errorMonitor->VerifyFound();
4023 if (err == VK_SUCCESS) {
4024 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4025 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004026 // Create view attachment with non-identity swizzle
4027 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4028 ivci.image = image.handle();
4029 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4030 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4031 ivci.subresourceRange.layerCount = 1;
4032 ivci.subresourceRange.baseMipLevel = 0;
4033 ivci.subresourceRange.levelCount = 1;
4034 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4035 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4036 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4037 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4038 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4039 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4040 ASSERT_VK_SUCCESS(err);
4041
4042 fb_info.pAttachments = &view;
4043 fb_info.height = 100;
4044 fb_info.width = 100;
4045 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004046 m_errorMonitor->SetDesiredFailureMsg(
4047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4048 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004049 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4050
4051 m_errorMonitor->VerifyFound();
4052 if (err == VK_SUCCESS) {
4053 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4054 }
4055 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004056 // reset attachment to color attachment
4057 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004058
4059 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004060 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004061 fb_info.height = 100;
4062 fb_info.layers = 1;
4063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004064 m_errorMonitor->SetDesiredFailureMsg(
4065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004066 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4067 "Here are the respective dimensions for attachment");
4068
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004069 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4070
4071 m_errorMonitor->VerifyFound();
4072 if (err == VK_SUCCESS) {
4073 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4074 }
4075
4076 // Request fb that exceeds max height
4077 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004078 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004079 fb_info.layers = 1;
4080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004083 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4084 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004085 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4086
4087 m_errorMonitor->VerifyFound();
4088 if (err == VK_SUCCESS) {
4089 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4090 }
4091
4092 // Request fb that exceeds max layers
4093 fb_info.width = 100;
4094 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004095 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004097 m_errorMonitor->SetDesiredFailureMsg(
4098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004099 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4100 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004101 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4102
4103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 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 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Tobin Ehlisea413442016-09-28 10:23:59 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
5060 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
5194 subpass.pColorAttachments = &attach;
5195 VkRenderPassCreateInfo rpci = {};
5196 rpci.subpassCount = 1;
5197 rpci.pSubpasses = &subpass;
5198 rpci.attachmentCount = 1;
5199 VkAttachmentDescription attach_desc = {};
5200 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5201 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5202 rpci.pAttachments = &attach_desc;
5203 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5204 VkRenderPass rp;
5205 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5206 ASSERT_VK_SUCCESS(err);
5207
5208 // Create a pipeline that uses the given renderpass
5209 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5210 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5211
5212 VkPipelineLayout pipeline_layout;
5213 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5214 ASSERT_VK_SUCCESS(err);
5215
5216 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5217 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5218 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005219 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005220 vp_state_ci.pViewports = &vp;
5221 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005222 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005223 vp_state_ci.pScissors = &scissors;
5224
5225 VkPipelineShaderStageCreateInfo shaderStages[2];
5226 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5227
5228 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005229 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 -06005230 // but add it to be able to run on more devices
5231 shaderStages[0] = vs.GetStageCreateInfo();
5232 shaderStages[1] = fs.GetStageCreateInfo();
5233
5234 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5235 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5236
5237 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5238 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5239 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5240
5241 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5242 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5243 rs_ci.rasterizerDiscardEnable = true;
5244 rs_ci.lineWidth = 1.0f;
5245
5246 VkPipelineColorBlendAttachmentState att = {};
5247 att.blendEnable = VK_FALSE;
5248 att.colorWriteMask = 0xf;
5249
5250 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5251 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5252 cb_ci.attachmentCount = 1;
5253 cb_ci.pAttachments = &att;
5254
5255 VkGraphicsPipelineCreateInfo gp_ci = {};
5256 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5257 gp_ci.stageCount = 2;
5258 gp_ci.pStages = shaderStages;
5259 gp_ci.pVertexInputState = &vi_ci;
5260 gp_ci.pInputAssemblyState = &ia_ci;
5261 gp_ci.pViewportState = &vp_state_ci;
5262 gp_ci.pRasterizationState = &rs_ci;
5263 gp_ci.pColorBlendState = &cb_ci;
5264 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5265 gp_ci.layout = pipeline_layout;
5266 gp_ci.renderPass = rp;
5267
5268 VkPipelineCacheCreateInfo pc_ci = {};
5269 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5270
5271 VkPipeline pipeline;
5272 VkPipelineCache pipe_cache;
5273 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5274 ASSERT_VK_SUCCESS(err);
5275
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005276 m_errorMonitor->SetUnexpectedError(
5277 "If pColorBlendState is not NULL, The attachmentCount member of pColorBlendState must be equal to the colorAttachmentCount "
5278 "used to create subpass");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005279 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5280 ASSERT_VK_SUCCESS(err);
5281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5291
5292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5293 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5294 m_errorMonitor->VerifyFound();
5295
5296 // Wait for queue to complete so we can safely destroy everything
5297 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005298 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5299 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005300 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5301 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5302 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5303 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5304}
5305
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005306TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005307 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005309
5310 VkImage image;
5311 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5312 VkImageCreateInfo image_create_info = {};
5313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5314 image_create_info.pNext = NULL;
5315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5316 image_create_info.format = tex_format;
5317 image_create_info.extent.width = 32;
5318 image_create_info.extent.height = 32;
5319 image_create_info.extent.depth = 1;
5320 image_create_info.mipLevels = 1;
5321 image_create_info.arrayLayers = 1;
5322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005324 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005325 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005326 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005327 ASSERT_VK_SUCCESS(err);
5328 // Have to bind memory to image before recording cmd in cmd buffer using it
5329 VkMemoryRequirements mem_reqs;
5330 VkDeviceMemory image_mem;
5331 bool pass;
5332 VkMemoryAllocateInfo mem_alloc = {};
5333 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5334 mem_alloc.pNext = NULL;
5335 mem_alloc.memoryTypeIndex = 0;
5336 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5337 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005338 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005339 ASSERT_TRUE(pass);
5340 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5341 ASSERT_VK_SUCCESS(err);
5342
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005343 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005345 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005346
5347 m_commandBuffer->BeginCommandBuffer();
5348 VkClearColorValue ccv;
5349 ccv.float32[0] = 1.0f;
5350 ccv.float32[1] = 1.0f;
5351 ccv.float32[2] = 1.0f;
5352 ccv.float32[3] = 1.0f;
5353 VkImageSubresourceRange isr = {};
5354 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5355 isr.baseArrayLayer = 0;
5356 isr.baseMipLevel = 0;
5357 isr.layerCount = 1;
5358 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005359 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005360 m_commandBuffer->EndCommandBuffer();
5361
5362 m_errorMonitor->VerifyFound();
5363 vkDestroyImage(m_device->device(), image, NULL);
5364 vkFreeMemory(m_device->device(), image_mem, nullptr);
5365}
5366
5367TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005368 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005369 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005370
5371 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005372 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 -06005373 VK_IMAGE_TILING_OPTIMAL, 0);
5374 ASSERT_TRUE(image.initialized());
5375
5376 VkBuffer buffer;
5377 VkDeviceMemory mem;
5378 VkMemoryRequirements mem_reqs;
5379
5380 VkBufferCreateInfo buf_info = {};
5381 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005382 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005383 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005384 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5385 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5386 ASSERT_VK_SUCCESS(err);
5387
5388 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5389
5390 VkMemoryAllocateInfo alloc_info = {};
5391 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005392 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005393 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005394 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 -06005395 if (!pass) {
5396 vkDestroyBuffer(m_device->device(), buffer, NULL);
5397 return;
5398 }
5399 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5400 ASSERT_VK_SUCCESS(err);
5401
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005402 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005404 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005405 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005406 region.bufferRowLength = 16;
5407 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005408 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5409
5410 region.imageSubresource.layerCount = 1;
5411 region.imageExtent.height = 4;
5412 region.imageExtent.width = 4;
5413 region.imageExtent.depth = 1;
5414 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005415 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5416 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005417 m_commandBuffer->EndCommandBuffer();
5418
5419 m_errorMonitor->VerifyFound();
5420
5421 vkDestroyBuffer(m_device->device(), buffer, NULL);
5422 vkFreeMemory(m_device->handle(), mem, NULL);
5423}
5424
Tobin Ehlis85940f52016-07-07 16:57:21 -06005425TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005426 TEST_DESCRIPTION(
5427 "Attempt to draw with a command buffer that is invalid "
5428 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005429 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005430
5431 VkEvent event;
5432 VkEventCreateInfo evci = {};
5433 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5434 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5435 ASSERT_VK_SUCCESS(result);
5436
5437 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005438 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005439 m_commandBuffer->EndCommandBuffer();
5440
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005442 // Destroy event dependency prior to submit to cause ERROR
5443 vkDestroyEvent(m_device->device(), event, NULL);
5444
5445 VkSubmitInfo submit_info = {};
5446 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5447 submit_info.commandBufferCount = 1;
5448 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5449 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5450
5451 m_errorMonitor->VerifyFound();
5452}
5453
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005454TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005455 TEST_DESCRIPTION(
5456 "Attempt to draw with a command buffer that is invalid "
5457 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005458 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005459
5460 VkQueryPool query_pool;
5461 VkQueryPoolCreateInfo qpci{};
5462 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5463 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5464 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005465 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005466 ASSERT_VK_SUCCESS(result);
5467
5468 m_commandBuffer->BeginCommandBuffer();
5469 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5470 m_commandBuffer->EndCommandBuffer();
5471
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005473 // Destroy query pool dependency prior to submit to cause ERROR
5474 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5475
5476 VkSubmitInfo submit_info = {};
5477 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5478 submit_info.commandBufferCount = 1;
5479 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5480 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5481
5482 m_errorMonitor->VerifyFound();
5483}
5484
Tobin Ehlis24130d92016-07-08 15:50:53 -06005485TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005486 TEST_DESCRIPTION(
5487 "Attempt to draw with a command buffer that is invalid "
5488 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005489 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5491
5492 VkResult err;
5493
5494 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5495 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5496
5497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005499 ASSERT_VK_SUCCESS(err);
5500
5501 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5502 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5503 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005504 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005505 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005506 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005507 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005508 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509
5510 VkPipelineShaderStageCreateInfo shaderStages[2];
5511 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5512
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005513 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005514 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 -06005515 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005516 shaderStages[0] = vs.GetStageCreateInfo();
5517 shaderStages[1] = fs.GetStageCreateInfo();
5518
5519 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5520 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5521
5522 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5523 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5524 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5525
5526 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5527 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005528 rs_ci.rasterizerDiscardEnable = true;
5529 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005530
5531 VkPipelineColorBlendAttachmentState att = {};
5532 att.blendEnable = VK_FALSE;
5533 att.colorWriteMask = 0xf;
5534
5535 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5536 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5537 cb_ci.attachmentCount = 1;
5538 cb_ci.pAttachments = &att;
5539
5540 VkGraphicsPipelineCreateInfo gp_ci = {};
5541 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5542 gp_ci.stageCount = 2;
5543 gp_ci.pStages = shaderStages;
5544 gp_ci.pVertexInputState = &vi_ci;
5545 gp_ci.pInputAssemblyState = &ia_ci;
5546 gp_ci.pViewportState = &vp_state_ci;
5547 gp_ci.pRasterizationState = &rs_ci;
5548 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005549 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5550 gp_ci.layout = pipeline_layout;
5551 gp_ci.renderPass = renderPass();
5552
5553 VkPipelineCacheCreateInfo pc_ci = {};
5554 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5555
5556 VkPipeline pipeline;
5557 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005558 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005559 ASSERT_VK_SUCCESS(err);
5560
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005561 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005562 ASSERT_VK_SUCCESS(err);
5563
5564 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005565 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005566 m_commandBuffer->EndCommandBuffer();
5567 // Now destroy pipeline in order to cause error when submitting
5568 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5569
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005571
5572 VkSubmitInfo submit_info = {};
5573 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5574 submit_info.commandBufferCount = 1;
5575 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5576 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5577
5578 m_errorMonitor->VerifyFound();
5579 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5581}
5582
Tobin Ehlis31289162016-08-17 14:57:58 -06005583TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005584 TEST_DESCRIPTION(
5585 "Attempt to draw with a command buffer that is invalid "
5586 "due to a bound descriptor set with a buffer dependency "
5587 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005588 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005589 ASSERT_NO_FATAL_FAILURE(InitViewport());
5590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5591
5592 VkDescriptorPoolSize ds_type_count = {};
5593 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5594 ds_type_count.descriptorCount = 1;
5595
5596 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5597 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5598 ds_pool_ci.pNext = NULL;
5599 ds_pool_ci.maxSets = 1;
5600 ds_pool_ci.poolSizeCount = 1;
5601 ds_pool_ci.pPoolSizes = &ds_type_count;
5602
5603 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005604 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005605 ASSERT_VK_SUCCESS(err);
5606
5607 VkDescriptorSetLayoutBinding dsl_binding = {};
5608 dsl_binding.binding = 0;
5609 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5610 dsl_binding.descriptorCount = 1;
5611 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5612 dsl_binding.pImmutableSamplers = NULL;
5613
5614 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5615 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5616 ds_layout_ci.pNext = NULL;
5617 ds_layout_ci.bindingCount = 1;
5618 ds_layout_ci.pBindings = &dsl_binding;
5619 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005620 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005621 ASSERT_VK_SUCCESS(err);
5622
5623 VkDescriptorSet descriptorSet;
5624 VkDescriptorSetAllocateInfo alloc_info = {};
5625 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5626 alloc_info.descriptorSetCount = 1;
5627 alloc_info.descriptorPool = ds_pool;
5628 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005629 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005630 ASSERT_VK_SUCCESS(err);
5631
5632 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5633 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5634 pipeline_layout_ci.pNext = NULL;
5635 pipeline_layout_ci.setLayoutCount = 1;
5636 pipeline_layout_ci.pSetLayouts = &ds_layout;
5637
5638 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005639 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005640 ASSERT_VK_SUCCESS(err);
5641
5642 // Create a buffer to update the descriptor with
5643 uint32_t qfi = 0;
5644 VkBufferCreateInfo buffCI = {};
5645 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5646 buffCI.size = 1024;
5647 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5648 buffCI.queueFamilyIndexCount = 1;
5649 buffCI.pQueueFamilyIndices = &qfi;
5650
5651 VkBuffer buffer;
5652 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5653 ASSERT_VK_SUCCESS(err);
5654 // Allocate memory and bind to buffer so we can make it to the appropriate
5655 // error
5656 VkMemoryAllocateInfo mem_alloc = {};
5657 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5658 mem_alloc.pNext = NULL;
5659 mem_alloc.allocationSize = 1024;
5660 mem_alloc.memoryTypeIndex = 0;
5661
5662 VkMemoryRequirements memReqs;
5663 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005664 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005665 if (!pass) {
5666 vkDestroyBuffer(m_device->device(), buffer, NULL);
5667 return;
5668 }
5669
5670 VkDeviceMemory mem;
5671 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5672 ASSERT_VK_SUCCESS(err);
5673 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5674 ASSERT_VK_SUCCESS(err);
5675 // Correctly update descriptor to avoid "NOT_UPDATED" error
5676 VkDescriptorBufferInfo buffInfo = {};
5677 buffInfo.buffer = buffer;
5678 buffInfo.offset = 0;
5679 buffInfo.range = 1024;
5680
5681 VkWriteDescriptorSet descriptor_write;
5682 memset(&descriptor_write, 0, sizeof(descriptor_write));
5683 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5684 descriptor_write.dstSet = descriptorSet;
5685 descriptor_write.dstBinding = 0;
5686 descriptor_write.descriptorCount = 1;
5687 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5688 descriptor_write.pBufferInfo = &buffInfo;
5689
5690 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5691
5692 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005693 char const *vsSource =
5694 "#version 450\n"
5695 "\n"
5696 "out gl_PerVertex { \n"
5697 " vec4 gl_Position;\n"
5698 "};\n"
5699 "void main(){\n"
5700 " gl_Position = vec4(1);\n"
5701 "}\n";
5702 char const *fsSource =
5703 "#version 450\n"
5704 "\n"
5705 "layout(location=0) out vec4 x;\n"
5706 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5707 "void main(){\n"
5708 " x = vec4(bar.y);\n"
5709 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005710 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5711 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5712 VkPipelineObj pipe(m_device);
5713 pipe.AddShader(&vs);
5714 pipe.AddShader(&fs);
5715 pipe.AddColorAttachment();
5716 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5717
Tony Barbour552f6c02016-12-21 14:34:07 -07005718 m_commandBuffer->BeginCommandBuffer();
5719 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005720 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5721 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5722 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005723
5724 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5725 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5726
Tobin Ehlis31289162016-08-17 14:57:58 -06005727 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005728 m_commandBuffer->EndRenderPass();
5729 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005731 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5732 vkDestroyBuffer(m_device->device(), buffer, NULL);
5733 // Attempt to submit cmd buffer
5734 VkSubmitInfo submit_info = {};
5735 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5736 submit_info.commandBufferCount = 1;
5737 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5738 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5739 m_errorMonitor->VerifyFound();
5740 // Cleanup
5741 vkFreeMemory(m_device->device(), mem, NULL);
5742
5743 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5744 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5745 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5746}
5747
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005748TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005749 TEST_DESCRIPTION(
5750 "Attempt to draw with a command buffer that is invalid "
5751 "due to a bound descriptor sets with a combined image "
5752 "sampler having their image, sampler, and descriptor set "
5753 "each respectively destroyed and then attempting to "
5754 "submit associated cmd buffers. Attempt to destroy a "
5755 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005756 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005757 ASSERT_NO_FATAL_FAILURE(InitViewport());
5758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5759
5760 VkDescriptorPoolSize ds_type_count = {};
5761 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5762 ds_type_count.descriptorCount = 1;
5763
5764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5766 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005767 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005768 ds_pool_ci.maxSets = 1;
5769 ds_pool_ci.poolSizeCount = 1;
5770 ds_pool_ci.pPoolSizes = &ds_type_count;
5771
5772 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005773 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005774 ASSERT_VK_SUCCESS(err);
5775
5776 VkDescriptorSetLayoutBinding dsl_binding = {};
5777 dsl_binding.binding = 0;
5778 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5779 dsl_binding.descriptorCount = 1;
5780 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5781 dsl_binding.pImmutableSamplers = NULL;
5782
5783 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5784 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5785 ds_layout_ci.pNext = NULL;
5786 ds_layout_ci.bindingCount = 1;
5787 ds_layout_ci.pBindings = &dsl_binding;
5788 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005789 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005790 ASSERT_VK_SUCCESS(err);
5791
5792 VkDescriptorSet descriptorSet;
5793 VkDescriptorSetAllocateInfo alloc_info = {};
5794 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5795 alloc_info.descriptorSetCount = 1;
5796 alloc_info.descriptorPool = ds_pool;
5797 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005798 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005799 ASSERT_VK_SUCCESS(err);
5800
5801 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5802 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5803 pipeline_layout_ci.pNext = NULL;
5804 pipeline_layout_ci.setLayoutCount = 1;
5805 pipeline_layout_ci.pSetLayouts = &ds_layout;
5806
5807 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005808 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005809 ASSERT_VK_SUCCESS(err);
5810
5811 // Create images to update the descriptor with
5812 VkImage image;
5813 VkImage image2;
5814 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5815 const int32_t tex_width = 32;
5816 const int32_t tex_height = 32;
5817 VkImageCreateInfo image_create_info = {};
5818 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5819 image_create_info.pNext = NULL;
5820 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5821 image_create_info.format = tex_format;
5822 image_create_info.extent.width = tex_width;
5823 image_create_info.extent.height = tex_height;
5824 image_create_info.extent.depth = 1;
5825 image_create_info.mipLevels = 1;
5826 image_create_info.arrayLayers = 1;
5827 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5828 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5829 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5830 image_create_info.flags = 0;
5831 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5832 ASSERT_VK_SUCCESS(err);
5833 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5834 ASSERT_VK_SUCCESS(err);
5835
5836 VkMemoryRequirements memory_reqs;
5837 VkDeviceMemory image_memory;
5838 bool pass;
5839 VkMemoryAllocateInfo memory_info = {};
5840 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5841 memory_info.pNext = NULL;
5842 memory_info.allocationSize = 0;
5843 memory_info.memoryTypeIndex = 0;
5844 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5845 // Allocate enough memory for both images
5846 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005847 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005848 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005849 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005850 ASSERT_VK_SUCCESS(err);
5851 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5852 ASSERT_VK_SUCCESS(err);
5853 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005854 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005855 ASSERT_VK_SUCCESS(err);
5856
5857 VkImageViewCreateInfo image_view_create_info = {};
5858 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5859 image_view_create_info.image = image;
5860 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5861 image_view_create_info.format = tex_format;
5862 image_view_create_info.subresourceRange.layerCount = 1;
5863 image_view_create_info.subresourceRange.baseMipLevel = 0;
5864 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005865 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005866
5867 VkImageView view;
5868 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005869 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005870 ASSERT_VK_SUCCESS(err);
5871 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005872 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005873 ASSERT_VK_SUCCESS(err);
5874 // Create Samplers
5875 VkSamplerCreateInfo sampler_ci = {};
5876 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5877 sampler_ci.pNext = NULL;
5878 sampler_ci.magFilter = VK_FILTER_NEAREST;
5879 sampler_ci.minFilter = VK_FILTER_NEAREST;
5880 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5881 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5882 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.mipLodBias = 1.0;
5885 sampler_ci.anisotropyEnable = VK_FALSE;
5886 sampler_ci.maxAnisotropy = 1;
5887 sampler_ci.compareEnable = VK_FALSE;
5888 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5889 sampler_ci.minLod = 1.0;
5890 sampler_ci.maxLod = 1.0;
5891 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5892 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5893 VkSampler sampler;
5894 VkSampler sampler2;
5895 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5896 ASSERT_VK_SUCCESS(err);
5897 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5898 ASSERT_VK_SUCCESS(err);
5899 // Update descriptor with image and sampler
5900 VkDescriptorImageInfo img_info = {};
5901 img_info.sampler = sampler;
5902 img_info.imageView = view;
5903 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5904
5905 VkWriteDescriptorSet descriptor_write;
5906 memset(&descriptor_write, 0, sizeof(descriptor_write));
5907 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5908 descriptor_write.dstSet = descriptorSet;
5909 descriptor_write.dstBinding = 0;
5910 descriptor_write.descriptorCount = 1;
5911 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5912 descriptor_write.pImageInfo = &img_info;
5913
5914 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5915
5916 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005917 char const *vsSource =
5918 "#version 450\n"
5919 "\n"
5920 "out gl_PerVertex { \n"
5921 " vec4 gl_Position;\n"
5922 "};\n"
5923 "void main(){\n"
5924 " gl_Position = vec4(1);\n"
5925 "}\n";
5926 char const *fsSource =
5927 "#version 450\n"
5928 "\n"
5929 "layout(set=0, binding=0) uniform sampler2D s;\n"
5930 "layout(location=0) out vec4 x;\n"
5931 "void main(){\n"
5932 " x = texture(s, vec2(1));\n"
5933 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005934 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5935 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5936 VkPipelineObj pipe(m_device);
5937 pipe.AddShader(&vs);
5938 pipe.AddShader(&fs);
5939 pipe.AddColorAttachment();
5940 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5941
5942 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005944 m_commandBuffer->BeginCommandBuffer();
5945 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005946 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5947 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5948 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005949 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5950 VkRect2D scissor = {{0, 0}, {16, 16}};
5951 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5952 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005953 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005954 m_commandBuffer->EndRenderPass();
5955 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005956 // Destroy sampler invalidates the cmd buffer, causing error on submit
5957 vkDestroySampler(m_device->device(), sampler, NULL);
5958 // Attempt to submit cmd buffer
5959 VkSubmitInfo submit_info = {};
5960 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5961 submit_info.commandBufferCount = 1;
5962 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5963 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5964 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005965
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005966 // Now re-update descriptor with valid sampler and delete image
5967 img_info.sampler = sampler2;
5968 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005969
5970 VkCommandBufferBeginInfo info = {};
5971 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5972 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5973
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005975 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005976 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005977 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5978 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5979 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005980 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5981 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005982 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005983 m_commandBuffer->EndRenderPass();
5984 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005985 // Destroy image invalidates the cmd buffer, causing error on submit
5986 vkDestroyImage(m_device->device(), image, NULL);
5987 // Attempt to submit cmd buffer
5988 submit_info = {};
5989 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5990 submit_info.commandBufferCount = 1;
5991 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5992 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5993 m_errorMonitor->VerifyFound();
5994 // Now update descriptor to be valid, but then free descriptor
5995 img_info.imageView = view2;
5996 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005997 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005998 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005999 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6000 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6001 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006002 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6003 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006004 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006005 m_commandBuffer->EndRenderPass();
6006 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006008
6009 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006011 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006012 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006013
6014 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006015 // 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 -07006016 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006017 m_errorMonitor->SetUnexpectedError(
6018 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6019 "either be a valid handle or VK_NULL_HANDLE");
6020 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006021 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6022
6023 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006024 submit_info = {};
6025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6026 submit_info.commandBufferCount = 1;
6027 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6030 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006031
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006032 // Cleanup
6033 vkFreeMemory(m_device->device(), image_memory, NULL);
6034 vkDestroySampler(m_device->device(), sampler2, NULL);
6035 vkDestroyImage(m_device->device(), image2, NULL);
6036 vkDestroyImageView(m_device->device(), view, NULL);
6037 vkDestroyImageView(m_device->device(), view2, NULL);
6038 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6039 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6040 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6041}
6042
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006043TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6044 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006045 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006046 ASSERT_NO_FATAL_FAILURE(InitViewport());
6047 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6048
6049 VkDescriptorPoolSize ds_type_count = {};
6050 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6051 ds_type_count.descriptorCount = 1;
6052
6053 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6054 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6055 ds_pool_ci.pNext = NULL;
6056 ds_pool_ci.maxSets = 1;
6057 ds_pool_ci.poolSizeCount = 1;
6058 ds_pool_ci.pPoolSizes = &ds_type_count;
6059
6060 VkDescriptorPool ds_pool;
6061 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6062 ASSERT_VK_SUCCESS(err);
6063
6064 VkDescriptorSetLayoutBinding dsl_binding = {};
6065 dsl_binding.binding = 0;
6066 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6067 dsl_binding.descriptorCount = 1;
6068 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6069 dsl_binding.pImmutableSamplers = NULL;
6070
6071 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6072 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6073 ds_layout_ci.pNext = NULL;
6074 ds_layout_ci.bindingCount = 1;
6075 ds_layout_ci.pBindings = &dsl_binding;
6076 VkDescriptorSetLayout ds_layout;
6077 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6078 ASSERT_VK_SUCCESS(err);
6079
6080 VkDescriptorSet descriptor_set;
6081 VkDescriptorSetAllocateInfo alloc_info = {};
6082 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6083 alloc_info.descriptorSetCount = 1;
6084 alloc_info.descriptorPool = ds_pool;
6085 alloc_info.pSetLayouts = &ds_layout;
6086 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6087 ASSERT_VK_SUCCESS(err);
6088
6089 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6090 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6091 pipeline_layout_ci.pNext = NULL;
6092 pipeline_layout_ci.setLayoutCount = 1;
6093 pipeline_layout_ci.pSetLayouts = &ds_layout;
6094
6095 VkPipelineLayout pipeline_layout;
6096 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6097 ASSERT_VK_SUCCESS(err);
6098
6099 // Create image to update the descriptor with
6100 VkImageObj image(m_device);
6101 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6102 ASSERT_TRUE(image.initialized());
6103
6104 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6105 // Create Sampler
6106 VkSamplerCreateInfo sampler_ci = {};
6107 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6108 sampler_ci.pNext = NULL;
6109 sampler_ci.magFilter = VK_FILTER_NEAREST;
6110 sampler_ci.minFilter = VK_FILTER_NEAREST;
6111 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6112 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6113 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6114 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6115 sampler_ci.mipLodBias = 1.0;
6116 sampler_ci.anisotropyEnable = VK_FALSE;
6117 sampler_ci.maxAnisotropy = 1;
6118 sampler_ci.compareEnable = VK_FALSE;
6119 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6120 sampler_ci.minLod = 1.0;
6121 sampler_ci.maxLod = 1.0;
6122 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6123 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6124 VkSampler sampler;
6125 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6126 ASSERT_VK_SUCCESS(err);
6127 // Update descriptor with image and sampler
6128 VkDescriptorImageInfo img_info = {};
6129 img_info.sampler = sampler;
6130 img_info.imageView = view;
6131 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6132
6133 VkWriteDescriptorSet descriptor_write;
6134 memset(&descriptor_write, 0, sizeof(descriptor_write));
6135 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6136 descriptor_write.dstSet = descriptor_set;
6137 descriptor_write.dstBinding = 0;
6138 descriptor_write.descriptorCount = 1;
6139 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6140 descriptor_write.pImageInfo = &img_info;
6141
6142 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6143
6144 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006145 char const *vsSource =
6146 "#version 450\n"
6147 "\n"
6148 "out gl_PerVertex { \n"
6149 " vec4 gl_Position;\n"
6150 "};\n"
6151 "void main(){\n"
6152 " gl_Position = vec4(1);\n"
6153 "}\n";
6154 char const *fsSource =
6155 "#version 450\n"
6156 "\n"
6157 "layout(set=0, binding=0) uniform sampler2D s;\n"
6158 "layout(location=0) out vec4 x;\n"
6159 "void main(){\n"
6160 " x = texture(s, vec2(1));\n"
6161 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006162 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6163 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6164 VkPipelineObj pipe(m_device);
6165 pipe.AddShader(&vs);
6166 pipe.AddShader(&fs);
6167 pipe.AddColorAttachment();
6168 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6169
Tony Barbour552f6c02016-12-21 14:34:07 -07006170 m_commandBuffer->BeginCommandBuffer();
6171 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006172 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6173 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6174 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006175
6176 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6177 VkRect2D scissor = {{0, 0}, {16, 16}};
6178 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6179 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6180
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006181 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006182 m_commandBuffer->EndRenderPass();
6183 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006184 // Submit cmd buffer to put pool in-flight
6185 VkSubmitInfo submit_info = {};
6186 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6187 submit_info.commandBufferCount = 1;
6188 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6189 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6190 // Destroy pool while in-flight, causing error
6191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6192 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6193 m_errorMonitor->VerifyFound();
6194 vkQueueWaitIdle(m_device->m_queue);
6195 // Cleanup
6196 vkDestroySampler(m_device->device(), sampler, NULL);
6197 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6198 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006199 m_errorMonitor->SetUnexpectedError(
6200 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6201 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006202 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006203 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006204}
6205
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006206TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6207 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006208 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006209 ASSERT_NO_FATAL_FAILURE(InitViewport());
6210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6211
6212 VkDescriptorPoolSize ds_type_count = {};
6213 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6214 ds_type_count.descriptorCount = 1;
6215
6216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6218 ds_pool_ci.pNext = NULL;
6219 ds_pool_ci.maxSets = 1;
6220 ds_pool_ci.poolSizeCount = 1;
6221 ds_pool_ci.pPoolSizes = &ds_type_count;
6222
6223 VkDescriptorPool ds_pool;
6224 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6225 ASSERT_VK_SUCCESS(err);
6226
6227 VkDescriptorSetLayoutBinding dsl_binding = {};
6228 dsl_binding.binding = 0;
6229 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6230 dsl_binding.descriptorCount = 1;
6231 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6232 dsl_binding.pImmutableSamplers = NULL;
6233
6234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6236 ds_layout_ci.pNext = NULL;
6237 ds_layout_ci.bindingCount = 1;
6238 ds_layout_ci.pBindings = &dsl_binding;
6239 VkDescriptorSetLayout ds_layout;
6240 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6241 ASSERT_VK_SUCCESS(err);
6242
6243 VkDescriptorSet descriptorSet;
6244 VkDescriptorSetAllocateInfo alloc_info = {};
6245 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6246 alloc_info.descriptorSetCount = 1;
6247 alloc_info.descriptorPool = ds_pool;
6248 alloc_info.pSetLayouts = &ds_layout;
6249 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6250 ASSERT_VK_SUCCESS(err);
6251
6252 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6253 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6254 pipeline_layout_ci.pNext = NULL;
6255 pipeline_layout_ci.setLayoutCount = 1;
6256 pipeline_layout_ci.pSetLayouts = &ds_layout;
6257
6258 VkPipelineLayout pipeline_layout;
6259 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6260 ASSERT_VK_SUCCESS(err);
6261
6262 // Create images to update the descriptor with
6263 VkImage image;
6264 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6265 const int32_t tex_width = 32;
6266 const int32_t tex_height = 32;
6267 VkImageCreateInfo image_create_info = {};
6268 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6269 image_create_info.pNext = NULL;
6270 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6271 image_create_info.format = tex_format;
6272 image_create_info.extent.width = tex_width;
6273 image_create_info.extent.height = tex_height;
6274 image_create_info.extent.depth = 1;
6275 image_create_info.mipLevels = 1;
6276 image_create_info.arrayLayers = 1;
6277 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6278 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6279 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6280 image_create_info.flags = 0;
6281 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6282 ASSERT_VK_SUCCESS(err);
6283 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6284 VkMemoryRequirements memory_reqs;
6285 VkDeviceMemory image_memory;
6286 bool pass;
6287 VkMemoryAllocateInfo memory_info = {};
6288 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6289 memory_info.pNext = NULL;
6290 memory_info.allocationSize = 0;
6291 memory_info.memoryTypeIndex = 0;
6292 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6293 // Allocate enough memory for image
6294 memory_info.allocationSize = memory_reqs.size;
6295 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6296 ASSERT_TRUE(pass);
6297 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6298 ASSERT_VK_SUCCESS(err);
6299 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6300 ASSERT_VK_SUCCESS(err);
6301
6302 VkImageViewCreateInfo image_view_create_info = {};
6303 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6304 image_view_create_info.image = image;
6305 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6306 image_view_create_info.format = tex_format;
6307 image_view_create_info.subresourceRange.layerCount = 1;
6308 image_view_create_info.subresourceRange.baseMipLevel = 0;
6309 image_view_create_info.subresourceRange.levelCount = 1;
6310 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6311
6312 VkImageView view;
6313 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6314 ASSERT_VK_SUCCESS(err);
6315 // Create Samplers
6316 VkSamplerCreateInfo sampler_ci = {};
6317 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6318 sampler_ci.pNext = NULL;
6319 sampler_ci.magFilter = VK_FILTER_NEAREST;
6320 sampler_ci.minFilter = VK_FILTER_NEAREST;
6321 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6322 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6323 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6324 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6325 sampler_ci.mipLodBias = 1.0;
6326 sampler_ci.anisotropyEnable = VK_FALSE;
6327 sampler_ci.maxAnisotropy = 1;
6328 sampler_ci.compareEnable = VK_FALSE;
6329 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6330 sampler_ci.minLod = 1.0;
6331 sampler_ci.maxLod = 1.0;
6332 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6333 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6334 VkSampler sampler;
6335 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6336 ASSERT_VK_SUCCESS(err);
6337 // Update descriptor with image and sampler
6338 VkDescriptorImageInfo img_info = {};
6339 img_info.sampler = sampler;
6340 img_info.imageView = view;
6341 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6342
6343 VkWriteDescriptorSet descriptor_write;
6344 memset(&descriptor_write, 0, sizeof(descriptor_write));
6345 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6346 descriptor_write.dstSet = descriptorSet;
6347 descriptor_write.dstBinding = 0;
6348 descriptor_write.descriptorCount = 1;
6349 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6350 descriptor_write.pImageInfo = &img_info;
6351 // Break memory binding and attempt update
6352 vkFreeMemory(m_device->device(), image_memory, nullptr);
6353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006354 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6356 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6357 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6358 m_errorMonitor->VerifyFound();
6359 // Cleanup
6360 vkDestroyImage(m_device->device(), image, NULL);
6361 vkDestroySampler(m_device->device(), sampler, NULL);
6362 vkDestroyImageView(m_device->device(), view, NULL);
6363 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6364 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6365 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6366}
6367
Karl Schultz6addd812016-02-02 17:17:23 -07006368TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006369 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6370 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006371 // Create a valid cmd buffer
6372 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006373 uint64_t fake_pipeline_handle = 0xbaad6001;
6374 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006375 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6377
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006379 m_commandBuffer->BeginCommandBuffer();
6380 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006381 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006382 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006383
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006384 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006385 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 -06006386 Draw(1, 0, 0, 0);
6387 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006388
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006389 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006390 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 -07006391 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006392 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6393 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006394}
6395
Karl Schultz6addd812016-02-02 17:17:23 -07006396TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006397 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006398 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006399
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006401
Tony Barbour1fa09702017-03-16 12:09:08 -06006402 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006403 ASSERT_NO_FATAL_FAILURE(InitViewport());
6404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006405 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006406 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6407 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006408
6409 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006410 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6411 ds_pool_ci.pNext = NULL;
6412 ds_pool_ci.maxSets = 1;
6413 ds_pool_ci.poolSizeCount = 1;
6414 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006415
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006416 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006417 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006418 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006419
Tony Barboureb254902015-07-15 12:50:33 -06006420 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006421 dsl_binding.binding = 0;
6422 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6423 dsl_binding.descriptorCount = 1;
6424 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6425 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006426
Tony Barboureb254902015-07-15 12:50:33 -06006427 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006428 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6429 ds_layout_ci.pNext = NULL;
6430 ds_layout_ci.bindingCount = 1;
6431 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006432 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006433 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006434 ASSERT_VK_SUCCESS(err);
6435
6436 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006437 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006438 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006439 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006440 alloc_info.descriptorPool = ds_pool;
6441 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006442 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006443 ASSERT_VK_SUCCESS(err);
6444
Tony Barboureb254902015-07-15 12:50:33 -06006445 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006446 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6447 pipeline_layout_ci.pNext = NULL;
6448 pipeline_layout_ci.setLayoutCount = 1;
6449 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006450
6451 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006452 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006453 ASSERT_VK_SUCCESS(err);
6454
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006455 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006456 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006457 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006458 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006459
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006460 VkPipelineObj pipe(m_device);
6461 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006462 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006463 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006464 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006465
Tony Barbour552f6c02016-12-21 14:34:07 -07006466 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006467 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6468 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6469 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006470
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006471 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006472
Chia-I Wuf7458c52015-10-26 21:10:41 +08006473 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6474 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6475 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006476}
6477
Karl Schultz6addd812016-02-02 17:17:23 -07006478TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006479 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006480 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006481
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006483
Tony Barbour1fa09702017-03-16 12:09:08 -06006484 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006485 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006486 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6487 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006488
6489 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006490 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6491 ds_pool_ci.pNext = NULL;
6492 ds_pool_ci.maxSets = 1;
6493 ds_pool_ci.poolSizeCount = 1;
6494 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006495
6496 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006497 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006498 ASSERT_VK_SUCCESS(err);
6499
6500 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006501 dsl_binding.binding = 0;
6502 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6503 dsl_binding.descriptorCount = 1;
6504 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6505 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006506
6507 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006508 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6509 ds_layout_ci.pNext = NULL;
6510 ds_layout_ci.bindingCount = 1;
6511 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006512 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006513 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006514 ASSERT_VK_SUCCESS(err);
6515
6516 VkDescriptorSet descriptorSet;
6517 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006518 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006519 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006520 alloc_info.descriptorPool = ds_pool;
6521 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006522 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006523 ASSERT_VK_SUCCESS(err);
6524
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006525 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006526 VkWriteDescriptorSet descriptor_write;
6527 memset(&descriptor_write, 0, sizeof(descriptor_write));
6528 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6529 descriptor_write.dstSet = descriptorSet;
6530 descriptor_write.dstBinding = 0;
6531 descriptor_write.descriptorCount = 1;
6532 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6533 descriptor_write.pTexelBufferView = &view;
6534
6535 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006537 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006538
6539 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6540 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6541}
6542
Mark Youngd339ba32016-05-30 13:28:35 -06006543TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006544 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 -06006545
6546 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006548 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006549
Tony Barbour1fa09702017-03-16 12:09:08 -06006550 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006551
6552 // Create a buffer with no bound memory and then attempt to create
6553 // a buffer view.
6554 VkBufferCreateInfo buff_ci = {};
6555 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006556 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006557 buff_ci.size = 256;
6558 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6559 VkBuffer buffer;
6560 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6561 ASSERT_VK_SUCCESS(err);
6562
6563 VkBufferViewCreateInfo buff_view_ci = {};
6564 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6565 buff_view_ci.buffer = buffer;
6566 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6567 buff_view_ci.range = VK_WHOLE_SIZE;
6568 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006569 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006570
6571 m_errorMonitor->VerifyFound();
6572 vkDestroyBuffer(m_device->device(), buffer, NULL);
6573 // If last error is success, it still created the view, so delete it.
6574 if (err == VK_SUCCESS) {
6575 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6576 }
6577}
6578
Karl Schultz6addd812016-02-02 17:17:23 -07006579TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6580 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6581 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006582 // 1. No dynamicOffset supplied
6583 // 2. Too many dynamicOffsets supplied
6584 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006585 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6587 " requires 1 dynamicOffsets, but only "
6588 "0 dynamicOffsets are left in "
6589 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006590
Tony Barbour1fa09702017-03-16 12:09:08 -06006591 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006592 ASSERT_NO_FATAL_FAILURE(InitViewport());
6593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6594
6595 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006596 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6597 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006598
6599 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006600 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6601 ds_pool_ci.pNext = NULL;
6602 ds_pool_ci.maxSets = 1;
6603 ds_pool_ci.poolSizeCount = 1;
6604 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006605
6606 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006607 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006608 ASSERT_VK_SUCCESS(err);
6609
6610 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006611 dsl_binding.binding = 0;
6612 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6613 dsl_binding.descriptorCount = 1;
6614 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6615 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006616
6617 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006618 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6619 ds_layout_ci.pNext = NULL;
6620 ds_layout_ci.bindingCount = 1;
6621 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006622 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006624 ASSERT_VK_SUCCESS(err);
6625
6626 VkDescriptorSet descriptorSet;
6627 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006628 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006629 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006630 alloc_info.descriptorPool = ds_pool;
6631 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006632 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006633 ASSERT_VK_SUCCESS(err);
6634
6635 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006636 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6637 pipeline_layout_ci.pNext = NULL;
6638 pipeline_layout_ci.setLayoutCount = 1;
6639 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006640
6641 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006642 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006643 ASSERT_VK_SUCCESS(err);
6644
6645 // Create a buffer to update the descriptor with
6646 uint32_t qfi = 0;
6647 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006648 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6649 buffCI.size = 1024;
6650 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6651 buffCI.queueFamilyIndexCount = 1;
6652 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006653
6654 VkBuffer dyub;
6655 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6656 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006657 // Allocate memory and bind to buffer so we can make it to the appropriate
6658 // error
6659 VkMemoryAllocateInfo mem_alloc = {};
6660 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6661 mem_alloc.pNext = NULL;
6662 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006663 mem_alloc.memoryTypeIndex = 0;
6664
6665 VkMemoryRequirements memReqs;
6666 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006667 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006668 if (!pass) {
6669 vkDestroyBuffer(m_device->device(), dyub, NULL);
6670 return;
6671 }
6672
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006673 VkDeviceMemory mem;
6674 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6675 ASSERT_VK_SUCCESS(err);
6676 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6677 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006678 // Correctly update descriptor to avoid "NOT_UPDATED" error
6679 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006680 buffInfo.buffer = dyub;
6681 buffInfo.offset = 0;
6682 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006683
6684 VkWriteDescriptorSet descriptor_write;
6685 memset(&descriptor_write, 0, sizeof(descriptor_write));
6686 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6687 descriptor_write.dstSet = descriptorSet;
6688 descriptor_write.dstBinding = 0;
6689 descriptor_write.descriptorCount = 1;
6690 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6691 descriptor_write.pBufferInfo = &buffInfo;
6692
6693 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6694
Tony Barbour552f6c02016-12-21 14:34:07 -07006695 m_commandBuffer->BeginCommandBuffer();
6696 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006697 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6698 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006699 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006700 uint32_t pDynOff[2] = {512, 756};
6701 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6703 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6704 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6705 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006706 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006707 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6709 " dynamic offset 512 combined with "
6710 "offset 0 and range 1024 that "
6711 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006712 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006713 char const *vsSource =
6714 "#version 450\n"
6715 "\n"
6716 "out gl_PerVertex { \n"
6717 " vec4 gl_Position;\n"
6718 "};\n"
6719 "void main(){\n"
6720 " gl_Position = vec4(1);\n"
6721 "}\n";
6722 char const *fsSource =
6723 "#version 450\n"
6724 "\n"
6725 "layout(location=0) out vec4 x;\n"
6726 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6727 "void main(){\n"
6728 " x = vec4(bar.y);\n"
6729 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006730 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6731 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6732 VkPipelineObj pipe(m_device);
6733 pipe.AddShader(&vs);
6734 pipe.AddShader(&fs);
6735 pipe.AddColorAttachment();
6736 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6737
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006738 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6739 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6740 VkRect2D scissor = {{0, 0}, {16, 16}};
6741 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6742
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006743 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006744 // This update should succeed, but offset size of 512 will overstep buffer
6745 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006746 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6747 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006748 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006749 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006750
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006751 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006752 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006753
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006754 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006755 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6757}
6758
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006759TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006760 TEST_DESCRIPTION(
6761 "Attempt to update a descriptor with a non-sparse buffer "
6762 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006763 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006765 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6767 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006768
Tony Barbour1fa09702017-03-16 12:09:08 -06006769 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006770 ASSERT_NO_FATAL_FAILURE(InitViewport());
6771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6772
6773 VkDescriptorPoolSize ds_type_count = {};
6774 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6775 ds_type_count.descriptorCount = 1;
6776
6777 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6778 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6779 ds_pool_ci.pNext = NULL;
6780 ds_pool_ci.maxSets = 1;
6781 ds_pool_ci.poolSizeCount = 1;
6782 ds_pool_ci.pPoolSizes = &ds_type_count;
6783
6784 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006785 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006786 ASSERT_VK_SUCCESS(err);
6787
6788 VkDescriptorSetLayoutBinding dsl_binding = {};
6789 dsl_binding.binding = 0;
6790 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6791 dsl_binding.descriptorCount = 1;
6792 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6793 dsl_binding.pImmutableSamplers = NULL;
6794
6795 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6796 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6797 ds_layout_ci.pNext = NULL;
6798 ds_layout_ci.bindingCount = 1;
6799 ds_layout_ci.pBindings = &dsl_binding;
6800 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006802 ASSERT_VK_SUCCESS(err);
6803
6804 VkDescriptorSet descriptorSet;
6805 VkDescriptorSetAllocateInfo alloc_info = {};
6806 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6807 alloc_info.descriptorSetCount = 1;
6808 alloc_info.descriptorPool = ds_pool;
6809 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006811 ASSERT_VK_SUCCESS(err);
6812
6813 // Create a buffer to update the descriptor with
6814 uint32_t qfi = 0;
6815 VkBufferCreateInfo buffCI = {};
6816 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6817 buffCI.size = 1024;
6818 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6819 buffCI.queueFamilyIndexCount = 1;
6820 buffCI.pQueueFamilyIndices = &qfi;
6821
6822 VkBuffer dyub;
6823 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6824 ASSERT_VK_SUCCESS(err);
6825
6826 // Attempt to update descriptor without binding memory to it
6827 VkDescriptorBufferInfo buffInfo = {};
6828 buffInfo.buffer = dyub;
6829 buffInfo.offset = 0;
6830 buffInfo.range = 1024;
6831
6832 VkWriteDescriptorSet descriptor_write;
6833 memset(&descriptor_write, 0, sizeof(descriptor_write));
6834 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6835 descriptor_write.dstSet = descriptorSet;
6836 descriptor_write.dstBinding = 0;
6837 descriptor_write.descriptorCount = 1;
6838 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6839 descriptor_write.pBufferInfo = &buffInfo;
6840
6841 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6842 m_errorMonitor->VerifyFound();
6843
6844 vkDestroyBuffer(m_device->device(), dyub, NULL);
6845 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6846 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6847}
6848
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006849TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006850 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006851 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006852 ASSERT_NO_FATAL_FAILURE(InitViewport());
6853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6854
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006855 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006856 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006857 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6858 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6859 pipeline_layout_ci.pushConstantRangeCount = 1;
6860 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6861
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006862 //
6863 // Check for invalid push constant ranges in pipeline layouts.
6864 //
6865 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006866 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006867 char const *msg;
6868 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006869
Karl Schultzc81037d2016-05-12 08:11:23 -06006870 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6871 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6872 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6873 "vkCreatePipelineLayout() call has push constants index 0 with "
6874 "size 0."},
6875 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6876 "vkCreatePipelineLayout() call has push constants index 0 with "
6877 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006878 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006879 "vkCreatePipelineLayout() call has push constants index 0 with "
6880 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006881 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006882 "vkCreatePipelineLayout() call has push constants index 0 with "
6883 "size 0."},
6884 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6885 "vkCreatePipelineLayout() call has push constants index 0 with "
6886 "offset 1. Offset must"},
6887 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6888 "vkCreatePipelineLayout() call has push constants index 0 "
6889 "with offset "},
6890 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6891 "vkCreatePipelineLayout() call has push constants "
6892 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006893 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006894 "vkCreatePipelineLayout() call has push constants index 0 "
6895 "with offset "},
6896 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6897 "vkCreatePipelineLayout() call has push "
6898 "constants index 0 with offset "},
6899 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6900 "vkCreatePipelineLayout() call has push "
6901 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006902 }};
6903
6904 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006905 for (const auto &iter : range_tests) {
6906 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6908 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006909 m_errorMonitor->VerifyFound();
6910 if (VK_SUCCESS == err) {
6911 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6912 }
6913 }
6914
6915 // Check for invalid stage flag
6916 pc_range.offset = 0;
6917 pc_range.size = 16;
6918 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006919 m_errorMonitor->SetDesiredFailureMsg(
6920 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6921 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006922 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006923 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006924 if (VK_SUCCESS == err) {
6925 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6926 }
6927
Karl Schultzc59b72d2017-02-24 15:45:05 -07006928 // Check for duplicate stage flags in a list of push constant ranges.
6929 // A shader can only have one push constant block and that block is mapped
6930 // to the push constant range that has that shader's stage flag set.
6931 // The shader's stage flag can only appear once in all the ranges, so the
6932 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006933 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006934 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006935 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006936 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006937 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006938 // Overlapping ranges are OK, but a stage flag can appear only once.
6939 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6940 {
6941 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6942 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6943 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6944 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006945 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006946 {
6947 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6948 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6949 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6950 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6951 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6952 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6953 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6954 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6955 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6956 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6957 }},
6958 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6959 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6960 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6961 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6962 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6963 {
6964 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6966 }},
6967 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6968 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6969 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6970 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6971 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6972 {
6973 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6974 }},
6975 },
6976 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006977
Karl Schultzc59b72d2017-02-24 15:45:05 -07006978 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006979 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006980 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006983 m_errorMonitor->VerifyFound();
6984 if (VK_SUCCESS == err) {
6985 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6986 }
6987 }
6988
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006989 //
6990 // CmdPushConstants tests
6991 //
6992
Karl Schultzc59b72d2017-02-24 15:45:05 -07006993 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006994 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07006995 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006996 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006997 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006998 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006999 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007000 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007001
7002 const uint8_t dummy_values[100] = {};
7003
7004 m_commandBuffer->BeginCommandBuffer();
7005 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007006
7007 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007008 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007010 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007011 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007012
Karl Schultzc59b72d2017-02-24 15:45:05 -07007013 m_errorMonitor->ExpectSuccess();
7014 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7015 m_errorMonitor->VerifyNotFound();
7016 m_errorMonitor->ExpectSuccess();
7017 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7018 m_errorMonitor->VerifyNotFound();
7019 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7020 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7021 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7022 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7023 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7024 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7025 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007026 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007027 for (const auto &iter : cmd_range_tests) {
7028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7029 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7030 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007031 m_errorMonitor->VerifyFound();
7032 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007033
Tony Barbour552f6c02016-12-21 14:34:07 -07007034 m_commandBuffer->EndRenderPass();
7035 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007036 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007037}
7038
Karl Schultz6addd812016-02-02 17:17:23 -07007039TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007040 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007041 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007042
Tony Barbour1fa09702017-03-16 12:09:08 -06007043 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007044 ASSERT_NO_FATAL_FAILURE(InitViewport());
7045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7046
7047 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7048 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007049 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7050 ds_type_count[0].descriptorCount = 10;
7051 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7052 ds_type_count[1].descriptorCount = 2;
7053 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7054 ds_type_count[2].descriptorCount = 2;
7055 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7056 ds_type_count[3].descriptorCount = 5;
7057 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7058 // type
7059 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7060 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7061 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007062
7063 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007064 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7065 ds_pool_ci.pNext = NULL;
7066 ds_pool_ci.maxSets = 5;
7067 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7068 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007069
7070 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007071 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007072 ASSERT_VK_SUCCESS(err);
7073
7074 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7075 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007076 dsl_binding[0].binding = 0;
7077 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7078 dsl_binding[0].descriptorCount = 5;
7079 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7080 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007081
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007082 // Create layout identical to set0 layout but w/ different stageFlags
7083 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007084 dsl_fs_stage_only.binding = 0;
7085 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7086 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007087 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7088 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007089 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7092 ds_layout_ci.pNext = NULL;
7093 ds_layout_ci.bindingCount = 1;
7094 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007095 static const uint32_t NUM_LAYOUTS = 4;
7096 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007097 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007098 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7099 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007100 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007101 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007102 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007103 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007104 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007105 dsl_binding[0].binding = 0;
7106 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007107 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007108 dsl_binding[1].binding = 1;
7109 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7110 dsl_binding[1].descriptorCount = 2;
7111 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7112 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007113 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007114 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007116 ASSERT_VK_SUCCESS(err);
7117 dsl_binding[0].binding = 0;
7118 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007119 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007120 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007122 ASSERT_VK_SUCCESS(err);
7123 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007124 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007125 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007126 ASSERT_VK_SUCCESS(err);
7127
7128 static const uint32_t NUM_SETS = 4;
7129 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7130 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007131 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007132 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007133 alloc_info.descriptorPool = ds_pool;
7134 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007135 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007136 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007137 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007138 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007139 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007140 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007141 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007142
7143 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007144 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7145 pipeline_layout_ci.pNext = NULL;
7146 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7147 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007148
7149 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007150 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007151 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007152 // Create pipelineLayout with only one setLayout
7153 pipeline_layout_ci.setLayoutCount = 1;
7154 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007155 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007156 ASSERT_VK_SUCCESS(err);
7157 // Create pipelineLayout with 2 descriptor setLayout at index 0
7158 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7159 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007160 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007161 ASSERT_VK_SUCCESS(err);
7162 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7163 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7164 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007165 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007166 ASSERT_VK_SUCCESS(err);
7167 // Create pipelineLayout with UB type, but stageFlags for FS only
7168 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7169 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007170 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007171 ASSERT_VK_SUCCESS(err);
7172 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7173 VkDescriptorSetLayout pl_bad_s0[2] = {};
7174 pl_bad_s0[0] = ds_layout_fs_only;
7175 pl_bad_s0[1] = ds_layout[1];
7176 pipeline_layout_ci.setLayoutCount = 2;
7177 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7178 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007179 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007180 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007181
Tobin Ehlis88452832015-12-03 09:40:56 -07007182 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007183 char const *vsSource =
7184 "#version 450\n"
7185 "\n"
7186 "out gl_PerVertex {\n"
7187 " vec4 gl_Position;\n"
7188 "};\n"
7189 "void main(){\n"
7190 " gl_Position = vec4(1);\n"
7191 "}\n";
7192 char const *fsSource =
7193 "#version 450\n"
7194 "\n"
7195 "layout(location=0) out vec4 x;\n"
7196 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7197 "void main(){\n"
7198 " x = vec4(bar.y);\n"
7199 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007200 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7201 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007202 VkPipelineObj pipe(m_device);
7203 pipe.AddShader(&vs);
7204 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007205 pipe.AddColorAttachment();
7206 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007207
Tony Barbour552f6c02016-12-21 14:34:07 -07007208 m_commandBuffer->BeginCommandBuffer();
7209 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007210
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007211 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007212 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7213 // of PSO
7214 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7215 // cmd_pipeline.c
7216 // due to the fact that cmd_alloc_dset_data() has not been called in
7217 // cmd_bind_graphics_pipeline()
7218 // TODO : Want to cause various binding incompatibility issues here to test
7219 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007220 // First cause various verify_layout_compatibility() fails
7221 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007222 // verify_set_layout_compatibility fail cases:
7223 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007225 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7226 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007227 m_errorMonitor->VerifyFound();
7228
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007229 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7231 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7232 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007233 m_errorMonitor->VerifyFound();
7234
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007235 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007236 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7237 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7239 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7240 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007241 m_errorMonitor->VerifyFound();
7242
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007243 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7244 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7246 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7247 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007248 m_errorMonitor->VerifyFound();
7249
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007250 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7251 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7253 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7254 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7255 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007256 m_errorMonitor->VerifyFound();
7257
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007258 // Cause INFO messages due to disturbing previously bound Sets
7259 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007260 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7261 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007262 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7264 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7265 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007266 m_errorMonitor->VerifyFound();
7267
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007268 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7269 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007270 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7272 " newly bound as set #0 so set #1 and "
7273 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007274 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7275 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007276 m_errorMonitor->VerifyFound();
7277
Tobin Ehlis10fad692016-07-07 12:00:36 -06007278 // Now that we're done actively using the pipelineLayout that gfx pipeline
7279 // was created with, we should be able to delete it. Do that now to verify
7280 // that validation obeys pipelineLayout lifetime
7281 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7282
Tobin Ehlis88452832015-12-03 09:40:56 -07007283 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007284 // 1. Error due to not binding required set (we actually use same code as
7285 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007286 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7287 &descriptorSet[0], 0, NULL);
7288 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7289 &descriptorSet[1], 0, NULL);
7290 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 -07007291
7292 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7293 VkRect2D scissor = {{0, 0}, {16, 16}};
7294 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7295 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7296
Tobin Ehlis88452832015-12-03 09:40:56 -07007297 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007298 m_errorMonitor->VerifyFound();
7299
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007300 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007301 // 2. Error due to bound set not being compatible with PSO's
7302 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007303 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7304 &descriptorSet[0], 0, NULL);
7305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007306 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007307 m_errorMonitor->VerifyFound();
7308
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007309 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007310 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007311 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7312 }
7313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007314 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7315 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7316}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007317
Karl Schultz6addd812016-02-02 17:17:23 -07007318TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7320 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007321
Tony Barbour1fa09702017-03-16 12:09:08 -06007322 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007323 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007324 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007325 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007326
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007327 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007328}
7329
Karl Schultz6addd812016-02-02 17:17:23 -07007330TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7331 VkResult err;
7332 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007333
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007335
Tony Barbour1fa09702017-03-16 12:09:08 -06007336 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007337
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007338 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007339 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007340 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007341 cmd.commandPool = m_commandPool;
7342 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007343 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007344
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007345 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007346 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007347
7348 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007349 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007350 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7351
7352 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007353 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007354 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007355 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 -07007356 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007357
7358 // The error should be caught by validation of the BeginCommandBuffer call
7359 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7360
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007361 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007362 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007363}
7364
Karl Schultz6addd812016-02-02 17:17:23 -07007365TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007366 // Cause error due to Begin while recording CB
7367 // Then cause 2 errors for attempting to reset CB w/o having
7368 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7369 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007371
Tony Barbour1fa09702017-03-16 12:09:08 -06007372 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007373
7374 // Calls AllocateCommandBuffers
7375 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7376
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007377 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007378 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007379 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7380 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007381 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7382 cmd_buf_info.pNext = NULL;
7383 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007384 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007385
7386 // Begin CB to transition to recording state
7387 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7388 // Can't re-begin. This should trigger error
7389 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007390 m_errorMonitor->VerifyFound();
7391
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007393 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007394 // Reset attempt will trigger error due to incorrect CommandPool state
7395 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007396 m_errorMonitor->VerifyFound();
7397
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007399 // Transition CB to RECORDED state
7400 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7401 // Now attempting to Begin will implicitly reset, which triggers error
7402 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007403 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007404}
7405
Karl Schultz6addd812016-02-02 17:17:23 -07007406TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007407 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007408 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007409
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7411 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007412
Tony Barbour1fa09702017-03-16 12:09:08 -06007413 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007415
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007416 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007417 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7418 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007419
7420 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007421 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7422 ds_pool_ci.pNext = NULL;
7423 ds_pool_ci.maxSets = 1;
7424 ds_pool_ci.poolSizeCount = 1;
7425 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007426
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007427 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007428 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007429 ASSERT_VK_SUCCESS(err);
7430
Tony Barboureb254902015-07-15 12:50:33 -06007431 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007432 dsl_binding.binding = 0;
7433 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7434 dsl_binding.descriptorCount = 1;
7435 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7436 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007437
Tony Barboureb254902015-07-15 12:50:33 -06007438 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007439 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7440 ds_layout_ci.pNext = NULL;
7441 ds_layout_ci.bindingCount = 1;
7442 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007443
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007444 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007445 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007446 ASSERT_VK_SUCCESS(err);
7447
7448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007451 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007452 alloc_info.descriptorPool = ds_pool;
7453 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007455 ASSERT_VK_SUCCESS(err);
7456
Tony Barboureb254902015-07-15 12:50:33 -06007457 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007458 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7459 pipeline_layout_ci.setLayoutCount = 1;
7460 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007461
7462 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007463 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007464 ASSERT_VK_SUCCESS(err);
7465
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007466 VkViewport vp = {}; // Just need dummy vp to point to
7467 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007468
7469 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007470 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7471 vp_state_ci.scissorCount = 1;
7472 vp_state_ci.pScissors = &sc;
7473 vp_state_ci.viewportCount = 1;
7474 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007475
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007476 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7477 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7478 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7479 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7480 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7481 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007482 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007483 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007484 rs_state_ci.lineWidth = 1.0f;
7485
7486 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7487 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7488 vi_ci.pNext = nullptr;
7489 vi_ci.vertexBindingDescriptionCount = 0;
7490 vi_ci.pVertexBindingDescriptions = nullptr;
7491 vi_ci.vertexAttributeDescriptionCount = 0;
7492 vi_ci.pVertexAttributeDescriptions = nullptr;
7493
7494 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7495 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7496 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7497
7498 VkPipelineShaderStageCreateInfo shaderStages[2];
7499 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7500
7501 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7502 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007503 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007504 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007505
Tony Barboureb254902015-07-15 12:50:33 -06007506 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007507 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7508 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007509 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007510 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7511 gp_ci.layout = pipeline_layout;
7512 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007513 gp_ci.pVertexInputState = &vi_ci;
7514 gp_ci.pInputAssemblyState = &ia_ci;
7515
7516 gp_ci.stageCount = 1;
7517 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007518
7519 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007520 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7521 pc_ci.initialDataSize = 0;
7522 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007523
7524 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007525 VkPipelineCache pipelineCache;
7526
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007527 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007528 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007529 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007530 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007531
Chia-I Wuf7458c52015-10-26 21:10:41 +08007532 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7533 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7535 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007536}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007537
Tobin Ehlis912df022015-09-17 08:46:18 -06007538/*// TODO : This test should be good, but needs Tess support in compiler to run
7539TEST_F(VkLayerTest, InvalidPatchControlPoints)
7540{
7541 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007542 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007543
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007545 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7546primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007547
Tony Barbour1fa09702017-03-16 12:09:08 -06007548 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007550
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007551 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007552 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007553 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007554
7555 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7556 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7557 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007558 ds_pool_ci.poolSizeCount = 1;
7559 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007560
7561 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007562 err = vkCreateDescriptorPool(m_device->device(),
7563VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007564 ASSERT_VK_SUCCESS(err);
7565
7566 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007567 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007568 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007569 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007570 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7571 dsl_binding.pImmutableSamplers = NULL;
7572
7573 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007574 ds_layout_ci.sType =
7575VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007576 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007577 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007578 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007579
7580 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007581 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7582&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007583 ASSERT_VK_SUCCESS(err);
7584
7585 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007586 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7587VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007588 ASSERT_VK_SUCCESS(err);
7589
7590 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007591 pipeline_layout_ci.sType =
7592VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007593 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007594 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007595 pipeline_layout_ci.pSetLayouts = &ds_layout;
7596
7597 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007598 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7599&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007600 ASSERT_VK_SUCCESS(err);
7601
7602 VkPipelineShaderStageCreateInfo shaderStages[3];
7603 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7604
Karl Schultz6addd812016-02-02 17:17:23 -07007605 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7606this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007607 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007608 VkShaderObj
7609tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7610this);
7611 VkShaderObj
7612te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7613this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007614
Karl Schultz6addd812016-02-02 17:17:23 -07007615 shaderStages[0].sType =
7616VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007617 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007618 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007619 shaderStages[1].sType =
7620VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007621 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007622 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007623 shaderStages[2].sType =
7624VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007625 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007626 shaderStages[2].shader = te.handle();
7627
7628 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007629 iaCI.sType =
7630VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007631 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007632
7633 VkPipelineTessellationStateCreateInfo tsCI = {};
7634 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7635 tsCI.patchControlPoints = 0; // This will cause an error
7636
7637 VkGraphicsPipelineCreateInfo gp_ci = {};
7638 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7639 gp_ci.pNext = NULL;
7640 gp_ci.stageCount = 3;
7641 gp_ci.pStages = shaderStages;
7642 gp_ci.pVertexInputState = NULL;
7643 gp_ci.pInputAssemblyState = &iaCI;
7644 gp_ci.pTessellationState = &tsCI;
7645 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007646 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007647 gp_ci.pMultisampleState = NULL;
7648 gp_ci.pDepthStencilState = NULL;
7649 gp_ci.pColorBlendState = NULL;
7650 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7651 gp_ci.layout = pipeline_layout;
7652 gp_ci.renderPass = renderPass();
7653
7654 VkPipelineCacheCreateInfo pc_ci = {};
7655 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7656 pc_ci.pNext = NULL;
7657 pc_ci.initialSize = 0;
7658 pc_ci.initialData = 0;
7659 pc_ci.maxSize = 0;
7660
7661 VkPipeline pipeline;
7662 VkPipelineCache pipelineCache;
7663
Karl Schultz6addd812016-02-02 17:17:23 -07007664 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7665&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007666 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007667 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7668&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007670 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007671
Chia-I Wuf7458c52015-10-26 21:10:41 +08007672 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7673 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7674 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7675 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007676}
7677*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007678
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007679TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007680 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007681
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007682 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007683
Tony Barbour1fa09702017-03-16 12:09:08 -06007684 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007686
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007687 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007688 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7689 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007690
7691 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007692 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7693 ds_pool_ci.maxSets = 1;
7694 ds_pool_ci.poolSizeCount = 1;
7695 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007696
7697 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007698 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007699 ASSERT_VK_SUCCESS(err);
7700
7701 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007702 dsl_binding.binding = 0;
7703 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7704 dsl_binding.descriptorCount = 1;
7705 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007706
7707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7709 ds_layout_ci.bindingCount = 1;
7710 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007711
7712 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007713 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007714 ASSERT_VK_SUCCESS(err);
7715
7716 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007717 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007718 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007719 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007720 alloc_info.descriptorPool = ds_pool;
7721 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007722 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007723 ASSERT_VK_SUCCESS(err);
7724
7725 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007726 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7727 pipeline_layout_ci.setLayoutCount = 1;
7728 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007729
7730 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007731 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007732 ASSERT_VK_SUCCESS(err);
7733
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007734 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007735 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007736 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007737 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007738 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007739 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007740
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007741 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7742 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7743 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7744 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7745 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7746 rs_state_ci.depthClampEnable = VK_FALSE;
7747 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7748 rs_state_ci.depthBiasEnable = VK_FALSE;
7749
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007750 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7751 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7752 vi_ci.pNext = nullptr;
7753 vi_ci.vertexBindingDescriptionCount = 0;
7754 vi_ci.pVertexBindingDescriptions = nullptr;
7755 vi_ci.vertexAttributeDescriptionCount = 0;
7756 vi_ci.pVertexAttributeDescriptions = nullptr;
7757
7758 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7759 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7760 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7761
7762 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7763 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7764 pipe_ms_state_ci.pNext = NULL;
7765 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7766 pipe_ms_state_ci.sampleShadingEnable = 0;
7767 pipe_ms_state_ci.minSampleShading = 1.0;
7768 pipe_ms_state_ci.pSampleMask = NULL;
7769
Cody Northropeb3a6c12015-10-05 14:44:45 -06007770 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007771 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007772
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007773 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007774 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007775 shaderStages[0] = vs.GetStageCreateInfo();
7776 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007777
7778 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007779 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7780 gp_ci.stageCount = 2;
7781 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007782 gp_ci.pVertexInputState = &vi_ci;
7783 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007784 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007785 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007786 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007787 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7788 gp_ci.layout = pipeline_layout;
7789 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007790
7791 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007792 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007793
7794 VkPipeline pipeline;
7795 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007796 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007797 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007798
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007799 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007800 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007801
7802 // Check case where multiViewport is disabled and viewport count is not 1
7803 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7806 vp_state_ci.scissorCount = 0;
7807 vp_state_ci.viewportCount = 0;
7808 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7809 m_errorMonitor->VerifyFound();
7810 } else {
7811 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007812 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007813 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007814 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007815
7816 // Check is that viewportcount and scissorcount match
7817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7818 vp_state_ci.scissorCount = 1;
7819 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7820 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7821 m_errorMonitor->VerifyFound();
7822
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007823 // Check case where multiViewport is enabled and viewport count is greater than max
7824 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7827 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7828 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7829 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7830 m_errorMonitor->VerifyFound();
7831 }
7832 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007833
Chia-I Wuf7458c52015-10-26 21:10:41 +08007834 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7835 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7836 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7837 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007838}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007839
7840// 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
7841// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007842TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007843 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007844
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007845 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7846
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007848
Tony Barbour1fa09702017-03-16 12:09:08 -06007849 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007851
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007852 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007853 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7854 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007855
7856 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007857 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7858 ds_pool_ci.maxSets = 1;
7859 ds_pool_ci.poolSizeCount = 1;
7860 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007861
7862 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007863 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007864 ASSERT_VK_SUCCESS(err);
7865
7866 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007867 dsl_binding.binding = 0;
7868 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7869 dsl_binding.descriptorCount = 1;
7870 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007871
7872 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007873 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7874 ds_layout_ci.bindingCount = 1;
7875 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007876
7877 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007878 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007879 ASSERT_VK_SUCCESS(err);
7880
7881 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007882 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007883 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007884 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007885 alloc_info.descriptorPool = ds_pool;
7886 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007887 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007888 ASSERT_VK_SUCCESS(err);
7889
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007890 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7891 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7892 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7893
7894 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7895 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7896 vi_ci.pNext = nullptr;
7897 vi_ci.vertexBindingDescriptionCount = 0;
7898 vi_ci.pVertexBindingDescriptions = nullptr;
7899 vi_ci.vertexAttributeDescriptionCount = 0;
7900 vi_ci.pVertexAttributeDescriptions = nullptr;
7901
7902 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7903 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7904 pipe_ms_state_ci.pNext = NULL;
7905 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7906 pipe_ms_state_ci.sampleShadingEnable = 0;
7907 pipe_ms_state_ci.minSampleShading = 1.0;
7908 pipe_ms_state_ci.pSampleMask = NULL;
7909
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007911 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7912 pipeline_layout_ci.setLayoutCount = 1;
7913 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007914
7915 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007916 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007917 ASSERT_VK_SUCCESS(err);
7918
7919 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7920 // Set scissor as dynamic to avoid second error
7921 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007922 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7923 dyn_state_ci.dynamicStateCount = 1;
7924 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007925
Cody Northropeb3a6c12015-10-05 14:44:45 -06007926 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007927 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007928
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007929 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007930 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7931 // 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 +08007932 shaderStages[0] = vs.GetStageCreateInfo();
7933 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007935 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7936 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7937 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7938 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7939 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7940 rs_state_ci.depthClampEnable = VK_FALSE;
7941 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7942 rs_state_ci.depthBiasEnable = VK_FALSE;
7943
Tobin Ehlise68360f2015-10-01 11:15:13 -06007944 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007945 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7946 gp_ci.stageCount = 2;
7947 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007948 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007949 // Not setting VP state w/o dynamic vp state should cause validation error
7950 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007951 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007952 gp_ci.pVertexInputState = &vi_ci;
7953 gp_ci.pInputAssemblyState = &ia_ci;
7954 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007955 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7956 gp_ci.layout = pipeline_layout;
7957 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958
7959 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007960 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007961
7962 VkPipeline pipeline;
7963 VkPipelineCache pipelineCache;
7964
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007965 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007966 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007967 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007968
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007969 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007970
Chia-I Wuf7458c52015-10-26 21:10:41 +08007971 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7972 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7973 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7974 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007975}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007976
7977// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7978// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007979TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7980 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007981
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007983
Tony Barbour1fa09702017-03-16 12:09:08 -06007984 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007985
7986 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007987 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007988 return;
7989 }
7990
Tobin Ehlise68360f2015-10-01 11:15:13 -06007991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007993 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007994 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7995 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007996
7997 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007998 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7999 ds_pool_ci.maxSets = 1;
8000 ds_pool_ci.poolSizeCount = 1;
8001 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008002
8003 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008004 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008005 ASSERT_VK_SUCCESS(err);
8006
8007 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008008 dsl_binding.binding = 0;
8009 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8010 dsl_binding.descriptorCount = 1;
8011 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008012
8013 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008014 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8015 ds_layout_ci.bindingCount = 1;
8016 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008017
8018 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008019 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008020 ASSERT_VK_SUCCESS(err);
8021
8022 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008023 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008024 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008025 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008026 alloc_info.descriptorPool = ds_pool;
8027 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008028 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008029 ASSERT_VK_SUCCESS(err);
8030
8031 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008032 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8033 pipeline_layout_ci.setLayoutCount = 1;
8034 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008035
8036 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008037 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008038 ASSERT_VK_SUCCESS(err);
8039
8040 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008041 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8042 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008043 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008044 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008045 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008046
8047 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8048 // Set scissor as dynamic to avoid that error
8049 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008050 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8051 dyn_state_ci.dynamicStateCount = 1;
8052 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008053
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008054 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8055 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8056 pipe_ms_state_ci.pNext = NULL;
8057 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8058 pipe_ms_state_ci.sampleShadingEnable = 0;
8059 pipe_ms_state_ci.minSampleShading = 1.0;
8060 pipe_ms_state_ci.pSampleMask = NULL;
8061
Cody Northropeb3a6c12015-10-05 14:44:45 -06008062 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008063 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008064
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008065 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008066 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8067 // 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 +08008068 shaderStages[0] = vs.GetStageCreateInfo();
8069 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008070
Cody Northropf6622dc2015-10-06 10:33:21 -06008071 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8072 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8073 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008074 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008075 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008076 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008077 vi_ci.pVertexAttributeDescriptions = nullptr;
8078
8079 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8080 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8081 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8082
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008083 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008084 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008085 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008086 rs_ci.pNext = nullptr;
8087
Mark Youngc89c6312016-03-31 16:03:20 -06008088 VkPipelineColorBlendAttachmentState att = {};
8089 att.blendEnable = VK_FALSE;
8090 att.colorWriteMask = 0xf;
8091
Cody Northropf6622dc2015-10-06 10:33:21 -06008092 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8093 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8094 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008095 cb_ci.attachmentCount = 1;
8096 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008097
Tobin Ehlise68360f2015-10-01 11:15:13 -06008098 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008099 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8100 gp_ci.stageCount = 2;
8101 gp_ci.pStages = shaderStages;
8102 gp_ci.pVertexInputState = &vi_ci;
8103 gp_ci.pInputAssemblyState = &ia_ci;
8104 gp_ci.pViewportState = &vp_state_ci;
8105 gp_ci.pRasterizationState = &rs_ci;
8106 gp_ci.pColorBlendState = &cb_ci;
8107 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008108 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008109 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8110 gp_ci.layout = pipeline_layout;
8111 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008112
8113 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008114 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115
8116 VkPipeline pipeline;
8117 VkPipelineCache pipelineCache;
8118
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008119 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008120 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008121 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008122
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008123 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008124
Tobin Ehlisd332f282015-10-02 11:00:56 -06008125 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008126 // First need to successfully create the PSO from above by setting
8127 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008128 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 -07008129
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008130 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008131 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008132 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008133 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008134 m_commandBuffer->BeginCommandBuffer();
8135 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008136 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008137 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008138 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008139 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008140 Draw(1, 0, 0, 0);
8141
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008142 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008143
8144 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8145 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8146 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8147 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008148 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008149}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008150
8151// 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 -07008152// viewportCount
8153TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8154 VkResult err;
8155
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008157
Tony Barbour1fa09702017-03-16 12:09:08 -06008158 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008159
8160 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008161 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008162 return;
8163 }
8164
Karl Schultz6addd812016-02-02 17:17:23 -07008165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8166
8167 VkDescriptorPoolSize ds_type_count = {};
8168 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8169 ds_type_count.descriptorCount = 1;
8170
8171 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8172 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8173 ds_pool_ci.maxSets = 1;
8174 ds_pool_ci.poolSizeCount = 1;
8175 ds_pool_ci.pPoolSizes = &ds_type_count;
8176
8177 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008178 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008179 ASSERT_VK_SUCCESS(err);
8180
8181 VkDescriptorSetLayoutBinding dsl_binding = {};
8182 dsl_binding.binding = 0;
8183 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8184 dsl_binding.descriptorCount = 1;
8185 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8186
8187 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8188 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8189 ds_layout_ci.bindingCount = 1;
8190 ds_layout_ci.pBindings = &dsl_binding;
8191
8192 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008193 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008194 ASSERT_VK_SUCCESS(err);
8195
8196 VkDescriptorSet descriptorSet;
8197 VkDescriptorSetAllocateInfo alloc_info = {};
8198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8199 alloc_info.descriptorSetCount = 1;
8200 alloc_info.descriptorPool = ds_pool;
8201 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008203 ASSERT_VK_SUCCESS(err);
8204
8205 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8206 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8207 pipeline_layout_ci.setLayoutCount = 1;
8208 pipeline_layout_ci.pSetLayouts = &ds_layout;
8209
8210 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008211 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008212 ASSERT_VK_SUCCESS(err);
8213
8214 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8215 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8216 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008217 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008218 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008219 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008220
8221 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8222 // Set scissor as dynamic to avoid that error
8223 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8224 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8225 dyn_state_ci.dynamicStateCount = 1;
8226 dyn_state_ci.pDynamicStates = &vp_state;
8227
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008228 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8229 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8230 pipe_ms_state_ci.pNext = NULL;
8231 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8232 pipe_ms_state_ci.sampleShadingEnable = 0;
8233 pipe_ms_state_ci.minSampleShading = 1.0;
8234 pipe_ms_state_ci.pSampleMask = NULL;
8235
Karl Schultz6addd812016-02-02 17:17:23 -07008236 VkPipelineShaderStageCreateInfo shaderStages[2];
8237 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008239 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008240 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8241 // 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 -07008242 shaderStages[0] = vs.GetStageCreateInfo();
8243 shaderStages[1] = fs.GetStageCreateInfo();
8244
8245 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8246 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8247 vi_ci.pNext = nullptr;
8248 vi_ci.vertexBindingDescriptionCount = 0;
8249 vi_ci.pVertexBindingDescriptions = nullptr;
8250 vi_ci.vertexAttributeDescriptionCount = 0;
8251 vi_ci.pVertexAttributeDescriptions = nullptr;
8252
8253 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8254 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8255 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8256
8257 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8258 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008259 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008260 rs_ci.pNext = nullptr;
8261
Mark Youngc89c6312016-03-31 16:03:20 -06008262 VkPipelineColorBlendAttachmentState att = {};
8263 att.blendEnable = VK_FALSE;
8264 att.colorWriteMask = 0xf;
8265
Karl Schultz6addd812016-02-02 17:17:23 -07008266 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8267 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8268 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008269 cb_ci.attachmentCount = 1;
8270 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008271
8272 VkGraphicsPipelineCreateInfo gp_ci = {};
8273 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8274 gp_ci.stageCount = 2;
8275 gp_ci.pStages = shaderStages;
8276 gp_ci.pVertexInputState = &vi_ci;
8277 gp_ci.pInputAssemblyState = &ia_ci;
8278 gp_ci.pViewportState = &vp_state_ci;
8279 gp_ci.pRasterizationState = &rs_ci;
8280 gp_ci.pColorBlendState = &cb_ci;
8281 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008282 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008283 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8284 gp_ci.layout = pipeline_layout;
8285 gp_ci.renderPass = renderPass();
8286
8287 VkPipelineCacheCreateInfo pc_ci = {};
8288 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8289
8290 VkPipeline pipeline;
8291 VkPipelineCache pipelineCache;
8292
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008293 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008294 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008295 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008296
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008297 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008298
8299 // Now hit second fail case where we set scissor w/ different count than PSO
8300 // First need to successfully create the PSO from above by setting
8301 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8303 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008304
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008305 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008306 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008307 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008308 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008309 m_commandBuffer->BeginCommandBuffer();
8310 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008311 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008312 VkViewport viewports[1] = {};
8313 viewports[0].width = 8;
8314 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008315 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008316 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008317 Draw(1, 0, 0, 0);
8318
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008319 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008320
Chia-I Wuf7458c52015-10-26 21:10:41 +08008321 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8322 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8323 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8324 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008325 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008326}
8327
Mark Young7394fdd2016-03-31 14:56:43 -06008328TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8329 VkResult err;
8330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008332
Tony Barbour1fa09702017-03-16 12:09:08 -06008333 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8335
8336 VkDescriptorPoolSize ds_type_count = {};
8337 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8338 ds_type_count.descriptorCount = 1;
8339
8340 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8341 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8342 ds_pool_ci.maxSets = 1;
8343 ds_pool_ci.poolSizeCount = 1;
8344 ds_pool_ci.pPoolSizes = &ds_type_count;
8345
8346 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008347 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008348 ASSERT_VK_SUCCESS(err);
8349
8350 VkDescriptorSetLayoutBinding dsl_binding = {};
8351 dsl_binding.binding = 0;
8352 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8353 dsl_binding.descriptorCount = 1;
8354 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8355
8356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8358 ds_layout_ci.bindingCount = 1;
8359 ds_layout_ci.pBindings = &dsl_binding;
8360
8361 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008362 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008363 ASSERT_VK_SUCCESS(err);
8364
8365 VkDescriptorSet descriptorSet;
8366 VkDescriptorSetAllocateInfo alloc_info = {};
8367 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8368 alloc_info.descriptorSetCount = 1;
8369 alloc_info.descriptorPool = ds_pool;
8370 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008371 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008372 ASSERT_VK_SUCCESS(err);
8373
8374 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8375 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8376 pipeline_layout_ci.setLayoutCount = 1;
8377 pipeline_layout_ci.pSetLayouts = &ds_layout;
8378
8379 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008380 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008381 ASSERT_VK_SUCCESS(err);
8382
8383 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8384 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8385 vp_state_ci.scissorCount = 1;
8386 vp_state_ci.pScissors = NULL;
8387 vp_state_ci.viewportCount = 1;
8388 vp_state_ci.pViewports = NULL;
8389
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008390 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008391 // Set scissor as dynamic to avoid that error
8392 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8393 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8394 dyn_state_ci.dynamicStateCount = 2;
8395 dyn_state_ci.pDynamicStates = dynamic_states;
8396
8397 VkPipelineShaderStageCreateInfo shaderStages[2];
8398 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8399
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008400 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8401 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008402 this); // TODO - We shouldn't need a fragment shader
8403 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008404 shaderStages[0] = vs.GetStageCreateInfo();
8405 shaderStages[1] = fs.GetStageCreateInfo();
8406
8407 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8408 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8409 vi_ci.pNext = nullptr;
8410 vi_ci.vertexBindingDescriptionCount = 0;
8411 vi_ci.pVertexBindingDescriptions = nullptr;
8412 vi_ci.vertexAttributeDescriptionCount = 0;
8413 vi_ci.pVertexAttributeDescriptions = nullptr;
8414
8415 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8416 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8417 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8418
8419 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8420 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8421 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008422 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008423
Mark Young47107952016-05-02 15:59:55 -06008424 // Check too low (line width of -1.0f).
8425 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008426
8427 VkPipelineColorBlendAttachmentState att = {};
8428 att.blendEnable = VK_FALSE;
8429 att.colorWriteMask = 0xf;
8430
8431 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8432 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8433 cb_ci.pNext = nullptr;
8434 cb_ci.attachmentCount = 1;
8435 cb_ci.pAttachments = &att;
8436
8437 VkGraphicsPipelineCreateInfo gp_ci = {};
8438 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8439 gp_ci.stageCount = 2;
8440 gp_ci.pStages = shaderStages;
8441 gp_ci.pVertexInputState = &vi_ci;
8442 gp_ci.pInputAssemblyState = &ia_ci;
8443 gp_ci.pViewportState = &vp_state_ci;
8444 gp_ci.pRasterizationState = &rs_ci;
8445 gp_ci.pColorBlendState = &cb_ci;
8446 gp_ci.pDynamicState = &dyn_state_ci;
8447 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8448 gp_ci.layout = pipeline_layout;
8449 gp_ci.renderPass = renderPass();
8450
8451 VkPipelineCacheCreateInfo pc_ci = {};
8452 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8453
8454 VkPipeline pipeline;
8455 VkPipelineCache pipelineCache;
8456
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008457 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008458 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008459 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008460
8461 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008462 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008465
8466 // Check too high (line width of 65536.0f).
8467 rs_ci.lineWidth = 65536.0f;
8468
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008469 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008470 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008471 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008472
8473 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008474 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008475
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008477
8478 dyn_state_ci.dynamicStateCount = 3;
8479
8480 rs_ci.lineWidth = 1.0f;
8481
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008482 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008483 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008484 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008485 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008486 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008487
8488 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008489 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008490 m_errorMonitor->VerifyFound();
8491
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008493
8494 // Check too high with dynamic setting.
8495 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8496 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008497 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008498
8499 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8500 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8501 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8502 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008503 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008504}
8505
Karl Schultz6addd812016-02-02 17:17:23 -07008506TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008507 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008509 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008510
Tony Barbour1fa09702017-03-16 12:09:08 -06008511 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008513
Tony Barbour552f6c02016-12-21 14:34:07 -07008514 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008515 // Don't care about RenderPass handle b/c error should be flagged before
8516 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008517 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008518
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008519 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008520}
8521
Karl Schultz6addd812016-02-02 17:17:23 -07008522TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008523 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8525 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008526
Tony Barbour1fa09702017-03-16 12:09:08 -06008527 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008529
Tony Barbour552f6c02016-12-21 14:34:07 -07008530 m_commandBuffer->BeginCommandBuffer();
8531 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008532 // Just create a dummy Renderpass that's non-NULL so we can get to the
8533 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008534 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008535
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008536 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008537}
8538
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008539TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008540 TEST_DESCRIPTION(
8541 "Begin a renderPass where clearValueCount is less than"
8542 "the number of renderPass attachments that use loadOp"
8543 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008544
Tony Barbour1fa09702017-03-16 12:09:08 -06008545 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8547
8548 // Create a renderPass with a single attachment that uses loadOp CLEAR
8549 VkAttachmentReference attach = {};
8550 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8551 VkSubpassDescription subpass = {};
8552 subpass.inputAttachmentCount = 1;
8553 subpass.pInputAttachments = &attach;
8554 VkRenderPassCreateInfo rpci = {};
8555 rpci.subpassCount = 1;
8556 rpci.pSubpasses = &subpass;
8557 rpci.attachmentCount = 1;
8558 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008559 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008560 // Set loadOp to CLEAR
8561 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8562 rpci.pAttachments = &attach_desc;
8563 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8564 VkRenderPass rp;
8565 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8566
8567 VkCommandBufferInheritanceInfo hinfo = {};
8568 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8569 hinfo.renderPass = VK_NULL_HANDLE;
8570 hinfo.subpass = 0;
8571 hinfo.framebuffer = VK_NULL_HANDLE;
8572 hinfo.occlusionQueryEnable = VK_FALSE;
8573 hinfo.queryFlags = 0;
8574 hinfo.pipelineStatistics = 0;
8575 VkCommandBufferBeginInfo info = {};
8576 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8577 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8578 info.pInheritanceInfo = &hinfo;
8579
8580 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8581 VkRenderPassBeginInfo rp_begin = {};
8582 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8583 rp_begin.pNext = NULL;
8584 rp_begin.renderPass = renderPass();
8585 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008586 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008587
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008590 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008591
8592 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008593
8594 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008595}
8596
Slawomir Cygan0808f392016-11-28 17:53:23 +01008597TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008598 TEST_DESCRIPTION(
8599 "Begin a renderPass where clearValueCount is greater than"
8600 "the number of renderPass attachments that use loadOp"
8601 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008602
Tony Barbour1fa09702017-03-16 12:09:08 -06008603 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008604 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8605
8606 // Create a renderPass with a single attachment that uses loadOp CLEAR
8607 VkAttachmentReference attach = {};
8608 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8609 VkSubpassDescription subpass = {};
8610 subpass.inputAttachmentCount = 1;
8611 subpass.pInputAttachments = &attach;
8612 VkRenderPassCreateInfo rpci = {};
8613 rpci.subpassCount = 1;
8614 rpci.pSubpasses = &subpass;
8615 rpci.attachmentCount = 1;
8616 VkAttachmentDescription attach_desc = {};
8617 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8618 // Set loadOp to CLEAR
8619 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8620 rpci.pAttachments = &attach_desc;
8621 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8622 VkRenderPass rp;
8623 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8624
8625 VkCommandBufferBeginInfo info = {};
8626 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8627 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8628
8629 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8630 VkRenderPassBeginInfo rp_begin = {};
8631 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8632 rp_begin.pNext = NULL;
8633 rp_begin.renderPass = renderPass();
8634 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008635 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008636
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8638 " has a clearValueCount of"
8639 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008640
8641 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8642
8643 m_errorMonitor->VerifyFound();
8644
8645 vkDestroyRenderPass(m_device->device(), rp, NULL);
8646}
8647
Cody Northrop3bb4d962016-05-09 16:15:57 -06008648TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008649 TEST_DESCRIPTION("End a command buffer with an active render pass");
8650
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8652 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008653
Tony Barbour1fa09702017-03-16 12:09:08 -06008654 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008655 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8656
Tony Barbour552f6c02016-12-21 14:34:07 -07008657 m_commandBuffer->BeginCommandBuffer();
8658 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8659 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008660
8661 m_errorMonitor->VerifyFound();
8662
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008663 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8664 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008665}
8666
Karl Schultz6addd812016-02-02 17:17:23 -07008667TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008668 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8670 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008671
Tony Barbour1fa09702017-03-16 12:09:08 -06008672 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008674
Tony Barbour552f6c02016-12-21 14:34:07 -07008675 m_commandBuffer->BeginCommandBuffer();
8676 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008677
8678 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008679 vk_testing::Buffer dstBuffer;
8680 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008681
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008682 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008684 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008685}
8686
Karl Schultz6addd812016-02-02 17:17:23 -07008687TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008688 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8690 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008691
Tony Barbour1fa09702017-03-16 12:09:08 -06008692 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008694
Tony Barbour552f6c02016-12-21 14:34:07 -07008695 m_commandBuffer->BeginCommandBuffer();
8696 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008697
8698 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008699 vk_testing::Buffer dstBuffer;
8700 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008701
Karl Schultz6addd812016-02-02 17:17:23 -07008702 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008703 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8704 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8705 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008706
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008707 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008708}
8709
Karl Schultz6addd812016-02-02 17:17:23 -07008710TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008711 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8713 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008714
Tony Barbour1fa09702017-03-16 12:09:08 -06008715 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008717
Tony Barbour552f6c02016-12-21 14:34:07 -07008718 m_commandBuffer->BeginCommandBuffer();
8719 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008720
Michael Lentine0a369f62016-02-03 16:51:46 -06008721 VkClearColorValue clear_color;
8722 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008723 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8724 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8725 const int32_t tex_width = 32;
8726 const int32_t tex_height = 32;
8727 VkImageCreateInfo image_create_info = {};
8728 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8729 image_create_info.pNext = NULL;
8730 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8731 image_create_info.format = tex_format;
8732 image_create_info.extent.width = tex_width;
8733 image_create_info.extent.height = tex_height;
8734 image_create_info.extent.depth = 1;
8735 image_create_info.mipLevels = 1;
8736 image_create_info.arrayLayers = 1;
8737 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8738 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008739 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008740
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008741 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008742 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008744 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008745
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008746 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008747
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008748 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008749}
8750
Karl Schultz6addd812016-02-02 17:17:23 -07008751TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008752 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8754 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008755
Tony Barbour1fa09702017-03-16 12:09:08 -06008756 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008758
Tony Barbourf887b162017-03-09 10:06:46 -07008759 auto depth_format = find_depth_stencil_format(m_device);
8760 if (!depth_format) {
8761 printf(" No Depth + Stencil format found. Skipped.\n");
8762 return;
8763 }
8764
Tony Barbour552f6c02016-12-21 14:34:07 -07008765 m_commandBuffer->BeginCommandBuffer();
8766 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008767
8768 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008769 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008770 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8771 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008772 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008773 image_create_info.extent.width = 64;
8774 image_create_info.extent.height = 64;
8775 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8776 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008777
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008778 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008779 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008780
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008781 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008782
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008783 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8784 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008785
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008786 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008787}
8788
Karl Schultz6addd812016-02-02 17:17:23 -07008789TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008790 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008791 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008792
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8794 "vkCmdClearAttachments(): This call "
8795 "must be issued inside an active "
8796 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008797
Tony Barbour1fa09702017-03-16 12:09:08 -06008798 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008800
8801 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008802 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008803 ASSERT_VK_SUCCESS(err);
8804
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008805 VkClearAttachment color_attachment;
8806 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8807 color_attachment.clearValue.color.float32[0] = 0;
8808 color_attachment.clearValue.color.float32[1] = 0;
8809 color_attachment.clearValue.color.float32[2] = 0;
8810 color_attachment.clearValue.color.float32[3] = 0;
8811 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008812 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008813 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008814
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008815 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008816}
8817
Chris Forbes3b97e932016-09-07 11:29:24 +12008818TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008819 TEST_DESCRIPTION(
8820 "Test that an error is produced when CmdNextSubpass is "
8821 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008822
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8824 "vkCmdNextSubpass(): Attempted to advance "
8825 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008826
Tony Barbour1fa09702017-03-16 12:09:08 -06008827 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008828 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8829
Tony Barbour552f6c02016-12-21 14:34:07 -07008830 m_commandBuffer->BeginCommandBuffer();
8831 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008832
8833 // error here.
8834 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8835 m_errorMonitor->VerifyFound();
8836
Tony Barbour552f6c02016-12-21 14:34:07 -07008837 m_commandBuffer->EndRenderPass();
8838 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008839}
8840
Chris Forbes6d624702016-09-07 13:57:05 +12008841TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008842 TEST_DESCRIPTION(
8843 "Test that an error is produced when CmdEndRenderPass is "
8844 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008845
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8847 "vkCmdEndRenderPass(): Called before reaching "
8848 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008849
Tony Barbour1fa09702017-03-16 12:09:08 -06008850 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008851 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8852 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008853
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008854 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008855
8856 VkRenderPass rp;
8857 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8858 ASSERT_VK_SUCCESS(err);
8859
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008860 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008861
8862 VkFramebuffer fb;
8863 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8864 ASSERT_VK_SUCCESS(err);
8865
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008866 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 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 +12008869
8870 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8871
8872 // Error here.
8873 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8874 m_errorMonitor->VerifyFound();
8875
8876 // Clean up.
8877 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8878 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8879}
8880
Karl Schultz9e66a292016-04-21 15:57:51 -06008881TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8882 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8884 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008885
Tony Barbour1fa09702017-03-16 12:09:08 -06008886 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008887 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008888
8889 VkBufferMemoryBarrier buf_barrier = {};
8890 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8891 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8892 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8893 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8894 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8895 buf_barrier.buffer = VK_NULL_HANDLE;
8896 buf_barrier.offset = 0;
8897 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008898 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8899 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008900
8901 m_errorMonitor->VerifyFound();
8902}
8903
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008904TEST_F(VkLayerTest, InvalidBarriers) {
8905 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8906
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008908
Tony Barbour1fa09702017-03-16 12:09:08 -06008909 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07008910 auto depth_format = find_depth_stencil_format(m_device);
8911 if (!depth_format) {
8912 printf(" No Depth + Stencil format found. Skipped.\n");
8913 return;
8914 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008915 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8916
8917 VkMemoryBarrier mem_barrier = {};
8918 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8919 mem_barrier.pNext = NULL;
8920 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8921 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008922 m_commandBuffer->BeginCommandBuffer();
8923 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008924 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008925 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008926 &mem_barrier, 0, nullptr, 0, nullptr);
8927 m_errorMonitor->VerifyFound();
8928
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008930 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008931 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 -06008932 ASSERT_TRUE(image.initialized());
8933 VkImageMemoryBarrier img_barrier = {};
8934 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8935 img_barrier.pNext = NULL;
8936 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8937 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8938 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8939 // New layout can't be UNDEFINED
8940 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8941 img_barrier.image = image.handle();
8942 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8943 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8944 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8945 img_barrier.subresourceRange.baseArrayLayer = 0;
8946 img_barrier.subresourceRange.baseMipLevel = 0;
8947 img_barrier.subresourceRange.layerCount = 1;
8948 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008949 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8950 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008951 m_errorMonitor->VerifyFound();
8952 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8953
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8955 "Subresource must have the sum of the "
8956 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008957 // baseArrayLayer + layerCount must be <= image's arrayLayers
8958 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008959 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8960 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008961 m_errorMonitor->VerifyFound();
8962 img_barrier.subresourceRange.baseArrayLayer = 0;
8963
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008965 // baseMipLevel + levelCount must be <= image's mipLevels
8966 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008967 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8968 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008969 m_errorMonitor->VerifyFound();
8970 img_barrier.subresourceRange.baseMipLevel = 0;
8971
Mike Weiblen7053aa32017-01-25 15:21:10 -07008972 // levelCount must be non-zero.
8973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8974 img_barrier.subresourceRange.levelCount = 0;
8975 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8976 nullptr, 0, nullptr, 1, &img_barrier);
8977 m_errorMonitor->VerifyFound();
8978 img_barrier.subresourceRange.levelCount = 1;
8979
8980 // layerCount must be non-zero.
8981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8982 img_barrier.subresourceRange.layerCount = 0;
8983 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8984 nullptr, 0, nullptr, 1, &img_barrier);
8985 m_errorMonitor->VerifyFound();
8986 img_barrier.subresourceRange.layerCount = 1;
8987
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008988 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 -06008989 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008990 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8991 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008992 VkBufferMemoryBarrier buf_barrier = {};
8993 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8994 buf_barrier.pNext = NULL;
8995 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8996 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8997 buf_barrier.buffer = buffer.handle();
8998 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8999 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9000 buf_barrier.offset = 0;
9001 buf_barrier.size = VK_WHOLE_SIZE;
9002 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009003 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9004 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009005 m_errorMonitor->VerifyFound();
9006 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9007
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009009 buf_barrier.offset = 257;
9010 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009011 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9012 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009013 m_errorMonitor->VerifyFound();
9014 buf_barrier.offset = 0;
9015
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009017 buf_barrier.size = 257;
9018 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009019 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9020 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009021 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009022
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009023 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009024 m_errorMonitor->SetDesiredFailureMsg(
9025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009026 "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 -06009027 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009028 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009029 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009030 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9031 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009032 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009033
9034 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009035 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009036 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9037 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009038 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009039
9040 // Having anything other than DEPTH or STENCIL is an error
9041 m_errorMonitor->SetDesiredFailureMsg(
9042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9043 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9044 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9045 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9046 nullptr, 0, nullptr, 1, &img_barrier);
9047 m_errorMonitor->VerifyFound();
9048
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009049 // Now test depth-only
9050 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009051 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9052 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009053 VkDepthStencilObj d_image(m_device);
9054 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9055 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009056 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009057 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009058 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009059
9060 // DEPTH bit must be set
9061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9062 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009063 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009064 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9065 0, nullptr, 0, nullptr, 1, &img_barrier);
9066 m_errorMonitor->VerifyFound();
9067
9068 // No bits other than DEPTH may be set
9069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9070 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9071 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009072 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9073 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009074 m_errorMonitor->VerifyFound();
9075 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009076
9077 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009078 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9079 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009080 VkDepthStencilObj s_image(m_device);
9081 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9082 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009083 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009084 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009085 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009086 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9088 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009089 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009090 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9091 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009092 m_errorMonitor->VerifyFound();
9093 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009094
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009095 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009096 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009097 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 -06009098 ASSERT_TRUE(c_image.initialized());
9099 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9100 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9101 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009102
9103 // COLOR bit must be set
9104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9105 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009106 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009107 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9108 nullptr, 0, nullptr, 1, &img_barrier);
9109 m_errorMonitor->VerifyFound();
9110
9111 // No bits other than COLOR may be set
9112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9113 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9114 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009115 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9116 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009117 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009118
Mike Weiblene6e01172017-03-07 22:18:40 -07009119 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9120 {
9121 VkImageObj img_color(m_device);
9122 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9123 ASSERT_TRUE(img_color.initialized());
9124
9125 VkImageObj img_ds(m_device);
9126 img_ds.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9127 ASSERT_TRUE(img_ds.initialized());
9128
9129 VkImageObj img_xfer_src(m_device);
9130 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9131 ASSERT_TRUE(img_xfer_src.initialized());
9132
9133 VkImageObj img_xfer_dst(m_device);
9134 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9135 ASSERT_TRUE(img_xfer_dst.initialized());
9136
9137 VkImageObj img_sampled(m_device);
9138 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9139 ASSERT_TRUE(img_sampled.initialized());
9140
9141 VkImageObj img_input(m_device);
9142 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9143 ASSERT_TRUE(img_input.initialized());
9144
9145 const struct {
9146 VkImageObj &image_obj;
9147 VkImageLayout bad_layout;
9148 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9149 } bad_buffer_layouts[] = {
9150 // clang-format off
9151 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9152 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9153 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9154 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9155 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9156 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9157 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9158 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9159 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9160 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9161 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9162 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9163 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9164 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9165 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9166 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9167 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9168 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9169 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9170 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9171 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9172 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9173 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9174 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9175 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9176 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9177 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9178 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9179 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9180 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9181 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9182 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9183 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9184 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9185 // clang-format on
9186 };
9187 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9188
9189 for (uint32_t i = 0; i < layout_count; ++i) {
9190 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9191 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9192 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9193 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9194 : VK_IMAGE_ASPECT_COLOR_BIT;
9195
9196 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9197 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9199 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9200 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9201 m_errorMonitor->VerifyFound();
9202
9203 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9204 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9206 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9207 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9208 m_errorMonitor->VerifyFound();
9209 }
9210
9211 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9212 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9213 }
9214
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009215 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9216
9217 // Create command pool with incompatible queueflags
9218 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
9219 uint32_t queue_family_index = UINT32_MAX;
9220 for (uint32_t i = 0; i < queue_props.size(); i++) {
9221 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
9222 queue_family_index = i;
9223 break;
9224 }
9225 }
9226 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009227 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009228 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009229 }
9230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9231
9232 VkCommandPool command_pool;
9233 VkCommandPoolCreateInfo pool_create_info{};
9234 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9235 pool_create_info.queueFamilyIndex = queue_family_index;
9236 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9237 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9238
9239 // Allocate a command buffer
9240 VkCommandBuffer bad_command_buffer;
9241 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9242 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9243 command_buffer_allocate_info.commandPool = command_pool;
9244 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9245 command_buffer_allocate_info.commandBufferCount = 1;
9246 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9247
9248 VkCommandBufferBeginInfo cbbi = {};
9249 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9250 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9251 buf_barrier.offset = 0;
9252 buf_barrier.size = VK_WHOLE_SIZE;
9253 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9254 &buf_barrier, 0, nullptr);
9255 m_errorMonitor->VerifyFound();
9256
9257 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9258 vkEndCommandBuffer(bad_command_buffer);
9259 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009260 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009261 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009262 }
9263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9264 VkEvent event;
9265 VkEventCreateInfo event_create_info{};
9266 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9267 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9268 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9269 nullptr, 0, nullptr);
9270 m_errorMonitor->VerifyFound();
9271
9272 vkEndCommandBuffer(bad_command_buffer);
9273 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009274}
9275
Tony Barbour18ba25c2016-09-29 13:42:40 -06009276TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9277 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9278
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009280 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009281 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009282 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9283 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009284 ASSERT_TRUE(image.initialized());
9285
9286 VkImageMemoryBarrier barrier = {};
9287 VkImageSubresourceRange range;
9288 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9289 barrier.srcAccessMask = 0;
9290 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9291 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9292 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9293 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9294 barrier.image = image.handle();
9295 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9296 range.baseMipLevel = 0;
9297 range.levelCount = 1;
9298 range.baseArrayLayer = 0;
9299 range.layerCount = 1;
9300 barrier.subresourceRange = range;
9301 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9302 cmdbuf.BeginCommandBuffer();
9303 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9304 &barrier);
9305 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9306 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9307 barrier.srcAccessMask = 0;
9308 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9309 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9310 &barrier);
9311
9312 m_errorMonitor->VerifyFound();
9313}
9314
Karl Schultz6addd812016-02-02 17:17:23 -07009315TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009316 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009317 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009318 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009319
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009320 uint32_t const indices[] = {0};
9321 VkBufferCreateInfo buf_info = {};
9322 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9323 buf_info.size = 1024;
9324 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9325 buf_info.queueFamilyIndexCount = 1;
9326 buf_info.pQueueFamilyIndices = indices;
9327
9328 VkBuffer buffer;
9329 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9330 ASSERT_VK_SUCCESS(err);
9331
9332 VkMemoryRequirements requirements;
9333 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9334
9335 VkMemoryAllocateInfo alloc_info{};
9336 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9337 alloc_info.pNext = NULL;
9338 alloc_info.memoryTypeIndex = 0;
9339 alloc_info.allocationSize = requirements.size;
9340 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9341 ASSERT_TRUE(pass);
9342
9343 VkDeviceMemory memory;
9344 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9345 ASSERT_VK_SUCCESS(err);
9346
9347 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009348 ASSERT_VK_SUCCESS(err);
9349
Tony Barbour552f6c02016-12-21 14:34:07 -07009350 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009351 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009352
Karl Schultz6addd812016-02-02 17:17:23 -07009353 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9354 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009355 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9357 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009358 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009359
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009360 vkFreeMemory(m_device->device(), memory, NULL);
9361 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009362}
9363
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009364TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9365 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009366 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9368 VkBufferCreateInfo buffCI = {};
9369 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9370 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009371 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009372 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009373 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009374 uint32_t qfi[2];
9375 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009376 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009377
9378 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009379 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009380
9381 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9383 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9384 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009385 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009386 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009387
9388 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009389 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9391
9392 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9393 buffCI.queueFamilyIndexCount = 2;
9394 qfi[0] = 1;
9395 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009396 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009397 VkDeviceMemory mem;
9398 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009399 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009400
9401 VkMemoryAllocateInfo alloc_info = {};
9402 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9403 alloc_info.allocationSize = 1024;
9404 bool pass = false;
9405 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9406 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009407 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009408 return;
9409 }
9410 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009411 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009412
9413 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009414 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009415 m_commandBuffer->end();
9416 QueueCommandBuffer(false);
9417 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009418 vkDestroyBuffer(m_device->device(), ib2, NULL);
9419 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009420 }
9421
Tony Barbourdf4c0042016-06-01 15:55:43 -06009422 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009423}
9424
Karl Schultz6addd812016-02-02 17:17:23 -07009425TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009426 TEST_DESCRIPTION(
9427 "Attempt vkCmdExecuteCommands with a primary command buffer"
9428 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009429
Tony Barbour1fa09702017-03-16 12:09:08 -06009430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009431 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009432
Chris Forbesf29a84f2016-10-06 18:39:28 +13009433 // An empty primary command buffer
9434 VkCommandBufferObj cb(m_device, m_commandPool);
9435 cb.BeginCommandBuffer();
9436 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009437
Chris Forbesf29a84f2016-10-06 18:39:28 +13009438 m_commandBuffer->BeginCommandBuffer();
9439 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9440 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009441
Chris Forbesf29a84f2016-10-06 18:39:28 +13009442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9443 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009444 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009445
9446 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009447}
9448
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009449TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009450 TEST_DESCRIPTION(
9451 "Attempt to update descriptor sets for images and buffers "
9452 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009453 VkResult err;
9454
Tony Barbour1fa09702017-03-16 12:09:08 -06009455 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009456 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9457 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9458 ds_type_count[i].type = VkDescriptorType(i);
9459 ds_type_count[i].descriptorCount = 1;
9460 }
9461 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9462 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9463 ds_pool_ci.pNext = NULL;
9464 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9465 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9466 ds_pool_ci.pPoolSizes = ds_type_count;
9467
9468 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009469 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009470 ASSERT_VK_SUCCESS(err);
9471
9472 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009473 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009474 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9475 dsl_binding[i].binding = 0;
9476 dsl_binding[i].descriptorType = VkDescriptorType(i);
9477 dsl_binding[i].descriptorCount = 1;
9478 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9479 dsl_binding[i].pImmutableSamplers = NULL;
9480 }
9481
9482 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9483 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9484 ds_layout_ci.pNext = NULL;
9485 ds_layout_ci.bindingCount = 1;
9486 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9487 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9488 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009489 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009490 ASSERT_VK_SUCCESS(err);
9491 }
9492 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9493 VkDescriptorSetAllocateInfo alloc_info = {};
9494 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9495 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9496 alloc_info.descriptorPool = ds_pool;
9497 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009498 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009499 ASSERT_VK_SUCCESS(err);
9500
9501 // Create a buffer & bufferView to be used for invalid updates
9502 VkBufferCreateInfo buff_ci = {};
9503 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009504 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009505 buff_ci.size = 256;
9506 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009507 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009508 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9509 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009510
9511 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9512 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9513 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9514 ASSERT_VK_SUCCESS(err);
9515
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009516 VkMemoryRequirements mem_reqs;
9517 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9518 VkMemoryAllocateInfo mem_alloc_info = {};
9519 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9520 mem_alloc_info.pNext = NULL;
9521 mem_alloc_info.memoryTypeIndex = 0;
9522 mem_alloc_info.allocationSize = mem_reqs.size;
9523 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9524 if (!pass) {
9525 vkDestroyBuffer(m_device->device(), buffer, NULL);
9526 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9527 return;
9528 }
9529 VkDeviceMemory mem;
9530 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9531 ASSERT_VK_SUCCESS(err);
9532 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9533 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009534
9535 VkBufferViewCreateInfo buff_view_ci = {};
9536 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9537 buff_view_ci.buffer = buffer;
9538 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9539 buff_view_ci.range = VK_WHOLE_SIZE;
9540 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009541 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009542 ASSERT_VK_SUCCESS(err);
9543
Tony Barbour415497c2017-01-24 10:06:09 -07009544 // Now get resources / view for storage_texel_buffer
9545 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9546 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9547 if (!pass) {
9548 vkDestroyBuffer(m_device->device(), buffer, NULL);
9549 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9550 vkFreeMemory(m_device->device(), mem, NULL);
9551 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9552 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9553 return;
9554 }
9555 VkDeviceMemory storage_texel_buffer_mem;
9556 VkBufferView storage_texel_buffer_view;
9557 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9558 ASSERT_VK_SUCCESS(err);
9559 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9560 ASSERT_VK_SUCCESS(err);
9561 buff_view_ci.buffer = storage_texel_buffer;
9562 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9563 ASSERT_VK_SUCCESS(err);
9564
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009565 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009566 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009567 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009568 image_ci.format = VK_FORMAT_UNDEFINED;
9569 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9570 VkFormat format = static_cast<VkFormat>(f);
9571 VkFormatProperties fProps = m_device->format_properties(format);
9572 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9573 image_ci.format = format;
9574 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9575 break;
9576 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9577 image_ci.format = format;
9578 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9579 break;
9580 }
9581 }
9582 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9583 return;
9584 }
9585
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009586 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9587 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009588 image_ci.extent.width = 64;
9589 image_ci.extent.height = 64;
9590 image_ci.extent.depth = 1;
9591 image_ci.mipLevels = 1;
9592 image_ci.arrayLayers = 1;
9593 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009594 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009595 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009596 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9597 VkImage image;
9598 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9599 ASSERT_VK_SUCCESS(err);
9600 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009601 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009602
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009603 VkMemoryAllocateInfo mem_alloc = {};
9604 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9605 mem_alloc.pNext = NULL;
9606 mem_alloc.allocationSize = 0;
9607 mem_alloc.memoryTypeIndex = 0;
9608 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9609 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009610 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009611 ASSERT_TRUE(pass);
9612 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9613 ASSERT_VK_SUCCESS(err);
9614 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9615 ASSERT_VK_SUCCESS(err);
9616 // Now create view for image
9617 VkImageViewCreateInfo image_view_ci = {};
9618 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9619 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009620 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009621 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9622 image_view_ci.subresourceRange.layerCount = 1;
9623 image_view_ci.subresourceRange.baseArrayLayer = 0;
9624 image_view_ci.subresourceRange.levelCount = 1;
9625 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9626 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009627 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009628 ASSERT_VK_SUCCESS(err);
9629
9630 VkDescriptorBufferInfo buff_info = {};
9631 buff_info.buffer = buffer;
9632 VkDescriptorImageInfo img_info = {};
9633 img_info.imageView = image_view;
9634 VkWriteDescriptorSet descriptor_write = {};
9635 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9636 descriptor_write.dstBinding = 0;
9637 descriptor_write.descriptorCount = 1;
9638 descriptor_write.pTexelBufferView = &buff_view;
9639 descriptor_write.pBufferInfo = &buff_info;
9640 descriptor_write.pImageInfo = &img_info;
9641
9642 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009643 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009644 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9645 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9646 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9647 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9648 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9649 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9650 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9651 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9652 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9653 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9654 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009655 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009656 // Start loop at 1 as SAMPLER desc type has no usage bit error
9657 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009658 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9659 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9660 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9661 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009662 descriptor_write.descriptorType = VkDescriptorType(i);
9663 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009665
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009666 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009667
9668 m_errorMonitor->VerifyFound();
9669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009670 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9671 descriptor_write.pTexelBufferView = &buff_view;
9672 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009673 }
Tony Barbour415497c2017-01-24 10:06:09 -07009674
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009675 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9676 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009677 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009678 vkDestroyImageView(m_device->device(), image_view, NULL);
9679 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009680 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009681 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009682 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009683 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009684 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009685 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9686}
9687
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009688TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009689 TEST_DESCRIPTION(
9690 "Attempt to update buffer descriptor set that has incorrect "
9691 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009692 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009693 "2. range value of 0\n"
9694 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009695 VkResult err;
9696
Tony Barbour1fa09702017-03-16 12:09:08 -06009697 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009698 VkDescriptorPoolSize ds_type_count = {};
9699 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9700 ds_type_count.descriptorCount = 1;
9701
9702 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9703 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9704 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009705 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009706 ds_pool_ci.maxSets = 1;
9707 ds_pool_ci.poolSizeCount = 1;
9708 ds_pool_ci.pPoolSizes = &ds_type_count;
9709
9710 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009711 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009712 ASSERT_VK_SUCCESS(err);
9713
9714 // Create layout with single uniform buffer descriptor
9715 VkDescriptorSetLayoutBinding dsl_binding = {};
9716 dsl_binding.binding = 0;
9717 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9718 dsl_binding.descriptorCount = 1;
9719 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9720 dsl_binding.pImmutableSamplers = NULL;
9721
9722 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9723 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9724 ds_layout_ci.pNext = NULL;
9725 ds_layout_ci.bindingCount = 1;
9726 ds_layout_ci.pBindings = &dsl_binding;
9727 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009728 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009729 ASSERT_VK_SUCCESS(err);
9730
9731 VkDescriptorSet descriptor_set = {};
9732 VkDescriptorSetAllocateInfo alloc_info = {};
9733 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9734 alloc_info.descriptorSetCount = 1;
9735 alloc_info.descriptorPool = ds_pool;
9736 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009737 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009738 ASSERT_VK_SUCCESS(err);
9739
9740 // Create a buffer to be used for invalid updates
9741 VkBufferCreateInfo buff_ci = {};
9742 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9743 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009744 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009745 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9746 VkBuffer buffer;
9747 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9748 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009749
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009750 // Have to bind memory to buffer before descriptor update
9751 VkMemoryAllocateInfo mem_alloc = {};
9752 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9753 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009754 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009755 mem_alloc.memoryTypeIndex = 0;
9756
9757 VkMemoryRequirements mem_reqs;
9758 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009759 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009760 if (!pass) {
9761 vkDestroyBuffer(m_device->device(), buffer, NULL);
9762 return;
9763 }
9764
9765 VkDeviceMemory mem;
9766 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9767 ASSERT_VK_SUCCESS(err);
9768 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9769 ASSERT_VK_SUCCESS(err);
9770
9771 VkDescriptorBufferInfo buff_info = {};
9772 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009773 // Cause error due to offset out of range
9774 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009775 buff_info.range = VK_WHOLE_SIZE;
9776 VkWriteDescriptorSet descriptor_write = {};
9777 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9778 descriptor_write.dstBinding = 0;
9779 descriptor_write.descriptorCount = 1;
9780 descriptor_write.pTexelBufferView = nullptr;
9781 descriptor_write.pBufferInfo = &buff_info;
9782 descriptor_write.pImageInfo = nullptr;
9783
9784 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9785 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009787
9788 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9789
9790 m_errorMonitor->VerifyFound();
9791 // Now cause error due to range of 0
9792 buff_info.offset = 0;
9793 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009795
9796 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9797
9798 m_errorMonitor->VerifyFound();
9799 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009800 buff_info.offset = 0;
9801 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009803
9804 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9805
9806 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009807 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009808 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9809 vkDestroyBuffer(m_device->device(), buffer, NULL);
9810 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9811 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9812}
9813
Tobin Ehlis845887e2017-02-02 19:01:44 -07009814TEST_F(VkLayerTest, DSBufferLimitErrors) {
9815 TEST_DESCRIPTION(
9816 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9817 "Test cases include:\n"
9818 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9819 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9820 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9821 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9822 VkResult err;
9823
Tony Barbour1fa09702017-03-16 12:09:08 -06009824 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009825 VkDescriptorPoolSize ds_type_count[2] = {};
9826 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9827 ds_type_count[0].descriptorCount = 1;
9828 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9829 ds_type_count[1].descriptorCount = 1;
9830
9831 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9832 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9833 ds_pool_ci.pNext = NULL;
9834 ds_pool_ci.maxSets = 1;
9835 ds_pool_ci.poolSizeCount = 2;
9836 ds_pool_ci.pPoolSizes = ds_type_count;
9837
9838 VkDescriptorPool ds_pool;
9839 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9840 ASSERT_VK_SUCCESS(err);
9841
9842 // Create layout with single uniform buffer & single storage buffer descriptor
9843 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9844 dsl_binding[0].binding = 0;
9845 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9846 dsl_binding[0].descriptorCount = 1;
9847 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9848 dsl_binding[0].pImmutableSamplers = NULL;
9849 dsl_binding[1].binding = 1;
9850 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9851 dsl_binding[1].descriptorCount = 1;
9852 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9853 dsl_binding[1].pImmutableSamplers = NULL;
9854
9855 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9856 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9857 ds_layout_ci.pNext = NULL;
9858 ds_layout_ci.bindingCount = 2;
9859 ds_layout_ci.pBindings = dsl_binding;
9860 VkDescriptorSetLayout ds_layout;
9861 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9862 ASSERT_VK_SUCCESS(err);
9863
9864 VkDescriptorSet descriptor_set = {};
9865 VkDescriptorSetAllocateInfo alloc_info = {};
9866 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9867 alloc_info.descriptorSetCount = 1;
9868 alloc_info.descriptorPool = ds_pool;
9869 alloc_info.pSetLayouts = &ds_layout;
9870 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9871 ASSERT_VK_SUCCESS(err);
9872
9873 // Create a buffer to be used for invalid updates
9874 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9875 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9876 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9877 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9878 VkBufferCreateInfo ub_ci = {};
9879 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9880 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9881 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9882 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9883 VkBuffer uniform_buffer;
9884 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9885 ASSERT_VK_SUCCESS(err);
9886 VkBufferCreateInfo sb_ci = {};
9887 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9888 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9889 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9890 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9891 VkBuffer storage_buffer;
9892 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9893 ASSERT_VK_SUCCESS(err);
9894 // Have to bind memory to buffer before descriptor update
9895 VkMemoryAllocateInfo mem_alloc = {};
9896 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9897 mem_alloc.pNext = NULL;
9898 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9899 mem_alloc.memoryTypeIndex = 0;
9900
Cort Stratton77a0d592017-02-17 13:14:13 -08009901 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9902 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9903 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9904 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9905 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009906 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009907 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009908 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009909 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9910 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009911 return;
9912 }
9913
9914 VkDeviceMemory mem;
9915 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009916 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009917 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009918 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9919 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9920 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9921 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9922 return;
9923 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009924 ASSERT_VK_SUCCESS(err);
9925 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9926 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009927 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009928 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9929 ASSERT_VK_SUCCESS(err);
9930
9931 VkDescriptorBufferInfo buff_info = {};
9932 buff_info.buffer = uniform_buffer;
9933 buff_info.range = ub_ci.size; // This will exceed limit
9934 VkWriteDescriptorSet descriptor_write = {};
9935 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9936 descriptor_write.dstBinding = 0;
9937 descriptor_write.descriptorCount = 1;
9938 descriptor_write.pTexelBufferView = nullptr;
9939 descriptor_write.pBufferInfo = &buff_info;
9940 descriptor_write.pImageInfo = nullptr;
9941
9942 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9943 descriptor_write.dstSet = descriptor_set;
9944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9945 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9946 m_errorMonitor->VerifyFound();
9947
9948 // Reduce size of range to acceptable limit & cause offset error
9949 buff_info.range = max_ub_range;
9950 buff_info.offset = min_ub_align - 1;
9951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9952 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9953 m_errorMonitor->VerifyFound();
9954
9955 // Now break storage updates
9956 buff_info.buffer = storage_buffer;
9957 buff_info.range = sb_ci.size; // This will exceed limit
9958 buff_info.offset = 0; // Reset offset for this update
9959
9960 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9961 descriptor_write.dstBinding = 1;
9962 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9963 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9964 m_errorMonitor->VerifyFound();
9965
9966 // Reduce size of range to acceptable limit & cause offset error
9967 buff_info.range = max_sb_range;
9968 buff_info.offset = min_sb_align - 1;
9969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9970 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9971 m_errorMonitor->VerifyFound();
9972
9973 vkFreeMemory(m_device->device(), mem, NULL);
9974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9975 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9976 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9977 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9978}
9979
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009980TEST_F(VkLayerTest, DSAspectBitsErrors) {
9981 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9982 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009983 TEST_DESCRIPTION(
9984 "Attempt to update descriptor sets for images "
9985 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009986 VkResult err;
9987
Tony Barbour1fa09702017-03-16 12:09:08 -06009988 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07009989 auto depth_format = find_depth_stencil_format(m_device);
9990 if (!depth_format) {
9991 printf(" No Depth + Stencil format found. Skipped.\n");
9992 return;
9993 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009994 VkDescriptorPoolSize ds_type_count = {};
9995 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9996 ds_type_count.descriptorCount = 1;
9997
9998 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9999 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10000 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -070010001 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010002 ds_pool_ci.maxSets = 5;
10003 ds_pool_ci.poolSizeCount = 1;
10004 ds_pool_ci.pPoolSizes = &ds_type_count;
10005
10006 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010007 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010008 ASSERT_VK_SUCCESS(err);
10009
10010 VkDescriptorSetLayoutBinding dsl_binding = {};
10011 dsl_binding.binding = 0;
10012 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10013 dsl_binding.descriptorCount = 1;
10014 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10015 dsl_binding.pImmutableSamplers = NULL;
10016
10017 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10018 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10019 ds_layout_ci.pNext = NULL;
10020 ds_layout_ci.bindingCount = 1;
10021 ds_layout_ci.pBindings = &dsl_binding;
10022 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010023 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010024 ASSERT_VK_SUCCESS(err);
10025
10026 VkDescriptorSet descriptor_set = {};
10027 VkDescriptorSetAllocateInfo alloc_info = {};
10028 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10029 alloc_info.descriptorSetCount = 1;
10030 alloc_info.descriptorPool = ds_pool;
10031 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010032 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010033 ASSERT_VK_SUCCESS(err);
10034
10035 // Create an image to be used for invalid updates
10036 VkImageCreateInfo image_ci = {};
10037 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10038 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010039 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010040 image_ci.extent.width = 64;
10041 image_ci.extent.height = 64;
10042 image_ci.extent.depth = 1;
10043 image_ci.mipLevels = 1;
10044 image_ci.arrayLayers = 1;
10045 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010046 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010047 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10048 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10049 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10050 VkImage image;
10051 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10052 ASSERT_VK_SUCCESS(err);
10053 // Bind memory to image
10054 VkMemoryRequirements mem_reqs;
10055 VkDeviceMemory image_mem;
10056 bool pass;
10057 VkMemoryAllocateInfo mem_alloc = {};
10058 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10059 mem_alloc.pNext = NULL;
10060 mem_alloc.allocationSize = 0;
10061 mem_alloc.memoryTypeIndex = 0;
10062 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10063 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010064 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010065 ASSERT_TRUE(pass);
10066 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10067 ASSERT_VK_SUCCESS(err);
10068 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10069 ASSERT_VK_SUCCESS(err);
10070 // Now create view for image
10071 VkImageViewCreateInfo image_view_ci = {};
10072 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10073 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010074 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010075 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10076 image_view_ci.subresourceRange.layerCount = 1;
10077 image_view_ci.subresourceRange.baseArrayLayer = 0;
10078 image_view_ci.subresourceRange.levelCount = 1;
10079 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010080 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010081
10082 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010083 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010084 ASSERT_VK_SUCCESS(err);
10085
10086 VkDescriptorImageInfo img_info = {};
10087 img_info.imageView = image_view;
10088 VkWriteDescriptorSet descriptor_write = {};
10089 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10090 descriptor_write.dstBinding = 0;
10091 descriptor_write.descriptorCount = 1;
10092 descriptor_write.pTexelBufferView = NULL;
10093 descriptor_write.pBufferInfo = NULL;
10094 descriptor_write.pImageInfo = &img_info;
10095 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10096 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010097 const char *error_msg =
10098 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10099 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010101
10102 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10103
10104 m_errorMonitor->VerifyFound();
10105 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10106 vkDestroyImage(m_device->device(), image, NULL);
10107 vkFreeMemory(m_device->device(), image_mem, NULL);
10108 vkDestroyImageView(m_device->device(), image_view, NULL);
10109 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10110 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10111}
10112
Karl Schultz6addd812016-02-02 17:17:23 -070010113TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010114 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010115 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010116
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10118 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10119 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010120
Tony Barbour1fa09702017-03-16 12:09:08 -060010121 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010122 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010123 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010124 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10125 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010126
10127 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010128 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10129 ds_pool_ci.pNext = NULL;
10130 ds_pool_ci.maxSets = 1;
10131 ds_pool_ci.poolSizeCount = 1;
10132 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010133
Tobin Ehlis3b780662015-05-28 12:11:26 -060010134 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010135 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010136 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010137 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010138 dsl_binding.binding = 0;
10139 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10140 dsl_binding.descriptorCount = 1;
10141 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10142 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010143
Tony Barboureb254902015-07-15 12:50:33 -060010144 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010145 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10146 ds_layout_ci.pNext = NULL;
10147 ds_layout_ci.bindingCount = 1;
10148 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010149
Tobin Ehlis3b780662015-05-28 12:11:26 -060010150 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010151 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010152 ASSERT_VK_SUCCESS(err);
10153
10154 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010155 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010156 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010157 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010158 alloc_info.descriptorPool = ds_pool;
10159 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010160 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010161 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010162
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010163 VkSamplerCreateInfo sampler_ci = {};
10164 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10165 sampler_ci.pNext = NULL;
10166 sampler_ci.magFilter = VK_FILTER_NEAREST;
10167 sampler_ci.minFilter = VK_FILTER_NEAREST;
10168 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10169 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10170 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10171 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10172 sampler_ci.mipLodBias = 1.0;
10173 sampler_ci.anisotropyEnable = VK_FALSE;
10174 sampler_ci.maxAnisotropy = 1;
10175 sampler_ci.compareEnable = VK_FALSE;
10176 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10177 sampler_ci.minLod = 1.0;
10178 sampler_ci.maxLod = 1.0;
10179 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10180 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10181 VkSampler sampler;
10182 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10183 ASSERT_VK_SUCCESS(err);
10184
10185 VkDescriptorImageInfo info = {};
10186 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010187
10188 VkWriteDescriptorSet descriptor_write;
10189 memset(&descriptor_write, 0, sizeof(descriptor_write));
10190 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010191 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010192 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010193 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010194 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010195 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010196
10197 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10198
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010199 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010200
Chia-I Wuf7458c52015-10-26 21:10:41 +080010201 vkDestroySampler(m_device->device(), sampler, NULL);
10202 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10203 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010204}
10205
Karl Schultz6addd812016-02-02 17:17:23 -070010206TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010207 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010208 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010209
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010211
Tony Barbour1fa09702017-03-16 12:09:08 -060010212 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010213 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010214 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010215 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10216 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010217
10218 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010219 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10220 ds_pool_ci.pNext = NULL;
10221 ds_pool_ci.maxSets = 1;
10222 ds_pool_ci.poolSizeCount = 1;
10223 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010224
Tobin Ehlis3b780662015-05-28 12:11:26 -060010225 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010226 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010227 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010228
Tony Barboureb254902015-07-15 12:50:33 -060010229 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010230 dsl_binding.binding = 0;
10231 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10232 dsl_binding.descriptorCount = 1;
10233 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10234 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010235
10236 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010237 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10238 ds_layout_ci.pNext = NULL;
10239 ds_layout_ci.bindingCount = 1;
10240 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010241
Tobin Ehlis3b780662015-05-28 12:11:26 -060010242 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010243 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010244 ASSERT_VK_SUCCESS(err);
10245
10246 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010247 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010248 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010249 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010250 alloc_info.descriptorPool = ds_pool;
10251 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010252 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010253 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010254
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010255 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10256
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010257 // Correctly update descriptor to avoid "NOT_UPDATED" error
10258 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010259 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010260 buff_info.offset = 0;
10261 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010262
10263 VkWriteDescriptorSet descriptor_write;
10264 memset(&descriptor_write, 0, sizeof(descriptor_write));
10265 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010266 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010267 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010268 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010269 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10270 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010271
10272 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10273
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010274 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010275
Chia-I Wuf7458c52015-10-26 21:10:41 +080010276 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10277 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010278}
10279
Karl Schultz6addd812016-02-02 17:17:23 -070010280TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010281 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010282 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010283
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010285
Tony Barbour1fa09702017-03-16 12:09:08 -060010286 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010287 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010288 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010289 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10290 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010291
10292 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010293 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10294 ds_pool_ci.pNext = NULL;
10295 ds_pool_ci.maxSets = 1;
10296 ds_pool_ci.poolSizeCount = 1;
10297 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010298
Tobin Ehlis3b780662015-05-28 12:11:26 -060010299 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010300 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010301 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010302
Tony Barboureb254902015-07-15 12:50:33 -060010303 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010304 dsl_binding.binding = 0;
10305 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10306 dsl_binding.descriptorCount = 1;
10307 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10308 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010309
10310 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010311 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10312 ds_layout_ci.pNext = NULL;
10313 ds_layout_ci.bindingCount = 1;
10314 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010315 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010316 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010317 ASSERT_VK_SUCCESS(err);
10318
10319 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010320 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010321 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010322 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010323 alloc_info.descriptorPool = ds_pool;
10324 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010325 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010326 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010327
Tony Barboureb254902015-07-15 12:50:33 -060010328 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010329 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10330 sampler_ci.pNext = NULL;
10331 sampler_ci.magFilter = VK_FILTER_NEAREST;
10332 sampler_ci.minFilter = VK_FILTER_NEAREST;
10333 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10334 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10335 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10336 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10337 sampler_ci.mipLodBias = 1.0;
10338 sampler_ci.anisotropyEnable = VK_FALSE;
10339 sampler_ci.maxAnisotropy = 1;
10340 sampler_ci.compareEnable = VK_FALSE;
10341 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10342 sampler_ci.minLod = 1.0;
10343 sampler_ci.maxLod = 1.0;
10344 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10345 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010346
Tobin Ehlis3b780662015-05-28 12:11:26 -060010347 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010348 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010349 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010350
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010351 VkDescriptorImageInfo info = {};
10352 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010353
10354 VkWriteDescriptorSet descriptor_write;
10355 memset(&descriptor_write, 0, sizeof(descriptor_write));
10356 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010357 descriptor_write.dstSet = descriptorSet;
10358 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010359 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010360 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010361 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010362 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010363
10364 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10365
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010366 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010367
Chia-I Wuf7458c52015-10-26 21:10:41 +080010368 vkDestroySampler(m_device->device(), sampler, NULL);
10369 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10370 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010371}
10372
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010373TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10374 // Create layout w/ empty binding and attempt to update it
10375 VkResult err;
10376
Tony Barbour1fa09702017-03-16 12:09:08 -060010377 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010378
10379 VkDescriptorPoolSize ds_type_count = {};
10380 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10381 ds_type_count.descriptorCount = 1;
10382
10383 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10384 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10385 ds_pool_ci.pNext = NULL;
10386 ds_pool_ci.maxSets = 1;
10387 ds_pool_ci.poolSizeCount = 1;
10388 ds_pool_ci.pPoolSizes = &ds_type_count;
10389
10390 VkDescriptorPool ds_pool;
10391 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10392 ASSERT_VK_SUCCESS(err);
10393
10394 VkDescriptorSetLayoutBinding dsl_binding = {};
10395 dsl_binding.binding = 0;
10396 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10397 dsl_binding.descriptorCount = 0;
10398 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10399 dsl_binding.pImmutableSamplers = NULL;
10400
10401 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10402 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10403 ds_layout_ci.pNext = NULL;
10404 ds_layout_ci.bindingCount = 1;
10405 ds_layout_ci.pBindings = &dsl_binding;
10406 VkDescriptorSetLayout ds_layout;
10407 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10408 ASSERT_VK_SUCCESS(err);
10409
10410 VkDescriptorSet descriptor_set;
10411 VkDescriptorSetAllocateInfo alloc_info = {};
10412 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10413 alloc_info.descriptorSetCount = 1;
10414 alloc_info.descriptorPool = ds_pool;
10415 alloc_info.pSetLayouts = &ds_layout;
10416 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10417 ASSERT_VK_SUCCESS(err);
10418
10419 VkSamplerCreateInfo sampler_ci = {};
10420 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10421 sampler_ci.magFilter = VK_FILTER_NEAREST;
10422 sampler_ci.minFilter = VK_FILTER_NEAREST;
10423 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10424 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10425 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10426 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10427 sampler_ci.mipLodBias = 1.0;
10428 sampler_ci.maxAnisotropy = 1;
10429 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10430 sampler_ci.minLod = 1.0;
10431 sampler_ci.maxLod = 1.0;
10432 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10433
10434 VkSampler sampler;
10435 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10436 ASSERT_VK_SUCCESS(err);
10437
10438 VkDescriptorImageInfo info = {};
10439 info.sampler = sampler;
10440
10441 VkWriteDescriptorSet descriptor_write;
10442 memset(&descriptor_write, 0, sizeof(descriptor_write));
10443 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10444 descriptor_write.dstSet = descriptor_set;
10445 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010446 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010447 // This is the wrong type, but empty binding error will be flagged first
10448 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10449 descriptor_write.pImageInfo = &info;
10450
10451 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10452 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10453 m_errorMonitor->VerifyFound();
10454
10455 vkDestroySampler(m_device->device(), sampler, NULL);
10456 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10457 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10458}
10459
Karl Schultz6addd812016-02-02 17:17:23 -070010460TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10461 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10462 // types
10463 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010464
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010465 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 -060010466
Tony Barbour1fa09702017-03-16 12:09:08 -060010467 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010468
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010469 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010470 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10471 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010472
10473 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010474 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10475 ds_pool_ci.pNext = NULL;
10476 ds_pool_ci.maxSets = 1;
10477 ds_pool_ci.poolSizeCount = 1;
10478 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010479
Tobin Ehlis3b780662015-05-28 12:11:26 -060010480 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010481 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010482 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010483 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010484 dsl_binding.binding = 0;
10485 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10486 dsl_binding.descriptorCount = 1;
10487 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10488 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010489
Tony Barboureb254902015-07-15 12:50:33 -060010490 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010491 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10492 ds_layout_ci.pNext = NULL;
10493 ds_layout_ci.bindingCount = 1;
10494 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010495
Tobin Ehlis3b780662015-05-28 12:11:26 -060010496 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010497 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010498 ASSERT_VK_SUCCESS(err);
10499
10500 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010501 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010502 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010503 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010504 alloc_info.descriptorPool = ds_pool;
10505 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010506 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010507 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010508
Tony Barboureb254902015-07-15 12:50:33 -060010509 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010510 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10511 sampler_ci.pNext = NULL;
10512 sampler_ci.magFilter = VK_FILTER_NEAREST;
10513 sampler_ci.minFilter = VK_FILTER_NEAREST;
10514 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10515 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10516 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10517 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10518 sampler_ci.mipLodBias = 1.0;
10519 sampler_ci.anisotropyEnable = VK_FALSE;
10520 sampler_ci.maxAnisotropy = 1;
10521 sampler_ci.compareEnable = VK_FALSE;
10522 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10523 sampler_ci.minLod = 1.0;
10524 sampler_ci.maxLod = 1.0;
10525 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10526 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010527 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010528 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010529 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010530
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010531 VkDescriptorImageInfo info = {};
10532 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010533
10534 VkWriteDescriptorSet descriptor_write;
10535 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010536 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010537 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010538 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010539 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010540 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010541 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010542
10543 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10544
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010545 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010546
Chia-I Wuf7458c52015-10-26 21:10:41 +080010547 vkDestroySampler(m_device->device(), sampler, NULL);
10548 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10549 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010550}
10551
Karl Schultz6addd812016-02-02 17:17:23 -070010552TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010553 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010554 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010555
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010556 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010557
Tony Barbour1fa09702017-03-16 12:09:08 -060010558 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010559 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10560 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010561 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010562 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10563 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010564
10565 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010566 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10567 ds_pool_ci.pNext = NULL;
10568 ds_pool_ci.maxSets = 1;
10569 ds_pool_ci.poolSizeCount = 1;
10570 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010571
10572 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010573 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010574 ASSERT_VK_SUCCESS(err);
10575
10576 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010577 dsl_binding.binding = 0;
10578 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10579 dsl_binding.descriptorCount = 1;
10580 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10581 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010582
10583 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010584 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10585 ds_layout_ci.pNext = NULL;
10586 ds_layout_ci.bindingCount = 1;
10587 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010588 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010589 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010590 ASSERT_VK_SUCCESS(err);
10591
10592 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010593 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010594 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010595 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010596 alloc_info.descriptorPool = ds_pool;
10597 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010598 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010599 ASSERT_VK_SUCCESS(err);
10600
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010601 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010602
10603 VkDescriptorImageInfo descriptor_info;
10604 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10605 descriptor_info.sampler = sampler;
10606
10607 VkWriteDescriptorSet descriptor_write;
10608 memset(&descriptor_write, 0, sizeof(descriptor_write));
10609 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010610 descriptor_write.dstSet = descriptorSet;
10611 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010612 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010613 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10614 descriptor_write.pImageInfo = &descriptor_info;
10615
10616 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10617
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010618 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010619
Chia-I Wuf7458c52015-10-26 21:10:41 +080010620 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10621 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010622}
10623
Karl Schultz6addd812016-02-02 17:17:23 -070010624TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10625 // Create a single combined Image/Sampler descriptor and send it an invalid
10626 // imageView
10627 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010628
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010630
Tony Barbour1fa09702017-03-16 12:09:08 -060010631 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010632 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010633 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10634 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010635
10636 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010637 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10638 ds_pool_ci.pNext = NULL;
10639 ds_pool_ci.maxSets = 1;
10640 ds_pool_ci.poolSizeCount = 1;
10641 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010642
10643 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010644 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010645 ASSERT_VK_SUCCESS(err);
10646
10647 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010648 dsl_binding.binding = 0;
10649 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10650 dsl_binding.descriptorCount = 1;
10651 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10652 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010653
10654 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010655 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10656 ds_layout_ci.pNext = NULL;
10657 ds_layout_ci.bindingCount = 1;
10658 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010659 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010660 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010661 ASSERT_VK_SUCCESS(err);
10662
10663 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010664 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010665 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010666 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010667 alloc_info.descriptorPool = ds_pool;
10668 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010669 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010670 ASSERT_VK_SUCCESS(err);
10671
10672 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010673 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10674 sampler_ci.pNext = NULL;
10675 sampler_ci.magFilter = VK_FILTER_NEAREST;
10676 sampler_ci.minFilter = VK_FILTER_NEAREST;
10677 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10678 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10679 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10680 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10681 sampler_ci.mipLodBias = 1.0;
10682 sampler_ci.anisotropyEnable = VK_FALSE;
10683 sampler_ci.maxAnisotropy = 1;
10684 sampler_ci.compareEnable = VK_FALSE;
10685 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10686 sampler_ci.minLod = 1.0;
10687 sampler_ci.maxLod = 1.0;
10688 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10689 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010690
10691 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010692 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010693 ASSERT_VK_SUCCESS(err);
10694
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010695 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010696
10697 VkDescriptorImageInfo descriptor_info;
10698 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10699 descriptor_info.sampler = sampler;
10700 descriptor_info.imageView = view;
10701
10702 VkWriteDescriptorSet descriptor_write;
10703 memset(&descriptor_write, 0, sizeof(descriptor_write));
10704 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010705 descriptor_write.dstSet = descriptorSet;
10706 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010707 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010708 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10709 descriptor_write.pImageInfo = &descriptor_info;
10710
10711 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10712
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010713 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010714
Chia-I Wuf7458c52015-10-26 21:10:41 +080010715 vkDestroySampler(m_device->device(), sampler, NULL);
10716 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10717 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010718}
10719
Karl Schultz6addd812016-02-02 17:17:23 -070010720TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10721 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10722 // into the other
10723 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010724
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10726 " binding #1 with type "
10727 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10728 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010729
Tony Barbour1fa09702017-03-16 12:09:08 -060010730 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010731 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010732 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010733 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10734 ds_type_count[0].descriptorCount = 1;
10735 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10736 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010737
10738 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010739 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10740 ds_pool_ci.pNext = NULL;
10741 ds_pool_ci.maxSets = 1;
10742 ds_pool_ci.poolSizeCount = 2;
10743 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010744
10745 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010746 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010747 ASSERT_VK_SUCCESS(err);
10748 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010749 dsl_binding[0].binding = 0;
10750 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10751 dsl_binding[0].descriptorCount = 1;
10752 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10753 dsl_binding[0].pImmutableSamplers = NULL;
10754 dsl_binding[1].binding = 1;
10755 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10756 dsl_binding[1].descriptorCount = 1;
10757 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10758 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010759
10760 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010761 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10762 ds_layout_ci.pNext = NULL;
10763 ds_layout_ci.bindingCount = 2;
10764 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010765
10766 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010767 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010768 ASSERT_VK_SUCCESS(err);
10769
10770 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010771 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010772 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010773 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010774 alloc_info.descriptorPool = ds_pool;
10775 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010776 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010777 ASSERT_VK_SUCCESS(err);
10778
10779 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010780 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10781 sampler_ci.pNext = NULL;
10782 sampler_ci.magFilter = VK_FILTER_NEAREST;
10783 sampler_ci.minFilter = VK_FILTER_NEAREST;
10784 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10785 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10786 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10787 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10788 sampler_ci.mipLodBias = 1.0;
10789 sampler_ci.anisotropyEnable = VK_FALSE;
10790 sampler_ci.maxAnisotropy = 1;
10791 sampler_ci.compareEnable = VK_FALSE;
10792 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10793 sampler_ci.minLod = 1.0;
10794 sampler_ci.maxLod = 1.0;
10795 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10796 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010797
10798 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010799 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010800 ASSERT_VK_SUCCESS(err);
10801
10802 VkDescriptorImageInfo info = {};
10803 info.sampler = sampler;
10804
10805 VkWriteDescriptorSet descriptor_write;
10806 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10807 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010808 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010809 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010810 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010811 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10812 descriptor_write.pImageInfo = &info;
10813 // This write update should succeed
10814 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10815 // Now perform a copy update that fails due to type mismatch
10816 VkCopyDescriptorSet copy_ds_update;
10817 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10818 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10819 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010820 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010821 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010822 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10823 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010824 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10825
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010826 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010827 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010828 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 -060010829 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10830 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10831 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010832 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010833 copy_ds_update.dstSet = descriptorSet;
10834 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010835 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010836 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10837
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010838 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010839
Tobin Ehlis04356f92015-10-27 16:35:27 -060010840 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10842 " binding#1 with offset index of 1 plus "
10843 "update array offset of 0 and update of "
10844 "5 descriptors oversteps total number "
10845 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010846
Tobin Ehlis04356f92015-10-27 16:35:27 -060010847 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10848 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10849 copy_ds_update.srcSet = descriptorSet;
10850 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010851 copy_ds_update.dstSet = descriptorSet;
10852 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010853 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010854 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10855
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010856 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010857
Chia-I Wuf7458c52015-10-26 21:10:41 +080010858 vkDestroySampler(m_device->device(), sampler, NULL);
10859 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10860 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010861}
10862
Karl Schultz6addd812016-02-02 17:17:23 -070010863TEST_F(VkLayerTest, NumSamplesMismatch) {
10864 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10865 // sampleCount
10866 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010867
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010869
Tony Barbour1fa09702017-03-16 12:09:08 -060010870 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010871 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010872 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010873 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010874 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010875
10876 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010877 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10878 ds_pool_ci.pNext = NULL;
10879 ds_pool_ci.maxSets = 1;
10880 ds_pool_ci.poolSizeCount = 1;
10881 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010882
Tobin Ehlis3b780662015-05-28 12:11:26 -060010883 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010884 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010885 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010886
Tony Barboureb254902015-07-15 12:50:33 -060010887 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010888 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010889 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010890 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010891 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10892 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010893
Tony Barboureb254902015-07-15 12:50:33 -060010894 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10895 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10896 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010897 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010898 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010899
Tobin Ehlis3b780662015-05-28 12:11:26 -060010900 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010901 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010902 ASSERT_VK_SUCCESS(err);
10903
10904 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010905 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010906 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010907 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010908 alloc_info.descriptorPool = ds_pool;
10909 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010910 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010911 ASSERT_VK_SUCCESS(err);
10912
Tony Barboureb254902015-07-15 12:50:33 -060010913 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010914 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010915 pipe_ms_state_ci.pNext = NULL;
10916 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10917 pipe_ms_state_ci.sampleShadingEnable = 0;
10918 pipe_ms_state_ci.minSampleShading = 1.0;
10919 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010920
Tony Barboureb254902015-07-15 12:50:33 -060010921 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010922 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10923 pipeline_layout_ci.pNext = NULL;
10924 pipeline_layout_ci.setLayoutCount = 1;
10925 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010926
10927 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010928 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010929 ASSERT_VK_SUCCESS(err);
10930
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010931 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010932 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 -060010933 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010934 VkPipelineObj pipe(m_device);
10935 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010936 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010937 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010938 pipe.SetMSAA(&pipe_ms_state_ci);
10939 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010940
Tony Barbour552f6c02016-12-21 14:34:07 -070010941 m_commandBuffer->BeginCommandBuffer();
10942 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010943 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010944
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010945 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10946 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10947 VkRect2D scissor = {{0, 0}, {16, 16}};
10948 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10949
Mark Young29927482016-05-04 14:38:51 -060010950 // Render triangle (the error should trigger on the attempt to draw).
10951 Draw(3, 1, 0, 0);
10952
10953 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010954 m_commandBuffer->EndRenderPass();
10955 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010956
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010957 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010958
Chia-I Wuf7458c52015-10-26 21:10:41 +080010959 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10960 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10961 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010962}
Mark Young29927482016-05-04 14:38:51 -060010963
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010964TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010965 TEST_DESCRIPTION(
10966 "Hit RenderPass incompatible cases. "
10967 "Initial case is drawing with an active renderpass that's "
10968 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010969 VkResult err;
10970
Tony Barbour1fa09702017-03-16 12:09:08 -060010971 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010972 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10973
10974 VkDescriptorSetLayoutBinding dsl_binding = {};
10975 dsl_binding.binding = 0;
10976 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10977 dsl_binding.descriptorCount = 1;
10978 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10979 dsl_binding.pImmutableSamplers = NULL;
10980
10981 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10982 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10983 ds_layout_ci.pNext = NULL;
10984 ds_layout_ci.bindingCount = 1;
10985 ds_layout_ci.pBindings = &dsl_binding;
10986
10987 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010988 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010989 ASSERT_VK_SUCCESS(err);
10990
10991 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10992 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10993 pipeline_layout_ci.pNext = NULL;
10994 pipeline_layout_ci.setLayoutCount = 1;
10995 pipeline_layout_ci.pSetLayouts = &ds_layout;
10996
10997 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010998 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010999 ASSERT_VK_SUCCESS(err);
11000
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011001 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011002 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 -060011003 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011004 // Create a renderpass that will be incompatible with default renderpass
11005 VkAttachmentReference attach = {};
11006 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11007 VkAttachmentReference color_att = {};
11008 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11009 VkSubpassDescription subpass = {};
11010 subpass.inputAttachmentCount = 1;
11011 subpass.pInputAttachments = &attach;
11012 subpass.colorAttachmentCount = 1;
11013 subpass.pColorAttachments = &color_att;
11014 VkRenderPassCreateInfo rpci = {};
11015 rpci.subpassCount = 1;
11016 rpci.pSubpasses = &subpass;
11017 rpci.attachmentCount = 1;
11018 VkAttachmentDescription attach_desc = {};
11019 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011020 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11021 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011022 rpci.pAttachments = &attach_desc;
11023 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11024 VkRenderPass rp;
11025 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11026 VkPipelineObj pipe(m_device);
11027 pipe.AddShader(&vs);
11028 pipe.AddShader(&fs);
11029 pipe.AddColorAttachment();
11030 VkViewport view_port = {};
11031 m_viewports.push_back(view_port);
11032 pipe.SetViewport(m_viewports);
11033 VkRect2D rect = {};
11034 m_scissors.push_back(rect);
11035 pipe.SetScissor(m_scissors);
11036 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11037
11038 VkCommandBufferInheritanceInfo cbii = {};
11039 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11040 cbii.renderPass = rp;
11041 cbii.subpass = 0;
11042 VkCommandBufferBeginInfo cbbi = {};
11043 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11044 cbbi.pInheritanceInfo = &cbii;
11045 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11046 VkRenderPassBeginInfo rpbi = {};
11047 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11048 rpbi.framebuffer = m_framebuffer;
11049 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011050 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11051 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011052
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011054 // Render triangle (the error should trigger on the attempt to draw).
11055 Draw(3, 1, 0, 0);
11056
11057 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011058 m_commandBuffer->EndRenderPass();
11059 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011060
11061 m_errorMonitor->VerifyFound();
11062
11063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11065 vkDestroyRenderPass(m_device->device(), rp, NULL);
11066}
11067
Mark Youngc89c6312016-03-31 16:03:20 -060011068TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11069 // Create Pipeline where the number of blend attachments doesn't match the
11070 // number of color attachments. In this case, we don't add any color
11071 // blend attachments even though we have a color attachment.
11072 VkResult err;
11073
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011075
Tony Barbour1fa09702017-03-16 12:09:08 -060011076 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011077 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11078 VkDescriptorPoolSize ds_type_count = {};
11079 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11080 ds_type_count.descriptorCount = 1;
11081
11082 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11083 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11084 ds_pool_ci.pNext = NULL;
11085 ds_pool_ci.maxSets = 1;
11086 ds_pool_ci.poolSizeCount = 1;
11087 ds_pool_ci.pPoolSizes = &ds_type_count;
11088
11089 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011090 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011091 ASSERT_VK_SUCCESS(err);
11092
11093 VkDescriptorSetLayoutBinding dsl_binding = {};
11094 dsl_binding.binding = 0;
11095 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11096 dsl_binding.descriptorCount = 1;
11097 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11098 dsl_binding.pImmutableSamplers = NULL;
11099
11100 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11101 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11102 ds_layout_ci.pNext = NULL;
11103 ds_layout_ci.bindingCount = 1;
11104 ds_layout_ci.pBindings = &dsl_binding;
11105
11106 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011107 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011108 ASSERT_VK_SUCCESS(err);
11109
11110 VkDescriptorSet descriptorSet;
11111 VkDescriptorSetAllocateInfo alloc_info = {};
11112 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11113 alloc_info.descriptorSetCount = 1;
11114 alloc_info.descriptorPool = ds_pool;
11115 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011116 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011117 ASSERT_VK_SUCCESS(err);
11118
11119 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011120 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011121 pipe_ms_state_ci.pNext = NULL;
11122 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11123 pipe_ms_state_ci.sampleShadingEnable = 0;
11124 pipe_ms_state_ci.minSampleShading = 1.0;
11125 pipe_ms_state_ci.pSampleMask = NULL;
11126
11127 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11128 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11129 pipeline_layout_ci.pNext = NULL;
11130 pipeline_layout_ci.setLayoutCount = 1;
11131 pipeline_layout_ci.pSetLayouts = &ds_layout;
11132
11133 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011134 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011135 ASSERT_VK_SUCCESS(err);
11136
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011137 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011138 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 -060011139 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011140 VkPipelineObj pipe(m_device);
11141 pipe.AddShader(&vs);
11142 pipe.AddShader(&fs);
11143 pipe.SetMSAA(&pipe_ms_state_ci);
11144 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011145 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011146
11147 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11148 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11149 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11150}
Mark Young29927482016-05-04 14:38:51 -060011151
Mark Muellerd4914412016-06-13 17:52:06 -060011152TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011153 TEST_DESCRIPTION(
11154 "Points to a wrong colorAttachment index in a VkClearAttachment "
11155 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011156 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011158
11159 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11160 m_errorMonitor->VerifyFound();
11161}
11162
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011163TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011164 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11165 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011166
Tony Barbour1fa09702017-03-16 12:09:08 -060011167 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011169
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011170 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011171 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11172 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011173
11174 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011175 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11176 ds_pool_ci.pNext = NULL;
11177 ds_pool_ci.maxSets = 1;
11178 ds_pool_ci.poolSizeCount = 1;
11179 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011180
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011181 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011182 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011183 ASSERT_VK_SUCCESS(err);
11184
Tony Barboureb254902015-07-15 12:50:33 -060011185 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011186 dsl_binding.binding = 0;
11187 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11188 dsl_binding.descriptorCount = 1;
11189 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11190 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011191
Tony Barboureb254902015-07-15 12:50:33 -060011192 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011193 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11194 ds_layout_ci.pNext = NULL;
11195 ds_layout_ci.bindingCount = 1;
11196 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011197
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011198 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011199 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011200 ASSERT_VK_SUCCESS(err);
11201
11202 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011203 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011204 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011205 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011206 alloc_info.descriptorPool = ds_pool;
11207 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011208 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011209 ASSERT_VK_SUCCESS(err);
11210
Tony Barboureb254902015-07-15 12:50:33 -060011211 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011212 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011213 pipe_ms_state_ci.pNext = NULL;
11214 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11215 pipe_ms_state_ci.sampleShadingEnable = 0;
11216 pipe_ms_state_ci.minSampleShading = 1.0;
11217 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011218
Tony Barboureb254902015-07-15 12:50:33 -060011219 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011220 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11221 pipeline_layout_ci.pNext = NULL;
11222 pipeline_layout_ci.setLayoutCount = 1;
11223 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011224
11225 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011226 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011227 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011228
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011230 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011231 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011232 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011233
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011234 VkPipelineObj pipe(m_device);
11235 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011236 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011237 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011238 pipe.SetMSAA(&pipe_ms_state_ci);
11239 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011240
Tony Barbour552f6c02016-12-21 14:34:07 -070011241 m_commandBuffer->BeginCommandBuffer();
11242 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011243
Karl Schultz6addd812016-02-02 17:17:23 -070011244 // Main thing we care about for this test is that the VkImage obj we're
11245 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011246 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011247 VkClearAttachment color_attachment;
11248 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11249 color_attachment.clearValue.color.float32[0] = 1.0;
11250 color_attachment.clearValue.color.float32[1] = 1.0;
11251 color_attachment.clearValue.color.float32[2] = 1.0;
11252 color_attachment.clearValue.color.float32[3] = 1.0;
11253 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011254 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011255
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011256 // Call for full-sized FB Color attachment prior to issuing a Draw
11257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011258 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011259 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011260 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011261
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011262 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11263 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11265 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11266 m_errorMonitor->VerifyFound();
11267
11268 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11269 clear_rect.layerCount = 2;
11270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11271 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011272 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011273
Chia-I Wuf7458c52015-10-26 21:10:41 +080011274 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11275 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11276 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011277}
11278
Karl Schultz6addd812016-02-02 17:17:23 -070011279TEST_F(VkLayerTest, VtxBufferBadIndex) {
11280 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11283 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011284
Tony Barbour1fa09702017-03-16 12:09:08 -060011285 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011286 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011287 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011288
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011290 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11291 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011292
11293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11295 ds_pool_ci.pNext = NULL;
11296 ds_pool_ci.maxSets = 1;
11297 ds_pool_ci.poolSizeCount = 1;
11298 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011299
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011300 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011301 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011302 ASSERT_VK_SUCCESS(err);
11303
Tony Barboureb254902015-07-15 12:50:33 -060011304 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011305 dsl_binding.binding = 0;
11306 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11307 dsl_binding.descriptorCount = 1;
11308 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11309 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011310
Tony Barboureb254902015-07-15 12:50:33 -060011311 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011312 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11313 ds_layout_ci.pNext = NULL;
11314 ds_layout_ci.bindingCount = 1;
11315 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011316
Tobin Ehlis502480b2015-06-24 15:53:07 -060011317 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011318 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011319 ASSERT_VK_SUCCESS(err);
11320
11321 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011322 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011323 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011324 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011325 alloc_info.descriptorPool = ds_pool;
11326 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011327 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011328 ASSERT_VK_SUCCESS(err);
11329
Tony Barboureb254902015-07-15 12:50:33 -060011330 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011331 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011332 pipe_ms_state_ci.pNext = NULL;
11333 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11334 pipe_ms_state_ci.sampleShadingEnable = 0;
11335 pipe_ms_state_ci.minSampleShading = 1.0;
11336 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011337
Tony Barboureb254902015-07-15 12:50:33 -060011338 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011339 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11340 pipeline_layout_ci.pNext = NULL;
11341 pipeline_layout_ci.setLayoutCount = 1;
11342 pipeline_layout_ci.pSetLayouts = &ds_layout;
11343 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011345 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011346 ASSERT_VK_SUCCESS(err);
11347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011349 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 -060011350 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011351 VkPipelineObj pipe(m_device);
11352 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011353 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011354 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011355 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011356 pipe.SetViewport(m_viewports);
11357 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011358 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011359
Tony Barbour552f6c02016-12-21 14:34:07 -070011360 m_commandBuffer->BeginCommandBuffer();
11361 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011362 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011363 // Don't care about actual data, just need to get to draw to flag error
11364 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011365 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011366 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011367 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011368
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011369 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011370
Chia-I Wuf7458c52015-10-26 21:10:41 +080011371 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11372 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11373 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011374}
Mark Muellerdfe37552016-07-07 14:47:42 -060011375
Mark Mueller2ee294f2016-08-04 12:59:48 -060011376TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011377 TEST_DESCRIPTION(
11378 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11379 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011380 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011381
Mark Mueller880fce52016-08-17 15:23:23 -060011382 // The following test fails with recent NVidia drivers.
11383 // By the time core_validation is reached, the NVidia
11384 // driver has sanitized the invalid condition and core_validation
11385 // is not introduced to the failure condition. This is not the case
11386 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011387 // uint32_t count = static_cast<uint32_t>(~0);
11388 // VkPhysicalDevice physical_device;
11389 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11390 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011391
Mark Mueller2ee294f2016-08-04 12:59:48 -060011392 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011393 VkDeviceQueueCreateInfo queue_create_info = {};
11394 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11395 queue_create_info.queueCount = 1;
11396 queue_create_info.pQueuePriorities = &queue_priority;
11397 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11398
11399 VkPhysicalDeviceFeatures features = m_device->phy().features();
11400 VkDevice testDevice;
11401 VkDeviceCreateInfo device_create_info = {};
11402 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11403 device_create_info.queueCreateInfoCount = 1;
11404 device_create_info.pQueueCreateInfos = &queue_create_info;
11405 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011406
11407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11408 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011409 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11410 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11411 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011412 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11413 m_errorMonitor->VerifyFound();
11414
11415 queue_create_info.queueFamilyIndex = 1;
11416
11417 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11418 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11419 for (unsigned i = 0; i < feature_count; i++) {
11420 if (VK_FALSE == feature_array[i]) {
11421 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011422 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11424 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011425 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11426 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11427 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11429 "You requested features that are unavailable on this device. You should first "
11430 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011431 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11432 m_errorMonitor->VerifyFound();
11433 break;
11434 }
11435 }
11436}
11437
Tobin Ehlis16edf082016-11-21 12:33:49 -070011438TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11439 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11440
Tony Barbour1fa09702017-03-16 12:09:08 -060011441 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011442
11443 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11444 std::vector<VkDeviceQueueCreateInfo> queue_info;
11445 queue_info.reserve(queue_props.size());
11446 std::vector<std::vector<float>> queue_priorities;
11447 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11448 VkDeviceQueueCreateInfo qi{};
11449 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11450 qi.queueFamilyIndex = i;
11451 qi.queueCount = queue_props[i].queueCount;
11452 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11453 qi.pQueuePriorities = queue_priorities[i].data();
11454 queue_info.push_back(qi);
11455 }
11456
11457 std::vector<const char *> device_extension_names;
11458
11459 VkDevice local_device;
11460 VkDeviceCreateInfo device_create_info = {};
11461 auto features = m_device->phy().features();
11462 // Intentionally disable pipeline stats
11463 features.pipelineStatisticsQuery = VK_FALSE;
11464 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11465 device_create_info.pNext = NULL;
11466 device_create_info.queueCreateInfoCount = queue_info.size();
11467 device_create_info.pQueueCreateInfos = queue_info.data();
11468 device_create_info.enabledLayerCount = 0;
11469 device_create_info.ppEnabledLayerNames = NULL;
11470 device_create_info.pEnabledFeatures = &features;
11471 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11472 ASSERT_VK_SUCCESS(err);
11473
11474 VkQueryPoolCreateInfo qpci{};
11475 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11476 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11477 qpci.queryCount = 1;
11478 VkQueryPool query_pool;
11479
11480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11481 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11482 m_errorMonitor->VerifyFound();
11483
11484 vkDestroyDevice(local_device, nullptr);
11485}
11486
Mark Mueller2ee294f2016-08-04 12:59:48 -060011487TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011488 TEST_DESCRIPTION(
11489 "Use an invalid queue index in a vkCmdWaitEvents call."
11490 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011491
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011492 const char *invalid_queue_index =
11493 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11494 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11495 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011497 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011498
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011500
Tony Barbour1fa09702017-03-16 12:09:08 -060011501 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011502
11503 VkEvent event;
11504 VkEventCreateInfo event_create_info{};
11505 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11506 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11507
Mark Mueller2ee294f2016-08-04 12:59:48 -060011508 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011509 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011510
Tony Barbour552f6c02016-12-21 14:34:07 -070011511 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011512
11513 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011514 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 -060011515 ASSERT_TRUE(image.initialized());
11516 VkImageMemoryBarrier img_barrier = {};
11517 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11518 img_barrier.pNext = NULL;
11519 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11520 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11521 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11522 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11523 img_barrier.image = image.handle();
11524 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011525
11526 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11527 // that layer validation catches the case when it is not.
11528 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011529 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11530 img_barrier.subresourceRange.baseArrayLayer = 0;
11531 img_barrier.subresourceRange.baseMipLevel = 0;
11532 img_barrier.subresourceRange.layerCount = 1;
11533 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011534 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11535 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011536 m_errorMonitor->VerifyFound();
11537
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011539
11540 VkQueryPool query_pool;
11541 VkQueryPoolCreateInfo query_pool_create_info = {};
11542 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11543 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11544 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011545 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011546
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011547 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011548 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11549
11550 vkEndCommandBuffer(m_commandBuffer->handle());
11551 m_errorMonitor->VerifyFound();
11552
11553 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11554 vkDestroyEvent(m_device->device(), event, nullptr);
11555}
11556
Mark Muellerdfe37552016-07-07 14:47:42 -060011557TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011558 TEST_DESCRIPTION(
11559 "Submit a command buffer using deleted vertex buffer, "
11560 "delete a buffer twice, use an invalid offset for each "
11561 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011562
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011563 const char *deleted_buffer_in_command_buffer =
11564 "Cannot submit cmd buffer "
11565 "using deleted buffer ";
11566 const char *invalid_offset_message =
11567 "vkBindBufferMemory(): "
11568 "memoryOffset is 0x";
11569 const char *invalid_storage_buffer_offset_message =
11570 "vkBindBufferMemory(): "
11571 "storage memoryOffset "
11572 "is 0x";
11573 const char *invalid_texel_buffer_offset_message =
11574 "vkBindBufferMemory(): "
11575 "texel memoryOffset "
11576 "is 0x";
11577 const char *invalid_uniform_buffer_offset_message =
11578 "vkBindBufferMemory(): "
11579 "uniform memoryOffset "
11580 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011581
Tony Barbour1fa09702017-03-16 12:09:08 -060011582 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011583 ASSERT_NO_FATAL_FAILURE(InitViewport());
11584 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11585
11586 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011587 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011588 pipe_ms_state_ci.pNext = NULL;
11589 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11590 pipe_ms_state_ci.sampleShadingEnable = 0;
11591 pipe_ms_state_ci.minSampleShading = 1.0;
11592 pipe_ms_state_ci.pSampleMask = nullptr;
11593
11594 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11595 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11596 VkPipelineLayout pipeline_layout;
11597
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011598 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011599 ASSERT_VK_SUCCESS(err);
11600
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011601 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11602 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011603 VkPipelineObj pipe(m_device);
11604 pipe.AddShader(&vs);
11605 pipe.AddShader(&fs);
11606 pipe.AddColorAttachment();
11607 pipe.SetMSAA(&pipe_ms_state_ci);
11608 pipe.SetViewport(m_viewports);
11609 pipe.SetScissor(m_scissors);
11610 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11611
Tony Barbour552f6c02016-12-21 14:34:07 -070011612 m_commandBuffer->BeginCommandBuffer();
11613 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011614 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011615
11616 {
11617 // Create and bind a vertex buffer in a reduced scope, which will cause
11618 // it to be deleted upon leaving this scope
11619 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011620 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011621 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11622 draw_verticies.AddVertexInputToPipe(pipe);
11623 }
11624
11625 Draw(1, 0, 0, 0);
11626
Tony Barbour552f6c02016-12-21 14:34:07 -070011627 m_commandBuffer->EndRenderPass();
11628 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011629
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011631 QueueCommandBuffer(false);
11632 m_errorMonitor->VerifyFound();
11633
11634 {
11635 // Create and bind a vertex buffer in a reduced scope, and delete it
11636 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011637 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011639 buffer_test.TestDoubleDestroy();
11640 }
11641 m_errorMonitor->VerifyFound();
11642
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011643 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011644 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011645 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011647 m_errorMonitor->SetUnexpectedError(
11648 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11649 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011650 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11651 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011652 m_errorMonitor->VerifyFound();
11653 }
11654
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011655 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11656 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011657 // Create and bind a memory buffer with an invalid offset again,
11658 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011660 m_errorMonitor->SetUnexpectedError(
11661 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11662 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011663 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11664 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011665 m_errorMonitor->VerifyFound();
11666 }
11667
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011668 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011669 // Create and bind a memory buffer with an invalid offset again, but
11670 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011672 m_errorMonitor->SetUnexpectedError(
11673 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11674 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011675 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11676 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011677 m_errorMonitor->VerifyFound();
11678 }
11679
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011680 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011681 // Create and bind a memory buffer with an invalid offset again, but
11682 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011684 m_errorMonitor->SetUnexpectedError(
11685 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11686 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011687 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11688 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011689 m_errorMonitor->VerifyFound();
11690 }
11691
11692 {
11693 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011694 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011695 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11696 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011697 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11698 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011699 m_errorMonitor->VerifyFound();
11700 }
11701
11702 {
11703 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011705 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11706 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011707 }
11708 m_errorMonitor->VerifyFound();
11709
11710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11711}
11712
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011713// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11714TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011715 TEST_DESCRIPTION(
11716 "Hit all possible validation checks associated with the "
11717 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11718 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011719 // 3 in ValidateCmdBufImageLayouts
11720 // * -1 Attempt to submit cmd buf w/ deleted image
11721 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11722 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011723
Tony Barbour1fa09702017-03-16 12:09:08 -060011724 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070011725 auto depth_format = find_depth_stencil_format(m_device);
11726 if (!depth_format) {
11727 printf(" No Depth + Stencil format found. Skipped.\n");
11728 return;
11729 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011730 // Create src & dst images to use for copy operations
11731 VkImage src_image;
11732 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011733 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011734
11735 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11736 const int32_t tex_width = 32;
11737 const int32_t tex_height = 32;
11738
11739 VkImageCreateInfo image_create_info = {};
11740 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11741 image_create_info.pNext = NULL;
11742 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11743 image_create_info.format = tex_format;
11744 image_create_info.extent.width = tex_width;
11745 image_create_info.extent.height = tex_height;
11746 image_create_info.extent.depth = 1;
11747 image_create_info.mipLevels = 1;
11748 image_create_info.arrayLayers = 4;
11749 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11750 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11751 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011752 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011753 image_create_info.flags = 0;
11754
11755 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11756 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011757 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011758 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11759 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011760 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11761 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11762 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11763 ASSERT_VK_SUCCESS(err);
11764
11765 // Allocate memory
11766 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011767 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011768 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011769 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11770 mem_alloc.pNext = NULL;
11771 mem_alloc.allocationSize = 0;
11772 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011773
11774 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011775 mem_alloc.allocationSize = img_mem_reqs.size;
11776 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011777 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011778 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011779 ASSERT_VK_SUCCESS(err);
11780
11781 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011782 mem_alloc.allocationSize = img_mem_reqs.size;
11783 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011784 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011785 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011786 ASSERT_VK_SUCCESS(err);
11787
11788 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011789 mem_alloc.allocationSize = img_mem_reqs.size;
11790 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011791 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011792 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011793 ASSERT_VK_SUCCESS(err);
11794
11795 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11796 ASSERT_VK_SUCCESS(err);
11797 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11798 ASSERT_VK_SUCCESS(err);
11799 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11800 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011801
Tony Barbour552f6c02016-12-21 14:34:07 -070011802 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011803 VkImageCopy copy_region;
11804 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11805 copy_region.srcSubresource.mipLevel = 0;
11806 copy_region.srcSubresource.baseArrayLayer = 0;
11807 copy_region.srcSubresource.layerCount = 1;
11808 copy_region.srcOffset.x = 0;
11809 copy_region.srcOffset.y = 0;
11810 copy_region.srcOffset.z = 0;
11811 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11812 copy_region.dstSubresource.mipLevel = 0;
11813 copy_region.dstSubresource.baseArrayLayer = 0;
11814 copy_region.dstSubresource.layerCount = 1;
11815 copy_region.dstOffset.x = 0;
11816 copy_region.dstOffset.y = 0;
11817 copy_region.dstOffset.z = 0;
11818 copy_region.extent.width = 1;
11819 copy_region.extent.height = 1;
11820 copy_region.extent.depth = 1;
11821
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011822 m_errorMonitor->SetDesiredFailureMsg(
11823 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11824 "For optimal performance image layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11825 m_errorMonitor->SetUnexpectedError(
11826 "For optimal performance image layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11827
Cort530cf382016-12-08 09:59:47 -080011828 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 -060011829 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011830 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11831 // update layer state
11832 m_errorMonitor->SetUnexpectedError(
11833 "For optimal performance image layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11834 m_errorMonitor->SetUnexpectedError(
11835 "For optimal performance image layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11836 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 -060011837 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011839 "Cannot use an image with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
11840 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011841 m_errorMonitor->SetUnexpectedError(
11842 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011843 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 -060011844 m_errorMonitor->VerifyFound();
11845 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11847 "Layout for image is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
11848 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011849 m_errorMonitor->SetUnexpectedError(
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011850 "Cannot use an image with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout "
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011851 "VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011852 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 -060011853 m_errorMonitor->VerifyFound();
11854 // Now verify same checks for dst
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011855 m_errorMonitor->SetDesiredFailureMsg(
11856 VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11857 "For optimal performance image layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11858 m_errorMonitor->SetUnexpectedError(
11859 "For optimal performance image layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011860 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011861 m_errorMonitor->VerifyFound();
11862 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011864 "Cannot use an image with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
11865 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011866 m_errorMonitor->SetUnexpectedError(
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011867 "Layout for image is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or "
11868 "VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011869 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 -060011870 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11872 "Layout for image is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
11873 "VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011874 m_errorMonitor->SetUnexpectedError(
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011875 "Cannot use an image with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout "
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011876 "VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011877 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 -060011878 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011879
Cort3b021012016-12-07 12:00:57 -080011880 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11881 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11882 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11883 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11884 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11885 transfer_dst_image_barrier[0].srcAccessMask = 0;
11886 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11887 transfer_dst_image_barrier[0].image = dst_image;
11888 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11889 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11890 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11891 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11892 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11893 transfer_dst_image_barrier[0].image = depth_image;
11894 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11895 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11896 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11897
11898 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011899 VkClearColorValue color_clear_value = {};
11900 VkImageSubresourceRange clear_range;
11901 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11902 clear_range.baseMipLevel = 0;
11903 clear_range.baseArrayLayer = 0;
11904 clear_range.layerCount = 1;
11905 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011906
Cort3b021012016-12-07 12:00:57 -080011907 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11908 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011911 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011912 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011913 // Fail due to provided layout not matching actual current layout for color clear.
11914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011915 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011916 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011917
Cort530cf382016-12-08 09:59:47 -080011918 VkClearDepthStencilValue depth_clear_value = {};
11919 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011920
11921 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11922 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011925 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011926 m_errorMonitor->VerifyFound();
11927 // Fail due to provided layout not matching actual current layout for depth clear.
11928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011929 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011930 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011931
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011932 // Now cause error due to bad image layout transition in PipelineBarrier
11933 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011934 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011935 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011936 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011938 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11939 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011940 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11942 "You cannot transition the layout of aspect 1 from "
11943 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
11944 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011946 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11947 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011948 m_errorMonitor->VerifyFound();
11949
11950 // Finally some layout errors at RenderPass create time
11951 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11952 VkAttachmentReference attach = {};
11953 // perf warning for GENERAL layout w/ non-DS input attachment
11954 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11955 VkSubpassDescription subpass = {};
11956 subpass.inputAttachmentCount = 1;
11957 subpass.pInputAttachments = &attach;
11958 VkRenderPassCreateInfo rpci = {};
11959 rpci.subpassCount = 1;
11960 rpci.pSubpasses = &subpass;
11961 rpci.attachmentCount = 1;
11962 VkAttachmentDescription attach_desc = {};
11963 attach_desc.format = VK_FORMAT_UNDEFINED;
11964 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011965 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011966 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11968 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011969 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11970 m_errorMonitor->VerifyFound();
11971 // error w/ non-general layout
11972 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11973
11974 m_errorMonitor->SetDesiredFailureMsg(
11975 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11976 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11977 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11978 m_errorMonitor->VerifyFound();
11979 subpass.inputAttachmentCount = 0;
11980 subpass.colorAttachmentCount = 1;
11981 subpass.pColorAttachments = &attach;
11982 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11983 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11985 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011986 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11987 m_errorMonitor->VerifyFound();
11988 // error w/ non-color opt or GENERAL layout for color attachment
11989 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11990 m_errorMonitor->SetDesiredFailureMsg(
11991 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11992 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11993 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11994 m_errorMonitor->VerifyFound();
11995 subpass.colorAttachmentCount = 0;
11996 subpass.pDepthStencilAttachment = &attach;
11997 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11998 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
12000 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012001 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12002 m_errorMonitor->VerifyFound();
12003 // error w/ non-ds opt or GENERAL layout for color attachment
12004 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12006 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
12007 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012008 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12009 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060012010 // For this error we need a valid renderpass so create default one
12011 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12012 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012013 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012014 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12015 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12016 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12017 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12018 // Can't do a CLEAR load on READ_ONLY initialLayout
12019 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12020 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12021 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012022 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12023 " with invalid first layout "
12024 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
12025 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012026 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12027 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012028
Cort3b021012016-12-07 12:00:57 -080012029 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12030 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12031 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012032 vkDestroyImage(m_device->device(), src_image, NULL);
12033 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012034 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012035}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012036
Tobin Ehlise0936662016-10-11 08:10:51 -060012037TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12038 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12039 VkResult err;
12040
Tony Barbour1fa09702017-03-16 12:09:08 -060012041 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012042
12043 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12044 VkImageTiling tiling;
12045 VkFormatProperties format_properties;
12046 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12047 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12048 tiling = VK_IMAGE_TILING_LINEAR;
12049 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12050 tiling = VK_IMAGE_TILING_OPTIMAL;
12051 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012052 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012053 return;
12054 }
12055
12056 VkDescriptorPoolSize ds_type = {};
12057 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12058 ds_type.descriptorCount = 1;
12059
12060 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12061 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12062 ds_pool_ci.maxSets = 1;
12063 ds_pool_ci.poolSizeCount = 1;
12064 ds_pool_ci.pPoolSizes = &ds_type;
12065 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12066
12067 VkDescriptorPool ds_pool;
12068 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12069 ASSERT_VK_SUCCESS(err);
12070
12071 VkDescriptorSetLayoutBinding dsl_binding = {};
12072 dsl_binding.binding = 0;
12073 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12074 dsl_binding.descriptorCount = 1;
12075 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12076 dsl_binding.pImmutableSamplers = NULL;
12077
12078 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12079 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12080 ds_layout_ci.pNext = NULL;
12081 ds_layout_ci.bindingCount = 1;
12082 ds_layout_ci.pBindings = &dsl_binding;
12083
12084 VkDescriptorSetLayout ds_layout;
12085 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12086 ASSERT_VK_SUCCESS(err);
12087
12088 VkDescriptorSetAllocateInfo alloc_info = {};
12089 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12090 alloc_info.descriptorSetCount = 1;
12091 alloc_info.descriptorPool = ds_pool;
12092 alloc_info.pSetLayouts = &ds_layout;
12093 VkDescriptorSet descriptor_set;
12094 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12095 ASSERT_VK_SUCCESS(err);
12096
12097 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12098 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12099 pipeline_layout_ci.pNext = NULL;
12100 pipeline_layout_ci.setLayoutCount = 1;
12101 pipeline_layout_ci.pSetLayouts = &ds_layout;
12102 VkPipelineLayout pipeline_layout;
12103 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12104 ASSERT_VK_SUCCESS(err);
12105
12106 VkImageObj image(m_device);
12107 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12108 ASSERT_TRUE(image.initialized());
12109 VkImageView view = image.targetView(tex_format);
12110
12111 VkDescriptorImageInfo image_info = {};
12112 image_info.imageView = view;
12113 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12114
12115 VkWriteDescriptorSet descriptor_write = {};
12116 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12117 descriptor_write.dstSet = descriptor_set;
12118 descriptor_write.dstBinding = 0;
12119 descriptor_write.descriptorCount = 1;
12120 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12121 descriptor_write.pImageInfo = &image_info;
12122
12123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12124 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12125 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12126 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12127 m_errorMonitor->VerifyFound();
12128
12129 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12130 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12131 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12132 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12133}
12134
Mark Mueller93b938f2016-08-18 10:27:40 -060012135TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012136 TEST_DESCRIPTION(
12137 "Use vkCmdExecuteCommands with invalid state "
12138 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012139
Tony Barbour1fa09702017-03-16 12:09:08 -060012140 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012141 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12142
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012143 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012144 const char *simultaneous_use_message2 =
12145 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12146 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012147
12148 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012149 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012150 command_buffer_allocate_info.commandPool = m_commandPool;
12151 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12152 command_buffer_allocate_info.commandBufferCount = 1;
12153
12154 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012155 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012156 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12157 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012158 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012159 command_buffer_inheritance_info.renderPass = m_renderPass;
12160 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012161
Mark Mueller93b938f2016-08-18 10:27:40 -060012162 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012163 command_buffer_begin_info.flags =
12164 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012165 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12166
12167 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12168 vkEndCommandBuffer(secondary_command_buffer);
12169
Mark Mueller93b938f2016-08-18 10:27:40 -060012170 VkSubmitInfo submit_info = {};
12171 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12172 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012173 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012174
Mark Mueller4042b652016-09-05 22:52:21 -060012175 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012176 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12177 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12178 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012179 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012180 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012181 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12182 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012183
Dave Houltonfbf52152017-01-06 12:55:29 -070012184 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012185 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012186 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012187
Mark Mueller4042b652016-09-05 22:52:21 -060012188 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012189 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12190 m_errorMonitor->SetUnexpectedError(
12191 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12192 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012193 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012194 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012195
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12197 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012198 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012199 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12200 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012201
12202 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012203
12204 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012205}
12206
Tony Barbour626994c2017-02-08 15:29:37 -070012207TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12208 TEST_DESCRIPTION(
12209 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12210 "errors");
12211 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12212 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
Tony Barbour1fa09702017-03-16 12:09:08 -060012213 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012214
12215 VkCommandBuffer cmd_bufs[2];
12216 VkCommandBufferAllocateInfo alloc_info;
12217 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12218 alloc_info.pNext = NULL;
12219 alloc_info.commandBufferCount = 2;
12220 alloc_info.commandPool = m_commandPool;
12221 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12222 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12223
12224 VkCommandBufferBeginInfo cb_binfo;
12225 cb_binfo.pNext = NULL;
12226 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12227 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12228 cb_binfo.flags = 0;
12229 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12230 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12231 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12232 vkEndCommandBuffer(cmd_bufs[0]);
12233 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12234
12235 VkSubmitInfo submit_info = {};
12236 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12237 submit_info.commandBufferCount = 2;
12238 submit_info.pCommandBuffers = duplicates;
12239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12240 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12241 m_errorMonitor->VerifyFound();
12242 vkQueueWaitIdle(m_device->m_queue);
12243
12244 // Set one time use and now look for one time submit
12245 duplicates[0] = duplicates[1] = cmd_bufs[1];
12246 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12247 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12248 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12249 vkEndCommandBuffer(cmd_bufs[1]);
12250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12251 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12252 m_errorMonitor->VerifyFound();
12253 vkQueueWaitIdle(m_device->m_queue);
12254}
12255
Tobin Ehlisb093da82017-01-19 12:05:27 -070012256TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012257 TEST_DESCRIPTION(
12258 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12259 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012260
Tony Barbour1fa09702017-03-16 12:09:08 -060012261 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12263
12264 std::vector<const char *> device_extension_names;
12265 auto features = m_device->phy().features();
12266 // Make sure gs & ts are disabled
12267 features.geometryShader = false;
12268 features.tessellationShader = false;
12269 // The sacrificial device object
12270 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12271
12272 VkCommandPoolCreateInfo pool_create_info{};
12273 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12274 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12275
12276 VkCommandPool command_pool;
12277 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12278
12279 VkCommandBufferAllocateInfo cmd = {};
12280 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12281 cmd.pNext = NULL;
12282 cmd.commandPool = command_pool;
12283 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12284 cmd.commandBufferCount = 1;
12285
12286 VkCommandBuffer cmd_buffer;
12287 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12288 ASSERT_VK_SUCCESS(err);
12289
12290 VkEvent event;
12291 VkEventCreateInfo evci = {};
12292 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12293 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12294 ASSERT_VK_SUCCESS(result);
12295
12296 VkCommandBufferBeginInfo cbbi = {};
12297 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12298 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12300 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12301 m_errorMonitor->VerifyFound();
12302
12303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12304 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12305 m_errorMonitor->VerifyFound();
12306
12307 vkDestroyEvent(test_device.handle(), event, NULL);
12308 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12309}
12310
Mark Mueller917f6bc2016-08-30 10:57:19 -060012311TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012312 TEST_DESCRIPTION(
12313 "Use vkCmdExecuteCommands with invalid state "
12314 "in primary and secondary command buffers. "
12315 "Delete objects that are inuse. Call VkQueueSubmit "
12316 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012317
Tony Barbour1fa09702017-03-16 12:09:08 -060012318 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12320
Tony Barbour552f6c02016-12-21 14:34:07 -070012321 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012322
12323 VkEvent event;
12324 VkEventCreateInfo event_create_info = {};
12325 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12326 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012327 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012328
Tony Barbour552f6c02016-12-21 14:34:07 -070012329 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012330 vkDestroyEvent(m_device->device(), event, nullptr);
12331
12332 VkSubmitInfo submit_info = {};
12333 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12334 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012335 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012336 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012337 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12338 m_errorMonitor->VerifyFound();
12339
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012340 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012341 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12342
12343 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12344
Mark Mueller917f6bc2016-08-30 10:57:19 -060012345 VkSemaphoreCreateInfo semaphore_create_info = {};
12346 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12347 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012348 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012349 VkFenceCreateInfo fence_create_info = {};
12350 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12351 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012352 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012353
12354 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012355 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012356 descriptor_pool_type_count.descriptorCount = 1;
12357
12358 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12359 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12360 descriptor_pool_create_info.maxSets = 1;
12361 descriptor_pool_create_info.poolSizeCount = 1;
12362 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012363 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012364
12365 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012366 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012367
12368 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012369 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012370 descriptorset_layout_binding.descriptorCount = 1;
12371 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12372
12373 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012374 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012375 descriptorset_layout_create_info.bindingCount = 1;
12376 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12377
12378 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012379 ASSERT_VK_SUCCESS(
12380 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012381
12382 VkDescriptorSet descriptorset;
12383 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012384 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012385 descriptorset_allocate_info.descriptorSetCount = 1;
12386 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12387 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012388 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012389
Mark Mueller4042b652016-09-05 22:52:21 -060012390 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12391
12392 VkDescriptorBufferInfo buffer_info = {};
12393 buffer_info.buffer = buffer_test.GetBuffer();
12394 buffer_info.offset = 0;
12395 buffer_info.range = 1024;
12396
12397 VkWriteDescriptorSet write_descriptor_set = {};
12398 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12399 write_descriptor_set.dstSet = descriptorset;
12400 write_descriptor_set.descriptorCount = 1;
12401 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12402 write_descriptor_set.pBufferInfo = &buffer_info;
12403
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012404 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012405
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012406 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12407 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012408
12409 VkPipelineObj pipe(m_device);
12410 pipe.AddColorAttachment();
12411 pipe.AddShader(&vs);
12412 pipe.AddShader(&fs);
12413
12414 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012415 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012416 pipeline_layout_create_info.setLayoutCount = 1;
12417 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12418
12419 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012420 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012421
12422 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12423
Tony Barbour552f6c02016-12-21 14:34:07 -070012424 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012425 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012426
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012427 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12428 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12429 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012430
Tony Barbour552f6c02016-12-21 14:34:07 -070012431 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012432
Mark Mueller917f6bc2016-08-30 10:57:19 -060012433 submit_info.signalSemaphoreCount = 1;
12434 submit_info.pSignalSemaphores = &semaphore;
12435 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012436 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012437
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012439 vkDestroyEvent(m_device->device(), event, nullptr);
12440 m_errorMonitor->VerifyFound();
12441
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012443 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12444 m_errorMonitor->VerifyFound();
12445
Jeremy Hayes08369882017-02-02 10:31:06 -070012446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012447 vkDestroyFence(m_device->device(), fence, nullptr);
12448 m_errorMonitor->VerifyFound();
12449
Tobin Ehlis122207b2016-09-01 08:50:06 -070012450 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012451 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12452 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012453 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012454 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12455 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012456 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012457 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12458 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012459 vkDestroyEvent(m_device->device(), event, nullptr);
12460 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012461 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012462 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12463}
12464
Tobin Ehlis2adda372016-09-01 08:51:06 -070012465TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12466 TEST_DESCRIPTION("Delete in-use query pool.");
12467
Tony Barbour1fa09702017-03-16 12:09:08 -060012468 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012469 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12470
12471 VkQueryPool query_pool;
12472 VkQueryPoolCreateInfo query_pool_ci{};
12473 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12474 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12475 query_pool_ci.queryCount = 1;
12476 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012477 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012478 // Reset query pool to create binding with cmd buffer
12479 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12480
Tony Barbour552f6c02016-12-21 14:34:07 -070012481 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012482
12483 VkSubmitInfo submit_info = {};
12484 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12485 submit_info.commandBufferCount = 1;
12486 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12487 // Submit cmd buffer and then destroy query pool while in-flight
12488 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12489
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012490 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012491 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12492 m_errorMonitor->VerifyFound();
12493
12494 vkQueueWaitIdle(m_device->m_queue);
12495 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012496 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12497 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012498 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12499}
12500
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012501TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12502 TEST_DESCRIPTION("Delete in-use pipeline.");
12503
Tony Barbour1fa09702017-03-16 12:09:08 -060012504 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012505 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12506
12507 // Empty pipeline layout used for binding PSO
12508 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12509 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12510 pipeline_layout_ci.setLayoutCount = 0;
12511 pipeline_layout_ci.pSetLayouts = NULL;
12512
12513 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012514 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012515 ASSERT_VK_SUCCESS(err);
12516
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012518 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012519 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12520 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012521 // Store pipeline handle so we can actually delete it before test finishes
12522 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012523 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012524 VkPipelineObj pipe(m_device);
12525 pipe.AddShader(&vs);
12526 pipe.AddShader(&fs);
12527 pipe.AddColorAttachment();
12528 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12529 delete_this_pipeline = pipe.handle();
12530
Tony Barbour552f6c02016-12-21 14:34:07 -070012531 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012532 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012533 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012534
Tony Barbour552f6c02016-12-21 14:34:07 -070012535 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012536
12537 VkSubmitInfo submit_info = {};
12538 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12539 submit_info.commandBufferCount = 1;
12540 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12541 // Submit cmd buffer and then pipeline destroyed while in-flight
12542 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012543 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012544 m_errorMonitor->VerifyFound();
12545 // Make sure queue finished and then actually delete pipeline
12546 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012547 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12548 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012549 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12550 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12551}
12552
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012553TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12554 TEST_DESCRIPTION("Delete in-use imageView.");
12555
Tony Barbour1fa09702017-03-16 12:09:08 -060012556 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12558
12559 VkDescriptorPoolSize ds_type_count;
12560 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12561 ds_type_count.descriptorCount = 1;
12562
12563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12565 ds_pool_ci.maxSets = 1;
12566 ds_pool_ci.poolSizeCount = 1;
12567 ds_pool_ci.pPoolSizes = &ds_type_count;
12568
12569 VkDescriptorPool ds_pool;
12570 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12571 ASSERT_VK_SUCCESS(err);
12572
12573 VkSamplerCreateInfo sampler_ci = {};
12574 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12575 sampler_ci.pNext = NULL;
12576 sampler_ci.magFilter = VK_FILTER_NEAREST;
12577 sampler_ci.minFilter = VK_FILTER_NEAREST;
12578 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12579 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12580 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12581 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12582 sampler_ci.mipLodBias = 1.0;
12583 sampler_ci.anisotropyEnable = VK_FALSE;
12584 sampler_ci.maxAnisotropy = 1;
12585 sampler_ci.compareEnable = VK_FALSE;
12586 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12587 sampler_ci.minLod = 1.0;
12588 sampler_ci.maxLod = 1.0;
12589 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12590 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12591 VkSampler sampler;
12592
12593 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12594 ASSERT_VK_SUCCESS(err);
12595
12596 VkDescriptorSetLayoutBinding layout_binding;
12597 layout_binding.binding = 0;
12598 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12599 layout_binding.descriptorCount = 1;
12600 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12601 layout_binding.pImmutableSamplers = NULL;
12602
12603 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12604 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12605 ds_layout_ci.bindingCount = 1;
12606 ds_layout_ci.pBindings = &layout_binding;
12607 VkDescriptorSetLayout ds_layout;
12608 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12609 ASSERT_VK_SUCCESS(err);
12610
12611 VkDescriptorSetAllocateInfo alloc_info = {};
12612 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12613 alloc_info.descriptorSetCount = 1;
12614 alloc_info.descriptorPool = ds_pool;
12615 alloc_info.pSetLayouts = &ds_layout;
12616 VkDescriptorSet descriptor_set;
12617 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12618 ASSERT_VK_SUCCESS(err);
12619
12620 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12621 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12622 pipeline_layout_ci.pNext = NULL;
12623 pipeline_layout_ci.setLayoutCount = 1;
12624 pipeline_layout_ci.pSetLayouts = &ds_layout;
12625
12626 VkPipelineLayout pipeline_layout;
12627 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12628 ASSERT_VK_SUCCESS(err);
12629
12630 VkImageObj image(m_device);
12631 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12632 ASSERT_TRUE(image.initialized());
12633
12634 VkImageView view;
12635 VkImageViewCreateInfo ivci = {};
12636 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12637 ivci.image = image.handle();
12638 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12639 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12640 ivci.subresourceRange.layerCount = 1;
12641 ivci.subresourceRange.baseMipLevel = 0;
12642 ivci.subresourceRange.levelCount = 1;
12643 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12644
12645 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12646 ASSERT_VK_SUCCESS(err);
12647
12648 VkDescriptorImageInfo image_info{};
12649 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12650 image_info.imageView = view;
12651 image_info.sampler = sampler;
12652
12653 VkWriteDescriptorSet descriptor_write = {};
12654 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12655 descriptor_write.dstSet = descriptor_set;
12656 descriptor_write.dstBinding = 0;
12657 descriptor_write.descriptorCount = 1;
12658 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12659 descriptor_write.pImageInfo = &image_info;
12660
12661 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12662
12663 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012664 char const *vsSource =
12665 "#version 450\n"
12666 "\n"
12667 "out gl_PerVertex { \n"
12668 " vec4 gl_Position;\n"
12669 "};\n"
12670 "void main(){\n"
12671 " gl_Position = vec4(1);\n"
12672 "}\n";
12673 char const *fsSource =
12674 "#version 450\n"
12675 "\n"
12676 "layout(set=0, binding=0) uniform sampler2D s;\n"
12677 "layout(location=0) out vec4 x;\n"
12678 "void main(){\n"
12679 " x = texture(s, vec2(1));\n"
12680 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012681 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12682 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12683 VkPipelineObj pipe(m_device);
12684 pipe.AddShader(&vs);
12685 pipe.AddShader(&fs);
12686 pipe.AddColorAttachment();
12687 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12688
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012690
Tony Barbour552f6c02016-12-21 14:34:07 -070012691 m_commandBuffer->BeginCommandBuffer();
12692 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012693 // Bind pipeline to cmd buffer
12694 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12695 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12696 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012697
12698 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12699 VkRect2D scissor = {{0, 0}, {16, 16}};
12700 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12701 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12702
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012703 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012704 m_commandBuffer->EndRenderPass();
12705 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012706 // Submit cmd buffer then destroy sampler
12707 VkSubmitInfo submit_info = {};
12708 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12709 submit_info.commandBufferCount = 1;
12710 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12711 // Submit cmd buffer and then destroy imageView while in-flight
12712 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12713
12714 vkDestroyImageView(m_device->device(), view, nullptr);
12715 m_errorMonitor->VerifyFound();
12716 vkQueueWaitIdle(m_device->m_queue);
12717 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012718 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12719 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012720 vkDestroyImageView(m_device->device(), view, NULL);
12721 vkDestroySampler(m_device->device(), sampler, nullptr);
12722 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12723 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12724 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12725}
12726
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012727TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12728 TEST_DESCRIPTION("Delete in-use bufferView.");
12729
Tony Barbour1fa09702017-03-16 12:09:08 -060012730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12732
12733 VkDescriptorPoolSize ds_type_count;
12734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12735 ds_type_count.descriptorCount = 1;
12736
12737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12739 ds_pool_ci.maxSets = 1;
12740 ds_pool_ci.poolSizeCount = 1;
12741 ds_pool_ci.pPoolSizes = &ds_type_count;
12742
12743 VkDescriptorPool ds_pool;
12744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12745 ASSERT_VK_SUCCESS(err);
12746
12747 VkDescriptorSetLayoutBinding layout_binding;
12748 layout_binding.binding = 0;
12749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12750 layout_binding.descriptorCount = 1;
12751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12752 layout_binding.pImmutableSamplers = NULL;
12753
12754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12756 ds_layout_ci.bindingCount = 1;
12757 ds_layout_ci.pBindings = &layout_binding;
12758 VkDescriptorSetLayout ds_layout;
12759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12760 ASSERT_VK_SUCCESS(err);
12761
12762 VkDescriptorSetAllocateInfo alloc_info = {};
12763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12764 alloc_info.descriptorSetCount = 1;
12765 alloc_info.descriptorPool = ds_pool;
12766 alloc_info.pSetLayouts = &ds_layout;
12767 VkDescriptorSet descriptor_set;
12768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12769 ASSERT_VK_SUCCESS(err);
12770
12771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12773 pipeline_layout_ci.pNext = NULL;
12774 pipeline_layout_ci.setLayoutCount = 1;
12775 pipeline_layout_ci.pSetLayouts = &ds_layout;
12776
12777 VkPipelineLayout pipeline_layout;
12778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12779 ASSERT_VK_SUCCESS(err);
12780
12781 VkBuffer buffer;
12782 uint32_t queue_family_index = 0;
12783 VkBufferCreateInfo buffer_create_info = {};
12784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12785 buffer_create_info.size = 1024;
12786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12787 buffer_create_info.queueFamilyIndexCount = 1;
12788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12789
12790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12791 ASSERT_VK_SUCCESS(err);
12792
12793 VkMemoryRequirements memory_reqs;
12794 VkDeviceMemory buffer_memory;
12795
12796 VkMemoryAllocateInfo memory_info = {};
12797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12798 memory_info.allocationSize = 0;
12799 memory_info.memoryTypeIndex = 0;
12800
12801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12802 memory_info.allocationSize = memory_reqs.size;
12803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12804 ASSERT_TRUE(pass);
12805
12806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12807 ASSERT_VK_SUCCESS(err);
12808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12809 ASSERT_VK_SUCCESS(err);
12810
12811 VkBufferView view;
12812 VkBufferViewCreateInfo bvci = {};
12813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12814 bvci.buffer = buffer;
12815 bvci.format = VK_FORMAT_R8_UNORM;
12816 bvci.range = VK_WHOLE_SIZE;
12817
12818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12819 ASSERT_VK_SUCCESS(err);
12820
12821 VkWriteDescriptorSet descriptor_write = {};
12822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12823 descriptor_write.dstSet = descriptor_set;
12824 descriptor_write.dstBinding = 0;
12825 descriptor_write.descriptorCount = 1;
12826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12827 descriptor_write.pTexelBufferView = &view;
12828
12829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012831 char const *vsSource =
12832 "#version 450\n"
12833 "\n"
12834 "out gl_PerVertex { \n"
12835 " vec4 gl_Position;\n"
12836 "};\n"
12837 "void main(){\n"
12838 " gl_Position = vec4(1);\n"
12839 "}\n";
12840 char const *fsSource =
12841 "#version 450\n"
12842 "\n"
12843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12844 "layout(location=0) out vec4 x;\n"
12845 "void main(){\n"
12846 " x = imageLoad(s, 0);\n"
12847 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12850 VkPipelineObj pipe(m_device);
12851 pipe.AddShader(&vs);
12852 pipe.AddShader(&fs);
12853 pipe.AddColorAttachment();
12854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12855
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012857
Tony Barbour552f6c02016-12-21 14:34:07 -070012858 m_commandBuffer->BeginCommandBuffer();
12859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012860 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12861 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12862 VkRect2D scissor = {{0, 0}, {16, 16}};
12863 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12864 // Bind pipeline to cmd buffer
12865 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12866 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12867 &descriptor_set, 0, nullptr);
12868 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012869 m_commandBuffer->EndRenderPass();
12870 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012871
12872 VkSubmitInfo submit_info = {};
12873 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12874 submit_info.commandBufferCount = 1;
12875 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12876 // Submit cmd buffer and then destroy bufferView while in-flight
12877 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12878
12879 vkDestroyBufferView(m_device->device(), view, nullptr);
12880 m_errorMonitor->VerifyFound();
12881 vkQueueWaitIdle(m_device->m_queue);
12882 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012883 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12884 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012885 vkDestroyBufferView(m_device->device(), view, NULL);
12886 vkDestroyBuffer(m_device->device(), buffer, NULL);
12887 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12888 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12889 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12890 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12891}
12892
Tobin Ehlis209532e2016-09-07 13:52:18 -060012893TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12894 TEST_DESCRIPTION("Delete in-use sampler.");
12895
Tony Barbour1fa09702017-03-16 12:09:08 -060012896 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012897 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12898
12899 VkDescriptorPoolSize ds_type_count;
12900 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12901 ds_type_count.descriptorCount = 1;
12902
12903 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12904 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12905 ds_pool_ci.maxSets = 1;
12906 ds_pool_ci.poolSizeCount = 1;
12907 ds_pool_ci.pPoolSizes = &ds_type_count;
12908
12909 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012910 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012911 ASSERT_VK_SUCCESS(err);
12912
12913 VkSamplerCreateInfo sampler_ci = {};
12914 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12915 sampler_ci.pNext = NULL;
12916 sampler_ci.magFilter = VK_FILTER_NEAREST;
12917 sampler_ci.minFilter = VK_FILTER_NEAREST;
12918 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12919 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12920 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12921 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12922 sampler_ci.mipLodBias = 1.0;
12923 sampler_ci.anisotropyEnable = VK_FALSE;
12924 sampler_ci.maxAnisotropy = 1;
12925 sampler_ci.compareEnable = VK_FALSE;
12926 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12927 sampler_ci.minLod = 1.0;
12928 sampler_ci.maxLod = 1.0;
12929 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12930 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12931 VkSampler sampler;
12932
12933 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12934 ASSERT_VK_SUCCESS(err);
12935
12936 VkDescriptorSetLayoutBinding layout_binding;
12937 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012938 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012939 layout_binding.descriptorCount = 1;
12940 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12941 layout_binding.pImmutableSamplers = NULL;
12942
12943 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12944 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12945 ds_layout_ci.bindingCount = 1;
12946 ds_layout_ci.pBindings = &layout_binding;
12947 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012948 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012949 ASSERT_VK_SUCCESS(err);
12950
12951 VkDescriptorSetAllocateInfo alloc_info = {};
12952 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12953 alloc_info.descriptorSetCount = 1;
12954 alloc_info.descriptorPool = ds_pool;
12955 alloc_info.pSetLayouts = &ds_layout;
12956 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012957 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012958 ASSERT_VK_SUCCESS(err);
12959
12960 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12961 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12962 pipeline_layout_ci.pNext = NULL;
12963 pipeline_layout_ci.setLayoutCount = 1;
12964 pipeline_layout_ci.pSetLayouts = &ds_layout;
12965
12966 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012967 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012968 ASSERT_VK_SUCCESS(err);
12969
12970 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012971 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012972 ASSERT_TRUE(image.initialized());
12973
12974 VkImageView view;
12975 VkImageViewCreateInfo ivci = {};
12976 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12977 ivci.image = image.handle();
12978 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12979 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12980 ivci.subresourceRange.layerCount = 1;
12981 ivci.subresourceRange.baseMipLevel = 0;
12982 ivci.subresourceRange.levelCount = 1;
12983 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12984
12985 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12986 ASSERT_VK_SUCCESS(err);
12987
12988 VkDescriptorImageInfo image_info{};
12989 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12990 image_info.imageView = view;
12991 image_info.sampler = sampler;
12992
12993 VkWriteDescriptorSet descriptor_write = {};
12994 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12995 descriptor_write.dstSet = descriptor_set;
12996 descriptor_write.dstBinding = 0;
12997 descriptor_write.descriptorCount = 1;
12998 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12999 descriptor_write.pImageInfo = &image_info;
13000
13001 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
13002
13003 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013004 char const *vsSource =
13005 "#version 450\n"
13006 "\n"
13007 "out gl_PerVertex { \n"
13008 " vec4 gl_Position;\n"
13009 "};\n"
13010 "void main(){\n"
13011 " gl_Position = vec4(1);\n"
13012 "}\n";
13013 char const *fsSource =
13014 "#version 450\n"
13015 "\n"
13016 "layout(set=0, binding=0) uniform sampler2D s;\n"
13017 "layout(location=0) out vec4 x;\n"
13018 "void main(){\n"
13019 " x = texture(s, vec2(1));\n"
13020 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013021 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13022 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13023 VkPipelineObj pipe(m_device);
13024 pipe.AddShader(&vs);
13025 pipe.AddShader(&fs);
13026 pipe.AddColorAttachment();
13027 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13028
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013030
Tony Barbour552f6c02016-12-21 14:34:07 -070013031 m_commandBuffer->BeginCommandBuffer();
13032 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013033 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013034 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13035 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13036 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013037
13038 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13039 VkRect2D scissor = {{0, 0}, {16, 16}};
13040 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13041 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13042
Tobin Ehlis209532e2016-09-07 13:52:18 -060013043 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013044 m_commandBuffer->EndRenderPass();
13045 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013046 // Submit cmd buffer then destroy sampler
13047 VkSubmitInfo submit_info = {};
13048 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13049 submit_info.commandBufferCount = 1;
13050 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13051 // Submit cmd buffer and then destroy sampler while in-flight
13052 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13053
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013054 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013055 m_errorMonitor->VerifyFound();
13056 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013057
Tobin Ehlis209532e2016-09-07 13:52:18 -060013058 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013059 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13060 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013061 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013062 vkDestroyImageView(m_device->device(), view, NULL);
13063 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13064 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13065 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13066}
13067
Mark Mueller1cd9f412016-08-25 13:23:52 -060013068TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013069 TEST_DESCRIPTION(
13070 "Call VkQueueSubmit with a semaphore that is already "
13071 "signaled but not waited on by the queue. Wait on a "
13072 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013073
Tony Barbour1fa09702017-03-16 12:09:08 -060013074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13076
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013077 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013078 const char *invalid_fence_wait_message =
13079 " which has not been submitted on a Queue or during "
13080 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013081
Tony Barbour552f6c02016-12-21 14:34:07 -070013082 m_commandBuffer->BeginCommandBuffer();
13083 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013084
13085 VkSemaphoreCreateInfo semaphore_create_info = {};
13086 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13087 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013088 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013089 VkSubmitInfo submit_info = {};
13090 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13091 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013092 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013093 submit_info.signalSemaphoreCount = 1;
13094 submit_info.pSignalSemaphores = &semaphore;
13095 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013096 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013097 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013098 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013099 m_commandBuffer->BeginCommandBuffer();
13100 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013102 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13103 m_errorMonitor->VerifyFound();
13104
Mark Mueller1cd9f412016-08-25 13:23:52 -060013105 VkFenceCreateInfo fence_create_info = {};
13106 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13107 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013108 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013109
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013111 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13112 m_errorMonitor->VerifyFound();
13113
Mark Mueller4042b652016-09-05 22:52:21 -060013114 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013115 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013116 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13117}
13118
Tobin Ehlis4af23302016-07-19 10:50:30 -060013119TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013120 TEST_DESCRIPTION(
13121 "Bind a secondary command buffer with with a framebuffer "
13122 "that does not match the framebuffer for the active "
13123 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013124 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13126
13127 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013128 VkAttachmentDescription attachment = {0,
13129 VK_FORMAT_B8G8R8A8_UNORM,
13130 VK_SAMPLE_COUNT_1_BIT,
13131 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13132 VK_ATTACHMENT_STORE_OP_STORE,
13133 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13134 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13135 VK_IMAGE_LAYOUT_UNDEFINED,
13136 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013137
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013138 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013139
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013140 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013141
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013142 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013143
13144 VkRenderPass rp;
13145 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13146 ASSERT_VK_SUCCESS(err);
13147
13148 // A compatible framebuffer.
13149 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013150 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013151 ASSERT_TRUE(image.initialized());
13152
13153 VkImageViewCreateInfo ivci = {
13154 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13155 nullptr,
13156 0,
13157 image.handle(),
13158 VK_IMAGE_VIEW_TYPE_2D,
13159 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013160 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13161 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013162 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13163 };
13164 VkImageView view;
13165 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13166 ASSERT_VK_SUCCESS(err);
13167
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013168 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013169 VkFramebuffer fb;
13170 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13171 ASSERT_VK_SUCCESS(err);
13172
13173 VkCommandBufferAllocateInfo cbai = {};
13174 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
13175 cbai.commandPool = m_commandPool;
13176 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13177 cbai.commandBufferCount = 1;
13178
13179 VkCommandBuffer sec_cb;
13180 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13181 ASSERT_VK_SUCCESS(err);
13182 VkCommandBufferBeginInfo cbbi = {};
13183 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013184 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013185 cbii.renderPass = renderPass();
13186 cbii.framebuffer = fb;
13187 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13188 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013189 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013190 cbbi.pInheritanceInfo = &cbii;
13191 vkBeginCommandBuffer(sec_cb, &cbbi);
13192 vkEndCommandBuffer(sec_cb);
13193
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013194 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013195 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13196 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013199 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013200 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13201 m_errorMonitor->VerifyFound();
13202 // Cleanup
13203 vkDestroyImageView(m_device->device(), view, NULL);
13204 vkDestroyRenderPass(m_device->device(), rp, NULL);
13205 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13206}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013207
13208TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013209 TEST_DESCRIPTION(
13210 "If logicOp is available on the device, set it to an "
13211 "invalid value. If logicOp is not available, attempt to "
13212 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013213 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013214 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13215
13216 auto features = m_device->phy().features();
13217 // Set the expected error depending on whether or not logicOp available
13218 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13220 "If logic operations feature not "
13221 "enabled, logicOpEnable must be "
13222 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013223 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013225 }
13226 // Create a pipeline using logicOp
13227 VkResult err;
13228
13229 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13230 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13231
13232 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013233 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013234 ASSERT_VK_SUCCESS(err);
13235
13236 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13237 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13238 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013239 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013240 vp_state_ci.pViewports = &vp;
13241 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013242 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013243 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013244
13245 VkPipelineShaderStageCreateInfo shaderStages[2];
13246 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13247
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013248 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13249 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013250 shaderStages[0] = vs.GetStageCreateInfo();
13251 shaderStages[1] = fs.GetStageCreateInfo();
13252
13253 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13254 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13255
13256 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13257 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13258 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13259
13260 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13261 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013262 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013263
13264 VkPipelineColorBlendAttachmentState att = {};
13265 att.blendEnable = VK_FALSE;
13266 att.colorWriteMask = 0xf;
13267
13268 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13269 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13270 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13271 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013272 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013273 cb_ci.attachmentCount = 1;
13274 cb_ci.pAttachments = &att;
13275
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013276 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13277 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13278 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13279
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013280 VkGraphicsPipelineCreateInfo gp_ci = {};
13281 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13282 gp_ci.stageCount = 2;
13283 gp_ci.pStages = shaderStages;
13284 gp_ci.pVertexInputState = &vi_ci;
13285 gp_ci.pInputAssemblyState = &ia_ci;
13286 gp_ci.pViewportState = &vp_state_ci;
13287 gp_ci.pRasterizationState = &rs_ci;
13288 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013289 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013290 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13291 gp_ci.layout = pipeline_layout;
13292 gp_ci.renderPass = renderPass();
13293
13294 VkPipelineCacheCreateInfo pc_ci = {};
13295 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13296
13297 VkPipeline pipeline;
13298 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013299 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013300 ASSERT_VK_SUCCESS(err);
13301
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013302 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013303 m_errorMonitor->VerifyFound();
13304 if (VK_SUCCESS == err) {
13305 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13306 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013307 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13308 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13309}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013310
Mike Stroyanaccf7692015-05-12 16:00:45 -060013311#if GTEST_IS_THREADSAFE
13312struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013313 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013314 VkEvent event;
13315 bool bailout;
13316};
13317
Karl Schultz6addd812016-02-02 17:17:23 -070013318extern "C" void *AddToCommandBuffer(void *arg) {
13319 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013320
Mike Stroyana6d14942016-07-13 15:10:05 -060013321 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013322 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013323 if (data->bailout) {
13324 break;
13325 }
13326 }
13327 return NULL;
13328}
13329
Karl Schultz6addd812016-02-02 17:17:23 -070013330TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013331 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013334
Tony Barbour1fa09702017-03-16 12:09:08 -060013335 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013336 ASSERT_NO_FATAL_FAILURE(InitViewport());
13337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13338
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013339 // Calls AllocateCommandBuffers
13340 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013341
13342 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013343 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013344
13345 VkEventCreateInfo event_info;
13346 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013347 VkResult err;
13348
13349 memset(&event_info, 0, sizeof(event_info));
13350 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13351
Chia-I Wuf7458c52015-10-26 21:10:41 +080013352 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013353 ASSERT_VK_SUCCESS(err);
13354
Mike Stroyanaccf7692015-05-12 16:00:45 -060013355 err = vkResetEvent(device(), event);
13356 ASSERT_VK_SUCCESS(err);
13357
13358 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013359 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013360 data.event = event;
13361 data.bailout = false;
13362 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013363
13364 // First do some correct operations using multiple threads.
13365 // Add many entries to command buffer from another thread.
13366 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13367 // Make non-conflicting calls from this thread at the same time.
13368 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013369 uint32_t count;
13370 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013371 }
13372 test_platform_thread_join(thread, NULL);
13373
13374 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013375 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013376 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013377 // Add many entries to command buffer from this thread at the same time.
13378 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013379
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013380 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013381 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013382
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013383 m_errorMonitor->SetBailout(NULL);
13384
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013385 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013386
Chia-I Wuf7458c52015-10-26 21:10:41 +080013387 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013388}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013389#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013390
Karl Schultz6addd812016-02-02 17:17:23 -070013391TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013392 TEST_DESCRIPTION(
13393 "Test that an error is produced for a spirv module "
13394 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013395
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013397
Tony Barbour1fa09702017-03-16 12:09:08 -060013398 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13400
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013401 VkShaderModule module;
13402 VkShaderModuleCreateInfo moduleCreateInfo;
13403 struct icd_spv_header spv;
13404
13405 spv.magic = ICD_SPV_MAGIC;
13406 spv.version = ICD_SPV_VERSION;
13407 spv.gen_magic = 0;
13408
13409 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13410 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013411 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013412 moduleCreateInfo.codeSize = 4;
13413 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013414 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013415
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013416 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013417}
13418
Karl Schultz6addd812016-02-02 17:17:23 -070013419TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013420 TEST_DESCRIPTION(
13421 "Test that an error is produced for a spirv module "
13422 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013423
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013425
Tony Barbour1fa09702017-03-16 12:09:08 -060013426 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13428
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013429 VkShaderModule module;
13430 VkShaderModuleCreateInfo moduleCreateInfo;
13431 struct icd_spv_header spv;
13432
13433 spv.magic = ~ICD_SPV_MAGIC;
13434 spv.version = ICD_SPV_VERSION;
13435 spv.gen_magic = 0;
13436
13437 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13438 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013439 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013440 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13441 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013442 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013443
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013444 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013445}
13446
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013447#if 0
13448// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013449TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013451 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013452
Tony Barbour1fa09702017-03-16 12:09:08 -060013453 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013454 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13455
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013456 VkShaderModule module;
13457 VkShaderModuleCreateInfo moduleCreateInfo;
13458 struct icd_spv_header spv;
13459
13460 spv.magic = ICD_SPV_MAGIC;
13461 spv.version = ~ICD_SPV_VERSION;
13462 spv.gen_magic = 0;
13463
13464 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13465 moduleCreateInfo.pNext = NULL;
13466
Karl Schultz6addd812016-02-02 17:17:23 -070013467 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013468 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13469 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013470 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013471
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013472 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013473}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013474#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013475
Karl Schultz6addd812016-02-02 17:17:23 -070013476TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013477 TEST_DESCRIPTION(
13478 "Test that a warning is produced for a vertex output that "
13479 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013480 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013481
Tony Barbour1fa09702017-03-16 12:09:08 -060013482 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013484
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013485 char const *vsSource =
13486 "#version 450\n"
13487 "\n"
13488 "layout(location=0) out float x;\n"
13489 "out gl_PerVertex {\n"
13490 " vec4 gl_Position;\n"
13491 "};\n"
13492 "void main(){\n"
13493 " gl_Position = vec4(1);\n"
13494 " x = 0;\n"
13495 "}\n";
13496 char const *fsSource =
13497 "#version 450\n"
13498 "\n"
13499 "layout(location=0) out vec4 color;\n"
13500 "void main(){\n"
13501 " color = vec4(1);\n"
13502 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013503
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013504 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13505 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013506
13507 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013508 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013509 pipe.AddShader(&vs);
13510 pipe.AddShader(&fs);
13511
Chris Forbes9f7ff632015-05-25 11:13:08 +120013512 VkDescriptorSetObj descriptorSet(m_device);
13513 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013514 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013515
Tony Barbour5781e8f2015-08-04 16:23:11 -060013516 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013517
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013518 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013519}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013520
Mark Mueller098c9cb2016-09-08 09:01:57 -060013521TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13522 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13523
Tony Barbour1fa09702017-03-16 12:09:08 -060013524 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013525 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13526
13527 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013528 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013529
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013530 char const *vsSource =
13531 "#version 450\n"
13532 "\n"
13533 "out gl_PerVertex {\n"
13534 " vec4 gl_Position;\n"
13535 "};\n"
13536 "void main(){\n"
13537 " gl_Position = vec4(1);\n"
13538 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013539
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013540 char const *fsSource =
13541 "#version 450\n"
13542 "\n"
13543 "layout (constant_id = 0) const float r = 0.0f;\n"
13544 "layout(location = 0) out vec4 uFragColor;\n"
13545 "void main(){\n"
13546 " uFragColor = vec4(r,1,0,1);\n"
13547 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013548
13549 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13550 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13551
13552 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13553 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13554
13555 VkPipelineLayout pipeline_layout;
13556 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13557
13558 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13559 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13560 vp_state_create_info.viewportCount = 1;
13561 VkViewport viewport = {};
13562 vp_state_create_info.pViewports = &viewport;
13563 vp_state_create_info.scissorCount = 1;
13564 VkRect2D scissors = {};
13565 vp_state_create_info.pScissors = &scissors;
13566
13567 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13568
13569 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13570 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13571 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13572 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13573
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013574 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013575
13576 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13577 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13578
13579 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13580 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13581 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13582
13583 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13584 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13585 rasterization_state_create_info.pNext = nullptr;
13586 rasterization_state_create_info.lineWidth = 1.0f;
13587 rasterization_state_create_info.rasterizerDiscardEnable = true;
13588
13589 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13590 color_blend_attachment_state.blendEnable = VK_FALSE;
13591 color_blend_attachment_state.colorWriteMask = 0xf;
13592
13593 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13594 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13595 color_blend_state_create_info.attachmentCount = 1;
13596 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13597
13598 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13599 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13600 graphicspipe_create_info.stageCount = 2;
13601 graphicspipe_create_info.pStages = shader_stage_create_info;
13602 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13603 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13604 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13605 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13606 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13607 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13608 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13609 graphicspipe_create_info.layout = pipeline_layout;
13610 graphicspipe_create_info.renderPass = renderPass();
13611
13612 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13613 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13614
13615 VkPipelineCache pipelineCache;
13616 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13617
13618 // This structure maps constant ids to data locations.
13619 const VkSpecializationMapEntry entry =
13620 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013621 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013622
13623 uint32_t data = 1;
13624
13625 // Set up the info describing spec map and data
13626 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013627 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013628 };
13629 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13630
13631 VkPipeline pipeline;
13632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13633 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13634 m_errorMonitor->VerifyFound();
13635
13636 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13637 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13638}
13639
13640TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13641 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13642
Tony Barbour1fa09702017-03-16 12:09:08 -060013643 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013644 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13645
13646 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13647
13648 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13649 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13650 descriptor_pool_type_count[0].descriptorCount = 1;
13651 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13652 descriptor_pool_type_count[1].descriptorCount = 1;
13653
13654 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13655 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13656 descriptor_pool_create_info.maxSets = 1;
13657 descriptor_pool_create_info.poolSizeCount = 2;
13658 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13659 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13660
13661 VkDescriptorPool descriptorset_pool;
13662 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13663
13664 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13665 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13666 descriptorset_layout_binding.descriptorCount = 1;
13667 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013668 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013669
13670 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13671 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13672 descriptorset_layout_create_info.bindingCount = 1;
13673 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13674
13675 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013676 ASSERT_VK_SUCCESS(
13677 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013678
13679 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13680 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13681 descriptorset_allocate_info.descriptorSetCount = 1;
13682 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13683 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13684 VkDescriptorSet descriptorset;
13685 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13686
13687 // Challenge core_validation with a non uniform buffer type.
13688 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13689
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013690 char const *vsSource =
13691 "#version 450\n"
13692 "\n"
13693 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13694 " mat4 mvp;\n"
13695 "} ubuf;\n"
13696 "out gl_PerVertex {\n"
13697 " vec4 gl_Position;\n"
13698 "};\n"
13699 "void main(){\n"
13700 " gl_Position = ubuf.mvp * vec4(1);\n"
13701 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013702
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013703 char const *fsSource =
13704 "#version 450\n"
13705 "\n"
13706 "layout(location = 0) out vec4 uFragColor;\n"
13707 "void main(){\n"
13708 " uFragColor = vec4(0,1,0,1);\n"
13709 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013710
13711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13713
13714 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13715 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13716 pipeline_layout_create_info.setLayoutCount = 1;
13717 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13718
13719 VkPipelineLayout pipeline_layout;
13720 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13721
13722 VkPipelineObj pipe(m_device);
13723 pipe.AddColorAttachment();
13724 pipe.AddShader(&vs);
13725 pipe.AddShader(&fs);
13726
13727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13728 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13729 m_errorMonitor->VerifyFound();
13730
13731 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13732 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13733 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13734}
13735
13736TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13737 TEST_DESCRIPTION(
13738 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13739
Tony Barbour1fa09702017-03-16 12:09:08 -060013740 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013741 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13742
13743 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13744
13745 VkDescriptorPoolSize descriptor_pool_type_count = {};
13746 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13747 descriptor_pool_type_count.descriptorCount = 1;
13748
13749 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13750 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13751 descriptor_pool_create_info.maxSets = 1;
13752 descriptor_pool_create_info.poolSizeCount = 1;
13753 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13754 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13755
13756 VkDescriptorPool descriptorset_pool;
13757 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13758
13759 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13760 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13761 descriptorset_layout_binding.descriptorCount = 1;
13762 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13763 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013764 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013765
13766 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13767 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13768 descriptorset_layout_create_info.bindingCount = 1;
13769 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13770
13771 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013772 ASSERT_VK_SUCCESS(
13773 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013774
13775 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13776 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13777 descriptorset_allocate_info.descriptorSetCount = 1;
13778 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13779 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13780 VkDescriptorSet descriptorset;
13781 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13782
13783 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13784
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013785 char const *vsSource =
13786 "#version 450\n"
13787 "\n"
13788 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13789 " mat4 mvp;\n"
13790 "} ubuf;\n"
13791 "out gl_PerVertex {\n"
13792 " vec4 gl_Position;\n"
13793 "};\n"
13794 "void main(){\n"
13795 " gl_Position = ubuf.mvp * vec4(1);\n"
13796 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013797
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013798 char const *fsSource =
13799 "#version 450\n"
13800 "\n"
13801 "layout(location = 0) out vec4 uFragColor;\n"
13802 "void main(){\n"
13803 " uFragColor = vec4(0,1,0,1);\n"
13804 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013805
13806 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13807 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13808
13809 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13810 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13811 pipeline_layout_create_info.setLayoutCount = 1;
13812 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13813
13814 VkPipelineLayout pipeline_layout;
13815 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13816
13817 VkPipelineObj pipe(m_device);
13818 pipe.AddColorAttachment();
13819 pipe.AddShader(&vs);
13820 pipe.AddShader(&fs);
13821
13822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13823 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13824 m_errorMonitor->VerifyFound();
13825
13826 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13827 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13828 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13829}
13830
13831TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013832 TEST_DESCRIPTION(
13833 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13834 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013835
Tony Barbour1fa09702017-03-16 12:09:08 -060013836 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13838
13839 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013840 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013841
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013842 char const *vsSource =
13843 "#version 450\n"
13844 "\n"
13845 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13846 "out gl_PerVertex {\n"
13847 " vec4 gl_Position;\n"
13848 "};\n"
13849 "void main(){\n"
13850 " gl_Position = vec4(consts.x);\n"
13851 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013853 char const *fsSource =
13854 "#version 450\n"
13855 "\n"
13856 "layout(location = 0) out vec4 uFragColor;\n"
13857 "void main(){\n"
13858 " uFragColor = vec4(0,1,0,1);\n"
13859 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013860
13861 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13862 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13863
13864 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13865 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13866
13867 // Set up a push constant range
13868 VkPushConstantRange push_constant_ranges = {};
13869 // Set to the wrong stage to challenge core_validation
13870 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13871 push_constant_ranges.size = 4;
13872
13873 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13874 pipeline_layout_create_info.pushConstantRangeCount = 1;
13875
13876 VkPipelineLayout pipeline_layout;
13877 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13878
13879 VkPipelineObj pipe(m_device);
13880 pipe.AddColorAttachment();
13881 pipe.AddShader(&vs);
13882 pipe.AddShader(&fs);
13883
13884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13885 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13886 m_errorMonitor->VerifyFound();
13887
13888 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13889}
13890
13891TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13892 TEST_DESCRIPTION(
13893 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13894
Tony Barbour1fa09702017-03-16 12:09:08 -060013895 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13897
13898 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013899 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013900
13901 // Some awkward steps are required to test with custom device features.
13902 std::vector<const char *> device_extension_names;
13903 auto features = m_device->phy().features();
13904 // Disable support for 64 bit floats
13905 features.shaderFloat64 = false;
13906 // The sacrificial device object
13907 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13908
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013909 char const *vsSource =
13910 "#version 450\n"
13911 "\n"
13912 "out gl_PerVertex {\n"
13913 " vec4 gl_Position;\n"
13914 "};\n"
13915 "void main(){\n"
13916 " gl_Position = vec4(1);\n"
13917 "}\n";
13918 char const *fsSource =
13919 "#version 450\n"
13920 "\n"
13921 "layout(location=0) out vec4 color;\n"
13922 "void main(){\n"
13923 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13924 " color = vec4(green);\n"
13925 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013926
13927 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13928 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13929
13930 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013931
13932 VkPipelineObj pipe(&test_device);
13933 pipe.AddColorAttachment();
13934 pipe.AddShader(&vs);
13935 pipe.AddShader(&fs);
13936
13937 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13938 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13939 VkPipelineLayout pipeline_layout;
13940 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13941
13942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13943 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13944 m_errorMonitor->VerifyFound();
13945
13946 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13947}
13948
13949TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13950 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13951
Tony Barbour1fa09702017-03-16 12:09:08 -060013952 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013953 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13954
13955 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13956
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013957 char const *vsSource =
13958 "#version 450\n"
13959 "\n"
13960 "out gl_PerVertex {\n"
13961 " vec4 gl_Position;\n"
13962 "};\n"
13963 "layout(xfb_buffer = 1) out;"
13964 "void main(){\n"
13965 " gl_Position = vec4(1);\n"
13966 "}\n";
13967 char const *fsSource =
13968 "#version 450\n"
13969 "\n"
13970 "layout(location=0) out vec4 color;\n"
13971 "void main(){\n"
13972 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13973 " color = vec4(green);\n"
13974 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013975
13976 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13977 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13978
13979 VkPipelineObj pipe(m_device);
13980 pipe.AddColorAttachment();
13981 pipe.AddShader(&vs);
13982 pipe.AddShader(&fs);
13983
13984 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13985 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13986 VkPipelineLayout pipeline_layout;
13987 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13988
13989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13990 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13991 m_errorMonitor->VerifyFound();
13992
13993 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13994}
13995
Karl Schultz6addd812016-02-02 17:17:23 -070013996TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013997 TEST_DESCRIPTION(
13998 "Test that an error is produced for a fragment shader input "
13999 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120014000
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014002
Tony Barbour1fa09702017-03-16 12:09:08 -060014003 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014004 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014005
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014006 char const *vsSource =
14007 "#version 450\n"
14008 "\n"
14009 "out gl_PerVertex {\n"
14010 " vec4 gl_Position;\n"
14011 "};\n"
14012 "void main(){\n"
14013 " gl_Position = vec4(1);\n"
14014 "}\n";
14015 char const *fsSource =
14016 "#version 450\n"
14017 "\n"
14018 "layout(location=0) in float x;\n"
14019 "layout(location=0) out vec4 color;\n"
14020 "void main(){\n"
14021 " color = vec4(x);\n"
14022 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014023
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014024 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14025 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014026
14027 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014028 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014029 pipe.AddShader(&vs);
14030 pipe.AddShader(&fs);
14031
Chris Forbes59cb88d2015-05-25 11:13:13 +120014032 VkDescriptorSetObj descriptorSet(m_device);
14033 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014034 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014035
Tony Barbour5781e8f2015-08-04 16:23:11 -060014036 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014037
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014038 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014039}
14040
Karl Schultz6addd812016-02-02 17:17:23 -070014041TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014042 TEST_DESCRIPTION(
14043 "Test that an error is produced for a fragment shader input "
14044 "within an interace block, which is not present in the outputs "
14045 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014046 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014047
Tony Barbour1fa09702017-03-16 12:09:08 -060014048 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014049 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14050
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014051 char const *vsSource =
14052 "#version 450\n"
14053 "\n"
14054 "out gl_PerVertex {\n"
14055 " vec4 gl_Position;\n"
14056 "};\n"
14057 "void main(){\n"
14058 " gl_Position = vec4(1);\n"
14059 "}\n";
14060 char const *fsSource =
14061 "#version 450\n"
14062 "\n"
14063 "in block { layout(location=0) float x; } ins;\n"
14064 "layout(location=0) out vec4 color;\n"
14065 "void main(){\n"
14066 " color = vec4(ins.x);\n"
14067 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014068
14069 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14070 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14071
14072 VkPipelineObj pipe(m_device);
14073 pipe.AddColorAttachment();
14074 pipe.AddShader(&vs);
14075 pipe.AddShader(&fs);
14076
14077 VkDescriptorSetObj descriptorSet(m_device);
14078 descriptorSet.AppendDummy();
14079 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14080
14081 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14082
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014083 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014084}
14085
Karl Schultz6addd812016-02-02 17:17:23 -070014086TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014087 TEST_DESCRIPTION(
14088 "Test that an error is produced for mismatched array sizes "
14089 "across the vertex->fragment shader interface");
14090 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14091 "Type mismatch on location 0.0: 'ptr to "
14092 "output arr[2] of float32' vs 'ptr to "
14093 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014094
Tony Barbour1fa09702017-03-16 12:09:08 -060014095 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014096 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14097
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014098 char const *vsSource =
14099 "#version 450\n"
14100 "\n"
14101 "layout(location=0) out float x[2];\n"
14102 "out gl_PerVertex {\n"
14103 " vec4 gl_Position;\n"
14104 "};\n"
14105 "void main(){\n"
14106 " x[0] = 0; x[1] = 0;\n"
14107 " gl_Position = vec4(1);\n"
14108 "}\n";
14109 char const *fsSource =
14110 "#version 450\n"
14111 "\n"
14112 "layout(location=0) in float x[1];\n"
14113 "layout(location=0) out vec4 color;\n"
14114 "void main(){\n"
14115 " color = vec4(x[0]);\n"
14116 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014117
14118 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14119 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14120
14121 VkPipelineObj pipe(m_device);
14122 pipe.AddColorAttachment();
14123 pipe.AddShader(&vs);
14124 pipe.AddShader(&fs);
14125
14126 VkDescriptorSetObj descriptorSet(m_device);
14127 descriptorSet.AppendDummy();
14128 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14129
14130 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14131
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014132 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014133}
14134
Karl Schultz6addd812016-02-02 17:17:23 -070014135TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014136 TEST_DESCRIPTION(
14137 "Test that an error is produced for mismatched types across "
14138 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014139 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014140
Tony Barbour1fa09702017-03-16 12:09:08 -060014141 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014143
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014144 char const *vsSource =
14145 "#version 450\n"
14146 "\n"
14147 "layout(location=0) out int x;\n"
14148 "out gl_PerVertex {\n"
14149 " vec4 gl_Position;\n"
14150 "};\n"
14151 "void main(){\n"
14152 " x = 0;\n"
14153 " gl_Position = vec4(1);\n"
14154 "}\n";
14155 char const *fsSource =
14156 "#version 450\n"
14157 "\n"
14158 "layout(location=0) in float x;\n" /* VS writes int */
14159 "layout(location=0) out vec4 color;\n"
14160 "void main(){\n"
14161 " color = vec4(x);\n"
14162 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014163
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014164 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14165 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014166
14167 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014168 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014169 pipe.AddShader(&vs);
14170 pipe.AddShader(&fs);
14171
Chris Forbesb56af562015-05-25 11:13:17 +120014172 VkDescriptorSetObj descriptorSet(m_device);
14173 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014174 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014175
Tony Barbour5781e8f2015-08-04 16:23:11 -060014176 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014177
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014178 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014179}
14180
Karl Schultz6addd812016-02-02 17:17:23 -070014181TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014182 TEST_DESCRIPTION(
14183 "Test that an error is produced for mismatched types across "
14184 "the vertex->fragment shader interface, when the variable is contained within "
14185 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014187
Tony Barbour1fa09702017-03-16 12:09:08 -060014188 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14190
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014191 char const *vsSource =
14192 "#version 450\n"
14193 "\n"
14194 "out block { layout(location=0) int x; } outs;\n"
14195 "out gl_PerVertex {\n"
14196 " vec4 gl_Position;\n"
14197 "};\n"
14198 "void main(){\n"
14199 " outs.x = 0;\n"
14200 " gl_Position = vec4(1);\n"
14201 "}\n";
14202 char const *fsSource =
14203 "#version 450\n"
14204 "\n"
14205 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14206 "layout(location=0) out vec4 color;\n"
14207 "void main(){\n"
14208 " color = vec4(ins.x);\n"
14209 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014210
14211 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14212 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14213
14214 VkPipelineObj pipe(m_device);
14215 pipe.AddColorAttachment();
14216 pipe.AddShader(&vs);
14217 pipe.AddShader(&fs);
14218
14219 VkDescriptorSetObj descriptorSet(m_device);
14220 descriptorSet.AppendDummy();
14221 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14222
14223 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14224
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014225 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014226}
14227
14228TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014229 TEST_DESCRIPTION(
14230 "Test that an error is produced for location mismatches across "
14231 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14232 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014233 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 +130014234
Tony Barbour1fa09702017-03-16 12:09:08 -060014235 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14237
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014238 char const *vsSource =
14239 "#version 450\n"
14240 "\n"
14241 "out block { layout(location=1) float x; } outs;\n"
14242 "out gl_PerVertex {\n"
14243 " vec4 gl_Position;\n"
14244 "};\n"
14245 "void main(){\n"
14246 " outs.x = 0;\n"
14247 " gl_Position = vec4(1);\n"
14248 "}\n";
14249 char const *fsSource =
14250 "#version 450\n"
14251 "\n"
14252 "in block { layout(location=0) float x; } ins;\n"
14253 "layout(location=0) out vec4 color;\n"
14254 "void main(){\n"
14255 " color = vec4(ins.x);\n"
14256 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014257
14258 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14259 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14260
14261 VkPipelineObj pipe(m_device);
14262 pipe.AddColorAttachment();
14263 pipe.AddShader(&vs);
14264 pipe.AddShader(&fs);
14265
14266 VkDescriptorSetObj descriptorSet(m_device);
14267 descriptorSet.AppendDummy();
14268 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14269
14270 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14271
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014272 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014273}
14274
14275TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014276 TEST_DESCRIPTION(
14277 "Test that an error is produced for component mismatches across the "
14278 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14279 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014280 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 +130014281
Tony Barbour1fa09702017-03-16 12:09:08 -060014282 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14284
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014285 char const *vsSource =
14286 "#version 450\n"
14287 "\n"
14288 "out block { layout(location=0, component=0) float x; } outs;\n"
14289 "out gl_PerVertex {\n"
14290 " vec4 gl_Position;\n"
14291 "};\n"
14292 "void main(){\n"
14293 " outs.x = 0;\n"
14294 " gl_Position = vec4(1);\n"
14295 "}\n";
14296 char const *fsSource =
14297 "#version 450\n"
14298 "\n"
14299 "in block { layout(location=0, component=1) float x; } ins;\n"
14300 "layout(location=0) out vec4 color;\n"
14301 "void main(){\n"
14302 " color = vec4(ins.x);\n"
14303 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014304
14305 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14306 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14307
14308 VkPipelineObj pipe(m_device);
14309 pipe.AddColorAttachment();
14310 pipe.AddShader(&vs);
14311 pipe.AddShader(&fs);
14312
14313 VkDescriptorSetObj descriptorSet(m_device);
14314 descriptorSet.AppendDummy();
14315 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14316
14317 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14318
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014319 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014320}
14321
Chris Forbes1f3b0152016-11-30 12:48:40 +130014322TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14323 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14324
Tony Barbour1fa09702017-03-16 12:09:08 -060014325 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14327
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014328 char const *vsSource =
14329 "#version 450\n"
14330 "layout(location=0) out mediump float x;\n"
14331 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14332 char const *fsSource =
14333 "#version 450\n"
14334 "layout(location=0) in highp float x;\n"
14335 "layout(location=0) out vec4 color;\n"
14336 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014337
14338 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14339 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14340
14341 VkPipelineObj pipe(m_device);
14342 pipe.AddColorAttachment();
14343 pipe.AddShader(&vs);
14344 pipe.AddShader(&fs);
14345
14346 VkDescriptorSetObj descriptorSet(m_device);
14347 descriptorSet.AppendDummy();
14348 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14349
14350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14351
14352 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14353
14354 m_errorMonitor->VerifyFound();
14355}
14356
Chris Forbes870a39e2016-11-30 12:55:56 +130014357TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14358 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14359
Tony Barbour1fa09702017-03-16 12:09:08 -060014360 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14362
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014363 char const *vsSource =
14364 "#version 450\n"
14365 "out block { layout(location=0) mediump float x; };\n"
14366 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14367 char const *fsSource =
14368 "#version 450\n"
14369 "in block { layout(location=0) highp float x; };\n"
14370 "layout(location=0) out vec4 color;\n"
14371 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014372
14373 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14374 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14375
14376 VkPipelineObj pipe(m_device);
14377 pipe.AddColorAttachment();
14378 pipe.AddShader(&vs);
14379 pipe.AddShader(&fs);
14380
14381 VkDescriptorSetObj descriptorSet(m_device);
14382 descriptorSet.AppendDummy();
14383 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14384
14385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14386
14387 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14388
14389 m_errorMonitor->VerifyFound();
14390}
14391
Karl Schultz6addd812016-02-02 17:17:23 -070014392TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014393 TEST_DESCRIPTION(
14394 "Test that a warning is produced for a vertex attribute which is "
14395 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014397
Tony Barbour1fa09702017-03-16 12:09:08 -060014398 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014400
14401 VkVertexInputBindingDescription input_binding;
14402 memset(&input_binding, 0, sizeof(input_binding));
14403
14404 VkVertexInputAttributeDescription input_attrib;
14405 memset(&input_attrib, 0, sizeof(input_attrib));
14406 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14407
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014408 char const *vsSource =
14409 "#version 450\n"
14410 "\n"
14411 "out gl_PerVertex {\n"
14412 " vec4 gl_Position;\n"
14413 "};\n"
14414 "void main(){\n"
14415 " gl_Position = vec4(1);\n"
14416 "}\n";
14417 char const *fsSource =
14418 "#version 450\n"
14419 "\n"
14420 "layout(location=0) out vec4 color;\n"
14421 "void main(){\n"
14422 " color = vec4(1);\n"
14423 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014424
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014425 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14426 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014427
14428 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014429 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014430 pipe.AddShader(&vs);
14431 pipe.AddShader(&fs);
14432
14433 pipe.AddVertexInputBindings(&input_binding, 1);
14434 pipe.AddVertexInputAttribs(&input_attrib, 1);
14435
Chris Forbesde136e02015-05-25 11:13:28 +120014436 VkDescriptorSetObj descriptorSet(m_device);
14437 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014438 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014439
Tony Barbour5781e8f2015-08-04 16:23:11 -060014440 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014441
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014442 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014443}
14444
Karl Schultz6addd812016-02-02 17:17:23 -070014445TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014446 TEST_DESCRIPTION(
14447 "Test that a warning is produced for a location mismatch on "
14448 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014450
Tony Barbour1fa09702017-03-16 12:09:08 -060014451 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14453
14454 VkVertexInputBindingDescription input_binding;
14455 memset(&input_binding, 0, sizeof(input_binding));
14456
14457 VkVertexInputAttributeDescription input_attrib;
14458 memset(&input_attrib, 0, sizeof(input_attrib));
14459 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14460
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014461 char const *vsSource =
14462 "#version 450\n"
14463 "\n"
14464 "layout(location=1) in float x;\n"
14465 "out gl_PerVertex {\n"
14466 " vec4 gl_Position;\n"
14467 "};\n"
14468 "void main(){\n"
14469 " gl_Position = vec4(x);\n"
14470 "}\n";
14471 char const *fsSource =
14472 "#version 450\n"
14473 "\n"
14474 "layout(location=0) out vec4 color;\n"
14475 "void main(){\n"
14476 " color = vec4(1);\n"
14477 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014478
14479 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14480 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14481
14482 VkPipelineObj pipe(m_device);
14483 pipe.AddColorAttachment();
14484 pipe.AddShader(&vs);
14485 pipe.AddShader(&fs);
14486
14487 pipe.AddVertexInputBindings(&input_binding, 1);
14488 pipe.AddVertexInputAttribs(&input_attrib, 1);
14489
14490 VkDescriptorSetObj descriptorSet(m_device);
14491 descriptorSet.AppendDummy();
14492 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14493
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014494 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014495 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14496
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014497 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014498}
14499
Karl Schultz6addd812016-02-02 17:17:23 -070014500TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014501 TEST_DESCRIPTION(
14502 "Test that an error is produced for a vertex shader input which is not "
14503 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14505 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014506
Tony Barbour1fa09702017-03-16 12:09:08 -060014507 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014509
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014510 char const *vsSource =
14511 "#version 450\n"
14512 "\n"
14513 "layout(location=0) in vec4 x;\n" /* not provided */
14514 "out gl_PerVertex {\n"
14515 " vec4 gl_Position;\n"
14516 "};\n"
14517 "void main(){\n"
14518 " gl_Position = x;\n"
14519 "}\n";
14520 char const *fsSource =
14521 "#version 450\n"
14522 "\n"
14523 "layout(location=0) out vec4 color;\n"
14524 "void main(){\n"
14525 " color = vec4(1);\n"
14526 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014527
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014528 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14529 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014530
14531 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014532 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014533 pipe.AddShader(&vs);
14534 pipe.AddShader(&fs);
14535
Chris Forbes62e8e502015-05-25 11:13:29 +120014536 VkDescriptorSetObj descriptorSet(m_device);
14537 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014538 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014539
Tony Barbour5781e8f2015-08-04 16:23:11 -060014540 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014541
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014542 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014543}
14544
Karl Schultz6addd812016-02-02 17:17:23 -070014545TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014546 TEST_DESCRIPTION(
14547 "Test that an error is produced for a mismatch between the "
14548 "fundamental type (float/int/uint) of an attribute and the "
14549 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014550 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 -060014551
Tony Barbour1fa09702017-03-16 12:09:08 -060014552 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014554
14555 VkVertexInputBindingDescription input_binding;
14556 memset(&input_binding, 0, sizeof(input_binding));
14557
14558 VkVertexInputAttributeDescription input_attrib;
14559 memset(&input_attrib, 0, sizeof(input_attrib));
14560 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14561
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014562 char const *vsSource =
14563 "#version 450\n"
14564 "\n"
14565 "layout(location=0) in int x;\n" /* attrib provided float */
14566 "out gl_PerVertex {\n"
14567 " vec4 gl_Position;\n"
14568 "};\n"
14569 "void main(){\n"
14570 " gl_Position = vec4(x);\n"
14571 "}\n";
14572 char const *fsSource =
14573 "#version 450\n"
14574 "\n"
14575 "layout(location=0) out vec4 color;\n"
14576 "void main(){\n"
14577 " color = vec4(1);\n"
14578 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014579
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014580 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14581 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014582
14583 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014584 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014585 pipe.AddShader(&vs);
14586 pipe.AddShader(&fs);
14587
14588 pipe.AddVertexInputBindings(&input_binding, 1);
14589 pipe.AddVertexInputAttribs(&input_attrib, 1);
14590
Chris Forbesc97d98e2015-05-25 11:13:31 +120014591 VkDescriptorSetObj descriptorSet(m_device);
14592 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014593 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014594
Tony Barbour5781e8f2015-08-04 16:23:11 -060014595 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014596
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014597 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014598}
14599
Chris Forbesc68b43c2016-04-06 11:18:47 +120014600TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014601 TEST_DESCRIPTION(
14602 "Test that an error is produced for a pipeline containing multiple "
14603 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14605 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014606
Tony Barbour1fa09702017-03-16 12:09:08 -060014607 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014608 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14609
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014610 char const *vsSource =
14611 "#version 450\n"
14612 "\n"
14613 "out gl_PerVertex {\n"
14614 " vec4 gl_Position;\n"
14615 "};\n"
14616 "void main(){\n"
14617 " gl_Position = vec4(1);\n"
14618 "}\n";
14619 char const *fsSource =
14620 "#version 450\n"
14621 "\n"
14622 "layout(location=0) out vec4 color;\n"
14623 "void main(){\n"
14624 " color = vec4(1);\n"
14625 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014626
14627 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14628 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14629
14630 VkPipelineObj pipe(m_device);
14631 pipe.AddColorAttachment();
14632 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014633 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014634 pipe.AddShader(&fs);
14635
14636 VkDescriptorSetObj descriptorSet(m_device);
14637 descriptorSet.AppendDummy();
14638 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14639
14640 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14641
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014642 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014643}
14644
Chris Forbes82ff92a2016-09-09 10:50:24 +120014645TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014647
Tony Barbour1fa09702017-03-16 12:09:08 -060014648 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014649 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14650
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014651 char const *vsSource =
14652 "#version 450\n"
14653 "out gl_PerVertex {\n"
14654 " vec4 gl_Position;\n"
14655 "};\n"
14656 "void main(){\n"
14657 " gl_Position = vec4(0);\n"
14658 "}\n";
14659 char const *fsSource =
14660 "#version 450\n"
14661 "\n"
14662 "layout(location=0) out vec4 color;\n"
14663 "void main(){\n"
14664 " color = vec4(1);\n"
14665 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014666
14667 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14668 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14669
14670 VkPipelineObj pipe(m_device);
14671 pipe.AddColorAttachment();
14672 pipe.AddShader(&vs);
14673 pipe.AddShader(&fs);
14674
14675 VkDescriptorSetObj descriptorSet(m_device);
14676 descriptorSet.AppendDummy();
14677 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14678
14679 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14680
14681 m_errorMonitor->VerifyFound();
14682}
14683
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014684TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014685 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14686 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14687 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014688
Tony Barbour1fa09702017-03-16 12:09:08 -060014689 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14691
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014692 char const *vsSource =
14693 "#version 450\n"
14694 "void main(){ gl_Position = vec4(0); }\n";
14695 char const *fsSource =
14696 "#version 450\n"
14697 "\n"
14698 "layout(location=0) out vec4 color;\n"
14699 "void main(){\n"
14700 " color = vec4(1);\n"
14701 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014702
14703 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14704 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14705
14706 VkPipelineObj pipe(m_device);
14707 pipe.AddColorAttachment();
14708 pipe.AddShader(&vs);
14709 pipe.AddShader(&fs);
14710
14711 VkDescriptorSetObj descriptorSet(m_device);
14712 descriptorSet.AppendDummy();
14713 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14714
14715 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014716 {
14717 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14718 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14719 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014720 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014721 {
14722 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14723 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14724 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014725 },
14726 };
14727 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014728 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014729 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014730 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14731 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014732 VkRenderPass rp;
14733 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14734 ASSERT_VK_SUCCESS(err);
14735
14736 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14737
14738 m_errorMonitor->VerifyFound();
14739
14740 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14741}
14742
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014743TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014744 TEST_DESCRIPTION(
14745 "Test that an error is produced for a variable output from "
14746 "the TCS without the patch decoration, but consumed in the TES "
14747 "with the decoration.");
14748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14749 "is per-vertex in tessellation control shader stage "
14750 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014751
Tony Barbour1fa09702017-03-16 12:09:08 -060014752 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14754
Chris Forbesc1e852d2016-04-04 19:26:42 +120014755 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014756 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014757 return;
14758 }
14759
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014760 char const *vsSource =
14761 "#version 450\n"
14762 "void main(){}\n";
14763 char const *tcsSource =
14764 "#version 450\n"
14765 "layout(location=0) out int x[];\n"
14766 "layout(vertices=3) out;\n"
14767 "void main(){\n"
14768 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14769 " gl_TessLevelInner[0] = 1;\n"
14770 " x[gl_InvocationID] = gl_InvocationID;\n"
14771 "}\n";
14772 char const *tesSource =
14773 "#version 450\n"
14774 "layout(triangles, equal_spacing, cw) in;\n"
14775 "layout(location=0) patch in int x;\n"
14776 "out gl_PerVertex { vec4 gl_Position; };\n"
14777 "void main(){\n"
14778 " gl_Position.xyz = gl_TessCoord;\n"
14779 " gl_Position.w = x;\n"
14780 "}\n";
14781 char const *fsSource =
14782 "#version 450\n"
14783 "layout(location=0) out vec4 color;\n"
14784 "void main(){\n"
14785 " color = vec4(1);\n"
14786 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014787
14788 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14789 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14790 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14791 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14792
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014793 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14794 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014795
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014796 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014797
14798 VkPipelineObj pipe(m_device);
14799 pipe.SetInputAssembly(&iasci);
14800 pipe.SetTessellation(&tsci);
14801 pipe.AddColorAttachment();
14802 pipe.AddShader(&vs);
14803 pipe.AddShader(&tcs);
14804 pipe.AddShader(&tes);
14805 pipe.AddShader(&fs);
14806
14807 VkDescriptorSetObj descriptorSet(m_device);
14808 descriptorSet.AppendDummy();
14809 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14810
14811 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14812
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014813 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014814}
14815
Karl Schultz6addd812016-02-02 17:17:23 -070014816TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014817 TEST_DESCRIPTION(
14818 "Test that an error is produced for a vertex attribute setup where multiple "
14819 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14821 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014822
Tony Barbour1fa09702017-03-16 12:09:08 -060014823 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014825
14826 /* Two binding descriptions for binding 0 */
14827 VkVertexInputBindingDescription input_bindings[2];
14828 memset(input_bindings, 0, sizeof(input_bindings));
14829
14830 VkVertexInputAttributeDescription input_attrib;
14831 memset(&input_attrib, 0, sizeof(input_attrib));
14832 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14833
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014834 char const *vsSource =
14835 "#version 450\n"
14836 "\n"
14837 "layout(location=0) in float x;\n" /* attrib provided float */
14838 "out gl_PerVertex {\n"
14839 " vec4 gl_Position;\n"
14840 "};\n"
14841 "void main(){\n"
14842 " gl_Position = vec4(x);\n"
14843 "}\n";
14844 char const *fsSource =
14845 "#version 450\n"
14846 "\n"
14847 "layout(location=0) out vec4 color;\n"
14848 "void main(){\n"
14849 " color = vec4(1);\n"
14850 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014851
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014852 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14853 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014854
14855 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014856 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014857 pipe.AddShader(&vs);
14858 pipe.AddShader(&fs);
14859
14860 pipe.AddVertexInputBindings(input_bindings, 2);
14861 pipe.AddVertexInputAttribs(&input_attrib, 1);
14862
Chris Forbes280ba2c2015-06-12 11:16:41 +120014863 VkDescriptorSetObj descriptorSet(m_device);
14864 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014865 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014866
Tony Barbour5781e8f2015-08-04 16:23:11 -060014867 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014868
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014869 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014870}
Chris Forbes8f68b562015-05-25 11:13:32 +120014871
Karl Schultz6addd812016-02-02 17:17:23 -070014872TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014873 TEST_DESCRIPTION(
14874 "Test that an error is produced for a fragment shader which does not "
14875 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014877
Tony Barbour1fa09702017-03-16 12:09:08 -060014878 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014879
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014880 char const *vsSource =
14881 "#version 450\n"
14882 "\n"
14883 "out gl_PerVertex {\n"
14884 " vec4 gl_Position;\n"
14885 "};\n"
14886 "void main(){\n"
14887 " gl_Position = vec4(1);\n"
14888 "}\n";
14889 char const *fsSource =
14890 "#version 450\n"
14891 "\n"
14892 "void main(){\n"
14893 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014894
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014895 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14896 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014897
14898 VkPipelineObj pipe(m_device);
14899 pipe.AddShader(&vs);
14900 pipe.AddShader(&fs);
14901
Chia-I Wu08accc62015-07-07 11:50:03 +080014902 /* set up CB 0, not written */
14903 pipe.AddColorAttachment();
14904 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014905
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014906 VkDescriptorSetObj descriptorSet(m_device);
14907 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014908 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014909
Tony Barbour5781e8f2015-08-04 16:23:11 -060014910 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014911
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014912 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014913}
14914
Karl Schultz6addd812016-02-02 17:17:23 -070014915TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014916 TEST_DESCRIPTION(
14917 "Test that a warning is produced for a fragment shader which provides a spurious "
14918 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014920 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014921
Tony Barbour1fa09702017-03-16 12:09:08 -060014922 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014923
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014924 char const *vsSource =
14925 "#version 450\n"
14926 "\n"
14927 "out gl_PerVertex {\n"
14928 " vec4 gl_Position;\n"
14929 "};\n"
14930 "void main(){\n"
14931 " gl_Position = vec4(1);\n"
14932 "}\n";
14933 char const *fsSource =
14934 "#version 450\n"
14935 "\n"
14936 "layout(location=0) out vec4 x;\n"
14937 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14938 "void main(){\n"
14939 " x = vec4(1);\n"
14940 " y = vec4(1);\n"
14941 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014942
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014943 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14944 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014945
14946 VkPipelineObj pipe(m_device);
14947 pipe.AddShader(&vs);
14948 pipe.AddShader(&fs);
14949
Chia-I Wu08accc62015-07-07 11:50:03 +080014950 /* set up CB 0, not written */
14951 pipe.AddColorAttachment();
14952 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014953 /* FS writes CB 1, but we don't configure it */
14954
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014955 VkDescriptorSetObj descriptorSet(m_device);
14956 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014957 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014958
Tony Barbour5781e8f2015-08-04 16:23:11 -060014959 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014960
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014961 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014962}
14963
Karl Schultz6addd812016-02-02 17:17:23 -070014964TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014965 TEST_DESCRIPTION(
14966 "Test that an error is produced for a mismatch between the fundamental "
14967 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014969
Tony Barbour1fa09702017-03-16 12:09:08 -060014970 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014971
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014972 char const *vsSource =
14973 "#version 450\n"
14974 "\n"
14975 "out gl_PerVertex {\n"
14976 " vec4 gl_Position;\n"
14977 "};\n"
14978 "void main(){\n"
14979 " gl_Position = vec4(1);\n"
14980 "}\n";
14981 char const *fsSource =
14982 "#version 450\n"
14983 "\n"
14984 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14985 "void main(){\n"
14986 " x = ivec4(1);\n"
14987 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014988
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014989 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14990 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014991
14992 VkPipelineObj pipe(m_device);
14993 pipe.AddShader(&vs);
14994 pipe.AddShader(&fs);
14995
Chia-I Wu08accc62015-07-07 11:50:03 +080014996 /* set up CB 0; type is UNORM by default */
14997 pipe.AddColorAttachment();
14998 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014999
Chris Forbesa36d69e2015-05-25 11:13:44 +120015000 VkDescriptorSetObj descriptorSet(m_device);
15001 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015002 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120015003
Tony Barbour5781e8f2015-08-04 16:23:11 -060015004 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120015005
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015006 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120015007}
Chris Forbes7b1b8932015-06-05 14:43:36 +120015008
Karl Schultz6addd812016-02-02 17:17:23 -070015009TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015010 TEST_DESCRIPTION(
15011 "Test that an error is produced for a shader consuming a uniform "
15012 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015014
Tony Barbour1fa09702017-03-16 12:09:08 -060015015 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015016
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015017 char const *vsSource =
15018 "#version 450\n"
15019 "\n"
15020 "out gl_PerVertex {\n"
15021 " vec4 gl_Position;\n"
15022 "};\n"
15023 "void main(){\n"
15024 " gl_Position = vec4(1);\n"
15025 "}\n";
15026 char const *fsSource =
15027 "#version 450\n"
15028 "\n"
15029 "layout(location=0) out vec4 x;\n"
15030 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15031 "void main(){\n"
15032 " x = vec4(bar.y);\n"
15033 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015034
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015035 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15036 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015037
Chris Forbes556c76c2015-08-14 12:04:59 +120015038 VkPipelineObj pipe(m_device);
15039 pipe.AddShader(&vs);
15040 pipe.AddShader(&fs);
15041
15042 /* set up CB 0; type is UNORM by default */
15043 pipe.AddColorAttachment();
15044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15045
15046 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015047 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015048
15049 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15050
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015051 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015052}
15053
Chris Forbes5c59e902016-02-26 16:56:09 +130015054TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015055 TEST_DESCRIPTION(
15056 "Test that an error is produced for a shader consuming push constants "
15057 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015059
Tony Barbour1fa09702017-03-16 12:09:08 -060015060 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015061
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015062 char const *vsSource =
15063 "#version 450\n"
15064 "\n"
15065 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15066 "out gl_PerVertex {\n"
15067 " vec4 gl_Position;\n"
15068 "};\n"
15069 "void main(){\n"
15070 " gl_Position = vec4(consts.x);\n"
15071 "}\n";
15072 char const *fsSource =
15073 "#version 450\n"
15074 "\n"
15075 "layout(location=0) out vec4 x;\n"
15076 "void main(){\n"
15077 " x = vec4(1);\n"
15078 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015079
15080 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15081 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15082
15083 VkPipelineObj pipe(m_device);
15084 pipe.AddShader(&vs);
15085 pipe.AddShader(&fs);
15086
15087 /* set up CB 0; type is UNORM by default */
15088 pipe.AddColorAttachment();
15089 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15090
15091 VkDescriptorSetObj descriptorSet(m_device);
15092 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15093
15094 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15095
15096 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015097 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015098}
15099
Chris Forbes3fb17902016-08-22 14:57:55 +120015100TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015101 TEST_DESCRIPTION(
15102 "Test that an error is produced for a shader consuming an input attachment "
15103 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15105 "consumes input attachment index 0 but not provided in subpass");
15106
Tony Barbour1fa09702017-03-16 12:09:08 -060015107 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015108
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015109 char const *vsSource =
15110 "#version 450\n"
15111 "\n"
15112 "out gl_PerVertex {\n"
15113 " vec4 gl_Position;\n"
15114 "};\n"
15115 "void main(){\n"
15116 " gl_Position = vec4(1);\n"
15117 "}\n";
15118 char const *fsSource =
15119 "#version 450\n"
15120 "\n"
15121 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15122 "layout(location=0) out vec4 color;\n"
15123 "void main() {\n"
15124 " color = subpassLoad(x);\n"
15125 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015126
15127 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15128 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15129
15130 VkPipelineObj pipe(m_device);
15131 pipe.AddShader(&vs);
15132 pipe.AddShader(&fs);
15133 pipe.AddColorAttachment();
15134 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15135
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015136 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15137 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015138 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015139 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015140 ASSERT_VK_SUCCESS(err);
15141
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015142 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015143 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015144 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015145 ASSERT_VK_SUCCESS(err);
15146
15147 // error here.
15148 pipe.CreateVKPipeline(pl, renderPass());
15149
15150 m_errorMonitor->VerifyFound();
15151
15152 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15153 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15154}
15155
Chris Forbes5a9a0472016-08-22 16:02:09 +120015156TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015157 TEST_DESCRIPTION(
15158 "Test that an error is produced for a shader consuming an input attachment "
15159 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15161 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15162
Tony Barbour1fa09702017-03-16 12:09:08 -060015163 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015164
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015165 char const *vsSource =
15166 "#version 450\n"
15167 "\n"
15168 "out gl_PerVertex {\n"
15169 " vec4 gl_Position;\n"
15170 "};\n"
15171 "void main(){\n"
15172 " gl_Position = vec4(1);\n"
15173 "}\n";
15174 char const *fsSource =
15175 "#version 450\n"
15176 "\n"
15177 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15178 "layout(location=0) out vec4 color;\n"
15179 "void main() {\n"
15180 " color = subpassLoad(x);\n"
15181 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015182
15183 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15184 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15185
15186 VkPipelineObj pipe(m_device);
15187 pipe.AddShader(&vs);
15188 pipe.AddShader(&fs);
15189 pipe.AddColorAttachment();
15190 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15191
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015192 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15193 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015194 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015195 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015196 ASSERT_VK_SUCCESS(err);
15197
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015198 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015199 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015200 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015201 ASSERT_VK_SUCCESS(err);
15202
15203 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015204 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15205 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15206 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15207 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15208 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 +120015209 };
15210 VkAttachmentReference color = {
15211 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15212 };
15213 VkAttachmentReference input = {
15214 1, VK_IMAGE_LAYOUT_GENERAL,
15215 };
15216
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015217 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015218
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015219 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015220 VkRenderPass rp;
15221 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15222 ASSERT_VK_SUCCESS(err);
15223
15224 // error here.
15225 pipe.CreateVKPipeline(pl, rp);
15226
15227 m_errorMonitor->VerifyFound();
15228
15229 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15230 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15231 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15232}
15233
Chris Forbes541f7b02016-08-22 15:30:27 +120015234TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015235 TEST_DESCRIPTION(
15236 "Test that an error is produced for a shader consuming an input attachment "
15237 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015239 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015240
Tony Barbour1fa09702017-03-16 12:09:08 -060015241 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015242
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015243 char const *vsSource =
15244 "#version 450\n"
15245 "\n"
15246 "out gl_PerVertex {\n"
15247 " vec4 gl_Position;\n"
15248 "};\n"
15249 "void main(){\n"
15250 " gl_Position = vec4(1);\n"
15251 "}\n";
15252 char const *fsSource =
15253 "#version 450\n"
15254 "\n"
15255 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15256 "layout(location=0) out vec4 color;\n"
15257 "void main() {\n"
15258 " color = subpassLoad(xs[0]);\n"
15259 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015260
15261 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15262 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15263
15264 VkPipelineObj pipe(m_device);
15265 pipe.AddShader(&vs);
15266 pipe.AddShader(&fs);
15267 pipe.AddColorAttachment();
15268 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15269
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015270 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15271 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015272 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015273 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015274 ASSERT_VK_SUCCESS(err);
15275
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015276 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015277 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015278 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015279 ASSERT_VK_SUCCESS(err);
15280
15281 // error here.
15282 pipe.CreateVKPipeline(pl, renderPass());
15283
15284 m_errorMonitor->VerifyFound();
15285
15286 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15287 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15288}
15289
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015290TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015291 TEST_DESCRIPTION(
15292 "Test that an error is produced for a compute pipeline consuming a "
15293 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015295
Tony Barbour1fa09702017-03-16 12:09:08 -060015296 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015297
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015298 char const *csSource =
15299 "#version 450\n"
15300 "\n"
15301 "layout(local_size_x=1) in;\n"
15302 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15303 "void main(){\n"
15304 " x = vec4(1);\n"
15305 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015306
15307 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15308
15309 VkDescriptorSetObj descriptorSet(m_device);
15310 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15311
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015312 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15313 nullptr,
15314 0,
15315 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15316 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15317 descriptorSet.GetPipelineLayout(),
15318 VK_NULL_HANDLE,
15319 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015320
15321 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015322 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015323
15324 m_errorMonitor->VerifyFound();
15325
15326 if (err == VK_SUCCESS) {
15327 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15328 }
15329}
15330
Chris Forbes22a9b092016-07-19 14:34:05 +120015331TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015332 TEST_DESCRIPTION(
15333 "Test that an error is produced for a pipeline consuming a "
15334 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15336 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015337
Tony Barbour1fa09702017-03-16 12:09:08 -060015338 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015339
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015340 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15341 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015342 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015343 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015344 ASSERT_VK_SUCCESS(err);
15345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015346 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015347 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015348 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015349 ASSERT_VK_SUCCESS(err);
15350
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015351 char const *csSource =
15352 "#version 450\n"
15353 "\n"
15354 "layout(local_size_x=1) in;\n"
15355 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15356 "void main() {\n"
15357 " x.x = 1.0f;\n"
15358 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015359 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15360
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015361 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15362 nullptr,
15363 0,
15364 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15365 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15366 pl,
15367 VK_NULL_HANDLE,
15368 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015369
15370 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015371 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015372
15373 m_errorMonitor->VerifyFound();
15374
15375 if (err == VK_SUCCESS) {
15376 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15377 }
15378
15379 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15380 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15381}
15382
Chris Forbes50020592016-07-27 13:52:41 +120015383TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015384 TEST_DESCRIPTION(
15385 "Test that an error is produced when an image view type "
15386 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015387
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015388 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 +120015389
Tony Barbour1fa09702017-03-16 12:09:08 -060015390 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015391 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15392
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015393 char const *vsSource =
15394 "#version 450\n"
15395 "\n"
15396 "out gl_PerVertex { vec4 gl_Position; };\n"
15397 "void main() { gl_Position = vec4(0); }\n";
15398 char const *fsSource =
15399 "#version 450\n"
15400 "\n"
15401 "layout(set=0, binding=0) uniform sampler3D s;\n"
15402 "layout(location=0) out vec4 color;\n"
15403 "void main() {\n"
15404 " color = texture(s, vec3(0));\n"
15405 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015406 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15407 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15408
15409 VkPipelineObj pipe(m_device);
15410 pipe.AddShader(&vs);
15411 pipe.AddShader(&fs);
15412 pipe.AddColorAttachment();
15413
15414 VkTextureObj texture(m_device, nullptr);
15415 VkSamplerObj sampler(m_device);
15416
15417 VkDescriptorSetObj descriptorSet(m_device);
15418 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15419 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15420
15421 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15422 ASSERT_VK_SUCCESS(err);
15423
Tony Barbour552f6c02016-12-21 14:34:07 -070015424 m_commandBuffer->BeginCommandBuffer();
15425 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015426
15427 m_commandBuffer->BindPipeline(pipe);
15428 m_commandBuffer->BindDescriptorSet(descriptorSet);
15429
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015430 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015431 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015432 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015433 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15434
15435 // error produced here.
15436 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15437
15438 m_errorMonitor->VerifyFound();
15439
Tony Barbour552f6c02016-12-21 14:34:07 -070015440 m_commandBuffer->EndRenderPass();
15441 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015442}
15443
Chris Forbes5533bfc2016-07-27 14:12:34 +120015444TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015445 TEST_DESCRIPTION(
15446 "Test that an error is produced when a multisampled images "
15447 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015448
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015450
Tony Barbour1fa09702017-03-16 12:09:08 -060015451 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15453
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015454 char const *vsSource =
15455 "#version 450\n"
15456 "\n"
15457 "out gl_PerVertex { vec4 gl_Position; };\n"
15458 "void main() { gl_Position = vec4(0); }\n";
15459 char const *fsSource =
15460 "#version 450\n"
15461 "\n"
15462 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15463 "layout(location=0) out vec4 color;\n"
15464 "void main() {\n"
15465 " color = texelFetch(s, ivec2(0), 0);\n"
15466 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015467 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15468 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15469
15470 VkPipelineObj pipe(m_device);
15471 pipe.AddShader(&vs);
15472 pipe.AddShader(&fs);
15473 pipe.AddColorAttachment();
15474
15475 VkTextureObj texture(m_device, nullptr);
15476 VkSamplerObj sampler(m_device);
15477
15478 VkDescriptorSetObj descriptorSet(m_device);
15479 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15480 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15481
15482 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15483 ASSERT_VK_SUCCESS(err);
15484
Tony Barbour552f6c02016-12-21 14:34:07 -070015485 m_commandBuffer->BeginCommandBuffer();
15486 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015487
15488 m_commandBuffer->BindPipeline(pipe);
15489 m_commandBuffer->BindDescriptorSet(descriptorSet);
15490
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015491 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015492 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015493 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015494 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15495
15496 // error produced here.
15497 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15498
15499 m_errorMonitor->VerifyFound();
15500
Tony Barbour552f6c02016-12-21 14:34:07 -070015501 m_commandBuffer->EndRenderPass();
15502 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015503}
15504
Mark Youngc48c4c12016-04-11 14:26:49 -060015505TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015506 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015507
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015508 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15509 {
15510 VkFormatProperties properties;
15511 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15512 if (properties.optimalTilingFeatures == 0) {
15513 printf(" Image format not supported; skipped.\n");
15514 return;
15515 }
15516 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015517
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015518 VkImageCreateInfo info = {};
15519 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15520 info.pNext = NULL;
15521 info.imageType = VK_IMAGE_TYPE_2D;
15522 info.format = format;
15523 info.extent.height = 32;
15524 info.extent.depth = 1;
15525 info.mipLevels = 1;
15526 info.arrayLayers = 1;
15527 info.samples = VK_SAMPLE_COUNT_1_BIT;
15528 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15529 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15530 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015531
15532 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015533 {
15534 VkImageFormatProperties properties;
15535 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15536 info.tiling, info.usage, info.flags, &properties);
15537 ASSERT_VK_SUCCESS(result);
15538 info.extent.width = properties.maxExtent.width + 1;
15539 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015540
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015541 VkImage image;
15542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15543 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015544 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015545}
15546
Mark Youngc48c4c12016-04-11 14:26:49 -060015547TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015548 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015549
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015550 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15551 {
15552 VkFormatProperties properties;
15553 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15554 if (properties.optimalTilingFeatures == 0) {
15555 printf(" Image format not supported; skipped.\n");
15556 return;
15557 }
15558 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015559
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015560 VkImageCreateInfo info = {};
15561 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15562 info.pNext = NULL;
15563 info.imageType = VK_IMAGE_TYPE_2D;
15564 info.format = format;
15565 info.extent.height = 32;
15566 info.extent.depth = 1;
15567 info.mipLevels = 1;
15568 info.arrayLayers = 1;
15569 info.samples = VK_SAMPLE_COUNT_1_BIT;
15570 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15571 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15572 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015573
15574 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015575 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015576
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015577 VkImage image;
15578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15579 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15580 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015581 m_errorMonitor->VerifyFound();
15582}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015583
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015584TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015585 TEST_DESCRIPTION(
15586 "Create a render pass with an attachment description "
15587 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015588
Tony Barbour1fa09702017-03-16 12:09:08 -060015589 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15591
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015593
15594 VkAttachmentReference color_attach = {};
15595 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15596 color_attach.attachment = 0;
15597 VkSubpassDescription subpass = {};
15598 subpass.colorAttachmentCount = 1;
15599 subpass.pColorAttachments = &color_attach;
15600
15601 VkRenderPassCreateInfo rpci = {};
15602 rpci.subpassCount = 1;
15603 rpci.pSubpasses = &subpass;
15604 rpci.attachmentCount = 1;
15605 VkAttachmentDescription attach_desc = {};
15606 attach_desc.format = VK_FORMAT_UNDEFINED;
15607 rpci.pAttachments = &attach_desc;
15608 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15609 VkRenderPass rp;
15610 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15611
15612 m_errorMonitor->VerifyFound();
15613
15614 if (result == VK_SUCCESS) {
15615 vkDestroyRenderPass(m_device->device(), rp, NULL);
15616 }
15617}
15618
Karl Schultz6addd812016-02-02 17:17:23 -070015619TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015620 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015621
Mike Stroyana3082432015-09-25 13:39:21 -060015622 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015623 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15624 const int32_t tex_width = 32;
15625 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015626
15627 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015628 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15629 image_create_info.pNext = NULL;
15630 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15631 image_create_info.format = tex_format;
15632 image_create_info.extent.width = tex_width;
15633 image_create_info.extent.height = tex_height;
15634 image_create_info.extent.depth = 1;
15635 image_create_info.mipLevels = 1;
15636 image_create_info.arrayLayers = 1;
15637 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15638 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15639 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15640 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015641
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015642 VkImage image;
15643 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015644 ASSERT_VK_SUCCESS(err);
15645
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015646 VkMemoryRequirements requirements;
15647 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15648
15649 VkMemoryAllocateInfo alloc_info{};
15650 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15651 alloc_info.pNext = NULL;
15652 alloc_info.memoryTypeIndex = 0;
15653 alloc_info.allocationSize = requirements.size;
15654 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15655 ASSERT_TRUE(pass);
15656
15657 VkDeviceMemory memory;
15658 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15659 ASSERT_VK_SUCCESS(err);
15660
15661 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15662
Tobin Ehliscde08892015-09-22 10:11:37 -060015663 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015664 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015665 image_view_create_info.image = image;
15666 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15667 image_view_create_info.format = tex_format;
15668 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015669 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015670 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015671 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015672
15673 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015674 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015675 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015676 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015677
15678 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015679 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015680}
Mike Stroyana3082432015-09-25 13:39:21 -060015681
Mark Youngd339ba32016-05-30 13:28:35 -060015682TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15683 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015685 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015686
Tony Barbour1fa09702017-03-16 12:09:08 -060015687 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015688
15689 // Create an image and try to create a view with no memory backing the image
15690 VkImage image;
15691
15692 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15693 const int32_t tex_width = 32;
15694 const int32_t tex_height = 32;
15695
15696 VkImageCreateInfo image_create_info = {};
15697 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15698 image_create_info.pNext = NULL;
15699 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15700 image_create_info.format = tex_format;
15701 image_create_info.extent.width = tex_width;
15702 image_create_info.extent.height = tex_height;
15703 image_create_info.extent.depth = 1;
15704 image_create_info.mipLevels = 1;
15705 image_create_info.arrayLayers = 1;
15706 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15707 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15708 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15709 image_create_info.flags = 0;
15710
15711 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15712 ASSERT_VK_SUCCESS(err);
15713
15714 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015715 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015716 image_view_create_info.image = image;
15717 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15718 image_view_create_info.format = tex_format;
15719 image_view_create_info.subresourceRange.layerCount = 1;
15720 image_view_create_info.subresourceRange.baseMipLevel = 0;
15721 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015722 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015723
15724 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015725 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015726
15727 m_errorMonitor->VerifyFound();
15728 vkDestroyImage(m_device->device(), image, NULL);
15729 // If last error is success, it still created the view, so delete it.
15730 if (err == VK_SUCCESS) {
15731 vkDestroyImageView(m_device->device(), view, NULL);
15732 }
Mark Youngd339ba32016-05-30 13:28:35 -060015733}
15734
Karl Schultz6addd812016-02-02 17:17:23 -070015735TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015736 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015738
Tony Barbour1fa09702017-03-16 12:09:08 -060015739 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015740
Karl Schultz6addd812016-02-02 17:17:23 -070015741 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015742 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015743 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015744 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015745
15746 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015747 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015748 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015749 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15750 image_view_create_info.format = tex_format;
15751 image_view_create_info.subresourceRange.baseMipLevel = 0;
15752 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015753 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015754 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015755 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015756
15757 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015758 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015759
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015760 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015761}
15762
Mike Weiblena1e13f42017-02-09 21:25:59 -070015763TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15764 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15765
Tony Barbour1fa09702017-03-16 12:09:08 -060015766 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015767 VkSubresourceLayout subres_layout = {};
15768
15769 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15770 {
15771 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15772 VkImageObj img(m_device);
15773 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15774 ASSERT_TRUE(img.initialized());
15775
15776 VkImageSubresource subres = {};
15777 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15778 subres.mipLevel = 0;
15779 subres.arrayLayer = 0;
15780
15781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15782 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15783 m_errorMonitor->VerifyFound();
15784 }
15785
15786 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15787 {
15788 VkImageObj img(m_device);
15789 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15790 ASSERT_TRUE(img.initialized());
15791
15792 VkImageSubresource subres = {};
15793 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15794 subres.mipLevel = 0;
15795 subres.arrayLayer = 0;
15796
15797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15799 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15800 m_errorMonitor->VerifyFound();
15801 }
15802
15803 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15804 {
15805 VkImageObj img(m_device);
15806 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15807 ASSERT_TRUE(img.initialized());
15808
15809 VkImageSubresource subres = {};
15810 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15811 subres.mipLevel = 1; // ERROR: triggers VU 00739
15812 subres.arrayLayer = 0;
15813
15814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15815 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15816 m_errorMonitor->VerifyFound();
15817 }
15818
15819 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15820 {
15821 VkImageObj img(m_device);
15822 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15823 ASSERT_TRUE(img.initialized());
15824
15825 VkImageSubresource subres = {};
15826 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15827 subres.mipLevel = 0;
15828 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15829
15830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15831 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15832 m_errorMonitor->VerifyFound();
15833 }
15834}
15835
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015836TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015837 VkResult err;
15838 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015839
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015841
Tony Barbour1fa09702017-03-16 12:09:08 -060015842 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015843
15844 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015845 VkImage srcImage;
15846 VkImage dstImage;
15847 VkDeviceMemory srcMem;
15848 VkDeviceMemory destMem;
15849 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015850
15851 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015852 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15853 image_create_info.pNext = NULL;
15854 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15855 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15856 image_create_info.extent.width = 32;
15857 image_create_info.extent.height = 32;
15858 image_create_info.extent.depth = 1;
15859 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015860 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015861 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15862 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15863 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15864 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015866 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015867 ASSERT_VK_SUCCESS(err);
15868
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015869 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015870 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015871 ASSERT_VK_SUCCESS(err);
15872
15873 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015874 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015875 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15876 memAlloc.pNext = NULL;
15877 memAlloc.allocationSize = 0;
15878 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015879
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015880 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015881 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015882 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015883 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015884 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015885 ASSERT_VK_SUCCESS(err);
15886
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015887 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015888 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015889 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015890 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015891 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015892 ASSERT_VK_SUCCESS(err);
15893
15894 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15895 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015896 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015897 ASSERT_VK_SUCCESS(err);
15898
Tony Barbour552f6c02016-12-21 14:34:07 -070015899 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015900 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015901 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015902 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015903 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015904 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015905 copyRegion.srcOffset.x = 0;
15906 copyRegion.srcOffset.y = 0;
15907 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015908 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015909 copyRegion.dstSubresource.mipLevel = 0;
15910 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015911 // Introduce failure by forcing the dst layerCount to differ from src
15912 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015913 copyRegion.dstOffset.x = 0;
15914 copyRegion.dstOffset.y = 0;
15915 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015916 copyRegion.extent.width = 1;
15917 copyRegion.extent.height = 1;
15918 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015919 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015920 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015921
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015922 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015923
Chia-I Wuf7458c52015-10-26 21:10:41 +080015924 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015925 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015926 vkFreeMemory(m_device->device(), srcMem, NULL);
15927 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015928}
15929
Tony Barbourd6673642016-05-05 14:46:39 -060015930TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015931 TEST_DESCRIPTION("Creating images with unsuported formats ");
15932
Tony Barbour1fa09702017-03-16 12:09:08 -060015933 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015934 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015935
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015936 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015937 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015938 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015939 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15940 image_create_info.format = VK_FORMAT_UNDEFINED;
15941 image_create_info.extent.width = 32;
15942 image_create_info.extent.height = 32;
15943 image_create_info.extent.depth = 1;
15944 image_create_info.mipLevels = 1;
15945 image_create_info.arrayLayers = 1;
15946 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15947 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15948 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015949
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15951 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015952
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015953 VkImage image;
15954 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015955 m_errorMonitor->VerifyFound();
15956
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015957 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015958 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015959 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15960 VkFormat format = static_cast<VkFormat>(f);
15961 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015962 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015963 unsupported = format;
15964 break;
15965 }
15966 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015967
Tony Barbourd6673642016-05-05 14:46:39 -060015968 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015969 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015971
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015972 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015973 m_errorMonitor->VerifyFound();
15974 }
15975}
15976
15977TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015978 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15979
Tony Barbour1fa09702017-03-16 12:09:08 -060015980 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070015981 auto depth_format = find_depth_stencil_format(m_device);
15982 if (!depth_format) {
15983 return;
15984 }
Tony Barbourd6673642016-05-05 14:46:39 -060015985
15986 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015987 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 -060015988 VK_IMAGE_TILING_OPTIMAL, 0);
15989 ASSERT_TRUE(image.initialized());
15990
15991 VkImageView imgView;
15992 VkImageViewCreateInfo imgViewInfo = {};
15993 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15994 imgViewInfo.image = image.handle();
15995 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15996 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15997 imgViewInfo.subresourceRange.layerCount = 1;
15998 imgViewInfo.subresourceRange.baseMipLevel = 0;
15999 imgViewInfo.subresourceRange.levelCount = 1;
16000 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16001
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016002 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016003 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016005 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16006 m_errorMonitor->VerifyFound();
16007 imgViewInfo.subresourceRange.baseMipLevel = 0;
16008
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016009 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060016010 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016012 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16013 m_errorMonitor->VerifyFound();
16014 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16015
Tony Barbourd6673642016-05-05 14:46:39 -060016016 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16017 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016019 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16020 m_errorMonitor->VerifyFound();
16021 imgViewInfo.subresourceRange.levelCount = 1;
16022
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016023 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16024 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016025 m_errorMonitor->SetDesiredFailureMsg(
16026 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16027 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016028 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16029 m_errorMonitor->VerifyFound();
16030 imgViewInfo.subresourceRange.layerCount = 1;
16031
Tony Barbourd6673642016-05-05 14:46:39 -060016032 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016033 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016034 m_errorMonitor->SetDesiredFailureMsg(
16035 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16036 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016037 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16038 m_errorMonitor->VerifyFound();
16039 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16040
Tony Barbourd6673642016-05-05 14:46:39 -060016041 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16042 // VIEW_CREATE_ERROR
16043 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016044 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016045 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16046 m_errorMonitor->VerifyFound();
16047 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16048
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016049 // TODO: Update framework to easily passing mutable flag into ImageObj init
16050 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016051 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16052 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16053 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016054 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16055 // VIEW_CREATE_ERROR
16056 VkImageCreateInfo mutImgInfo = image.create_info();
16057 VkImage mutImage;
16058 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016059 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016060 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16061 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016062 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016063 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016064
16065 VkMemoryRequirements requirements;
16066 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16067
16068 VkMemoryAllocateInfo alloc_info{};
16069 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16070 alloc_info.pNext = NULL;
16071 alloc_info.memoryTypeIndex = 0;
16072 alloc_info.allocationSize = requirements.size;
16073 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16074 ASSERT_TRUE(pass);
16075
16076 VkDeviceMemory memory;
16077 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16078 ASSERT_VK_SUCCESS(ret);
16079
16080 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16081 ASSERT_VK_SUCCESS(ret);
16082
Tony Barbourd6673642016-05-05 14:46:39 -060016083 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016085 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16086 m_errorMonitor->VerifyFound();
16087 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016088
16089 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016090 vkDestroyImage(m_device->handle(), mutImage, NULL);
16091}
16092
Dave Houlton75967fc2017-03-06 17:21:16 -070016093TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16094 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16095
Tony Barbour1fa09702017-03-16 12:09:08 -060016096 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016097
Jamie Madill35127872017-03-15 16:17:46 -040016098 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016099 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16100 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16101 if (device_features.textureCompressionBC) {
16102 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16103 } else if (device_features.textureCompressionETC2) {
16104 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16105 } else if (device_features.textureCompressionASTC_LDR) {
16106 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16107 } else {
16108 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16109 return;
16110 }
16111
16112 VkImageCreateInfo ci;
16113 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16114 ci.pNext = NULL;
16115 ci.flags = 0;
16116 ci.imageType = VK_IMAGE_TYPE_2D;
16117 ci.format = compressed_format;
16118 ci.extent = {32, 32, 1};
16119 ci.mipLevels = 6;
16120 ci.arrayLayers = 1;
16121 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16122 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16123 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16124 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16125 ci.queueFamilyIndexCount = 0;
16126 ci.pQueueFamilyIndices = NULL;
16127 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16128
16129 VkImageObj image(m_device);
16130 image.init(&ci);
16131 ASSERT_TRUE(image.initialized());
16132
16133 VkImageObj odd_image(m_device);
16134 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16135 odd_image.init(&ci);
16136 ASSERT_TRUE(odd_image.initialized());
16137
16138 // Allocate buffers
16139 VkMemoryPropertyFlags reqs = 0;
16140 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16141 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16142 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16143 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16144 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16145
16146 VkBufferImageCopy region = {};
16147 region.bufferRowLength = 0;
16148 region.bufferImageHeight = 0;
16149 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16150 region.imageSubresource.layerCount = 1;
16151 region.imageOffset = {0, 0, 0};
16152 region.bufferOffset = 0;
16153
16154 // start recording
16155 m_commandBuffer->BeginCommandBuffer();
16156
16157 // Mip level copies that work - 5 levels
16158 m_errorMonitor->ExpectSuccess();
16159
16160 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16161 region.imageExtent = {32, 32, 1};
16162 region.imageSubresource.mipLevel = 0;
16163 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16164 &region);
16165 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16166 &region);
16167
16168 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16169 region.imageExtent = {8, 8, 1};
16170 region.imageSubresource.mipLevel = 2;
16171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16172 &region);
16173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16174 &region);
16175
16176 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16177 region.imageExtent = {4, 4, 1};
16178 region.imageSubresource.mipLevel = 3;
16179 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16180 &region);
16181 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16182 &region);
16183
16184 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16185 region.imageExtent = {2, 2, 1};
16186 region.imageSubresource.mipLevel = 4;
16187 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16188 &region);
16189 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16190 &region);
16191
16192 region.imageExtent = {1, 1, 1};
16193 region.imageSubresource.mipLevel = 5;
16194 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16195 &region);
16196 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16197 &region);
16198 m_errorMonitor->VerifyNotFound();
16199
16200 // Buffer must accomodate a full compressed block, regardless of texel count
16201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16202 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16203 &region);
16204 m_errorMonitor->VerifyFound();
16205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16206 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16207 &region);
16208 m_errorMonitor->VerifyFound();
16209
16210 // Copy width < compressed block size, but not the full mip width
16211 region.imageExtent = {1, 2, 1};
16212 region.imageSubresource.mipLevel = 4;
16213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16214 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16215 &region);
16216 m_errorMonitor->VerifyFound();
16217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16218 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16219 &region);
16220 m_errorMonitor->VerifyFound();
16221
16222 // Copy height < compressed block size but not the full mip height
16223 region.imageExtent = {2, 1, 1};
16224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16225 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16226 &region);
16227 m_errorMonitor->VerifyFound();
16228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16229 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16230 &region);
16231 m_errorMonitor->VerifyFound();
16232
16233 // Offsets must be multiple of compressed block size
16234 region.imageOffset = {1, 1, 0};
16235 region.imageExtent = {1, 1, 1};
16236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16237 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16238 &region);
16239 m_errorMonitor->VerifyFound();
16240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16241 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16242 &region);
16243 m_errorMonitor->VerifyFound();
16244
16245 // Offset + extent width = mip width - should succeed
16246 region.imageOffset = {4, 4, 0};
16247 region.imageExtent = {3, 4, 1};
16248 region.imageSubresource.mipLevel = 2;
16249 m_errorMonitor->ExpectSuccess();
16250 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16251 &region);
16252 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16253 &region);
16254 m_errorMonitor->VerifyNotFound();
16255
16256 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16257 region.imageExtent = {4, 4, 1};
16258 m_errorMonitor->ExpectSuccess();
16259 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16260 &region);
16261 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16262 &region);
16263 m_errorMonitor->VerifyNotFound();
16264
16265 // Offset + extent width < mip width and not a multiple of block width - should fail
16266 region.imageExtent = {3, 3, 1};
16267 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16268 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16269 &region);
16270 m_errorMonitor->VerifyFound();
16271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16272 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16273 &region);
16274 m_errorMonitor->VerifyFound();
16275}
16276
Dave Houlton59a20702017-02-02 17:26:23 -070016277TEST_F(VkLayerTest, ImageBufferCopyTests) {
16278 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16279
Tony Barbour1fa09702017-03-16 12:09:08 -060016280 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016281 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16282 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16283 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16284 return;
16285 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016286
16287 // Bail if any dimension of transfer granularity is 0.
16288 auto index = m_device->graphics_queue_node_index_;
16289 auto queue_family_properties = m_device->phy().queue_properties();
16290 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16291 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16292 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16293 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16294 return;
16295 }
16296
Dave Houlton59a20702017-02-02 17:26:23 -070016297 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16298 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16299 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016300 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16301 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16302 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16303 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16304
Dave Houlton59a20702017-02-02 17:26:23 -070016305 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16306 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16307 VK_IMAGE_TILING_OPTIMAL, 0);
16308 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16309 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16310 VK_IMAGE_TILING_OPTIMAL, 0);
16311 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16312 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016313 ASSERT_TRUE(image_64k.initialized());
16314 ASSERT_TRUE(image_16k.initialized());
16315 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016316
Dave Houltonf3229d52017-02-21 15:59:08 -070016317 // Verify all needed Depth/Stencil formats are supported
16318 bool missing_ds_support = false;
16319 VkFormatProperties props = {0, 0, 0};
16320 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16321 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16322 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16323 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16324 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16325 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16326 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16327 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16328
16329 if (!missing_ds_support) {
16330 ds_image_4D_1S.init(
16331 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16332 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16333 VK_IMAGE_TILING_OPTIMAL, 0);
16334 ASSERT_TRUE(ds_image_4D_1S.initialized());
16335
16336 ds_image_3D_1S.init(
16337 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16338 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16339 VK_IMAGE_TILING_OPTIMAL, 0);
16340 ASSERT_TRUE(ds_image_3D_1S.initialized());
16341
16342 ds_image_2D.init(
16343 256, 256, VK_FORMAT_D16_UNORM,
16344 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16345 VK_IMAGE_TILING_OPTIMAL, 0);
16346 ASSERT_TRUE(ds_image_2D.initialized());
16347
16348 ds_image_1S.init(
16349 256, 256, VK_FORMAT_S8_UINT,
16350 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16351 VK_IMAGE_TILING_OPTIMAL, 0);
16352 ASSERT_TRUE(ds_image_1S.initialized());
16353 }
16354
16355 // Allocate buffers
16356 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016357 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016358 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16359 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16360 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16361 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016362
16363 VkBufferImageCopy region = {};
16364 region.bufferRowLength = 0;
16365 region.bufferImageHeight = 0;
16366 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16367 region.imageSubresource.layerCount = 1;
16368 region.imageOffset = {0, 0, 0};
16369 region.imageExtent = {64, 64, 1};
16370 region.bufferOffset = 0;
16371
16372 // attempt copies before putting command buffer in recording state
16373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16374 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16375 &region);
16376 m_errorMonitor->VerifyFound();
16377
16378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16379 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16380 &region);
16381 m_errorMonitor->VerifyFound();
16382
16383 // start recording
16384 m_commandBuffer->BeginCommandBuffer();
16385
16386 // successful copies
16387 m_errorMonitor->ExpectSuccess();
16388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16389 &region);
16390 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16391 &region);
16392 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16393 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16394 &region);
16395 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16396 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16397 &region);
16398 region.imageOffset.x = 0;
16399 region.imageExtent.height = 64;
16400 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16401 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16402 &region);
16403 m_errorMonitor->VerifyNotFound();
16404
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016405 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016406 region.imageExtent = {65, 64, 1};
16407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16408 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16409 &region);
16410 m_errorMonitor->VerifyFound();
16411
16412 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16413 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16414 &region);
16415 m_errorMonitor->VerifyFound();
16416
16417 // image/buffer too small (offset) on copy to image
16418 region.imageExtent = {64, 64, 1};
16419 region.imageOffset = {0, 4, 0};
16420 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16421 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16422 &region);
16423 m_errorMonitor->VerifyFound();
16424
16425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16426 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16427 &region);
16428 m_errorMonitor->VerifyFound();
16429
16430 // image/buffer too small on copy to buffer
16431 region.imageExtent = {64, 64, 1};
16432 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016433 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16435 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16436 &region);
16437 m_errorMonitor->VerifyFound();
16438
16439 region.imageExtent = {64, 65, 1};
16440 region.bufferOffset = 0;
16441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16442 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16443 &region);
16444 m_errorMonitor->VerifyFound();
16445
16446 // buffer size ok but rowlength causes loose packing
16447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16448 region.imageExtent = {64, 64, 1};
16449 region.bufferRowLength = 68;
16450 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16451 &region);
16452 m_errorMonitor->VerifyFound();
16453
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016454 // An extent with zero area should produce a warning, but no error
16455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16456 region.imageExtent.width = 0;
16457 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16458 &region);
16459 m_errorMonitor->VerifyFound();
16460
Dave Houlton59a20702017-02-02 17:26:23 -070016461 // aspect bits
16462 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16463 region.imageExtent = {64, 64, 1};
16464 region.bufferRowLength = 0;
16465 region.bufferImageHeight = 0;
16466 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16467 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16468 buffer_16k.handle(), 1, &region);
16469 m_errorMonitor->VerifyFound();
16470
16471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16472 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16473 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16474 &region);
16475 m_errorMonitor->VerifyFound();
16476
16477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16478 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16479 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16480 buffer_16k.handle(), 1, &region);
16481 m_errorMonitor->VerifyFound();
16482
Dave Houltonf3229d52017-02-21 15:59:08 -070016483 // Test Depth/Stencil copies
16484 if (missing_ds_support) {
16485 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16486 } else {
16487 VkBufferImageCopy ds_region = {};
16488 ds_region.bufferOffset = 0;
16489 ds_region.bufferRowLength = 0;
16490 ds_region.bufferImageHeight = 0;
16491 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16492 ds_region.imageSubresource.mipLevel = 0;
16493 ds_region.imageSubresource.baseArrayLayer = 0;
16494 ds_region.imageSubresource.layerCount = 1;
16495 ds_region.imageOffset = {0, 0, 0};
16496 ds_region.imageExtent = {256, 256, 1};
16497
16498 // Depth copies that should succeed
16499 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16500 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16501 buffer_256k.handle(), 1, &ds_region);
16502 m_errorMonitor->VerifyNotFound();
16503
16504 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16505 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16506 buffer_256k.handle(), 1, &ds_region);
16507 m_errorMonitor->VerifyNotFound();
16508
16509 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16510 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16511 buffer_128k.handle(), 1, &ds_region);
16512 m_errorMonitor->VerifyNotFound();
16513
16514 // Depth copies that should fail
16515 ds_region.bufferOffset = 4;
16516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16517 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16518 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16519 buffer_256k.handle(), 1, &ds_region);
16520 m_errorMonitor->VerifyFound();
16521
16522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16523 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16524 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16525 buffer_256k.handle(), 1, &ds_region);
16526 m_errorMonitor->VerifyFound();
16527
16528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16529 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16530 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16531 buffer_128k.handle(), 1, &ds_region);
16532 m_errorMonitor->VerifyFound();
16533
16534 // Stencil copies that should succeed
16535 ds_region.bufferOffset = 0;
16536 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16537 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16538 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16539 buffer_64k.handle(), 1, &ds_region);
16540 m_errorMonitor->VerifyNotFound();
16541
16542 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16543 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16544 buffer_64k.handle(), 1, &ds_region);
16545 m_errorMonitor->VerifyNotFound();
16546
16547 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16548 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16549 buffer_64k.handle(), 1, &ds_region);
16550 m_errorMonitor->VerifyNotFound();
16551
16552 // Stencil copies that should fail
16553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16554 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16555 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16556 buffer_16k.handle(), 1, &ds_region);
16557 m_errorMonitor->VerifyFound();
16558
16559 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16560 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16561 ds_region.bufferRowLength = 260;
16562 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16563 buffer_64k.handle(), 1, &ds_region);
16564 m_errorMonitor->VerifyFound();
16565
16566 ds_region.bufferRowLength = 0;
16567 ds_region.bufferOffset = 4;
16568 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16569 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16570 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16571 buffer_64k.handle(), 1, &ds_region);
16572 m_errorMonitor->VerifyFound();
16573 }
16574
Dave Houlton584d51e2017-02-16 12:52:54 -070016575 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016576 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016577 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016578 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16579 device_features.textureCompressionASTC_LDR)) {
16580 printf(" No compressed formats supported - block compression tests skipped.\n");
16581 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016582 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16583 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016584 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016585 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 -070016586 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16587 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016588 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016589 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 -070016590 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016591 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16592 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016593 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016594 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16595 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016596 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16597 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016598 }
16599 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016600
Dave Houlton584d51e2017-02-16 12:52:54 -070016601 // Just fits
16602 m_errorMonitor->ExpectSuccess();
16603 region.imageExtent = {128, 128, 1};
16604 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16605 buffer_16k.handle(), 1, &region);
16606 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016607
Dave Houlton584d51e2017-02-16 12:52:54 -070016608 // with offset, too big for buffer
16609 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16610 region.bufferOffset = 16;
16611 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16612 buffer_16k.handle(), 1, &region);
16613 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016614 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016615
Dave Houlton67e9b532017-03-02 17:00:10 -070016616 // extents that are not a multiple of compressed block size
16617 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16618 region.imageExtent.width = 66;
16619 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16620 buffer_16k.handle(), 1, &region);
16621 m_errorMonitor->VerifyFound();
16622 region.imageExtent.width = 128;
16623
16624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016625 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016626 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16627 buffer_16k.handle(), 1, &region);
16628 m_errorMonitor->VerifyFound();
16629 region.imageExtent.height = 128;
16630
16631 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16632
16633 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16634 m_errorMonitor->ExpectSuccess();
16635 region.imageExtent.width = 66;
16636 region.imageOffset.x = 64;
16637 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16638 buffer_16k.handle(), 1, &region);
16639 region.imageExtent.width = 16;
16640 region.imageOffset.x = 0;
16641 region.imageExtent.height = 2;
16642 region.imageOffset.y = 128;
16643 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016644 buffer_16k.handle(), 1, &region);
16645 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016646 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016647
Dave Houlton584d51e2017-02-16 12:52:54 -070016648 // buffer offset must be a multiple of texel block size (16)
16649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16651 region.imageExtent = {64, 64, 1};
16652 region.bufferOffset = 24;
16653 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16654 buffer_16k.handle(), 1, &region);
16655 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016656
Dave Houlton584d51e2017-02-16 12:52:54 -070016657 // rowlength not a multiple of block width (4)
16658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16659 region.bufferOffset = 0;
16660 region.bufferRowLength = 130;
16661 region.bufferImageHeight = 0;
16662 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16663 buffer_64k.handle(), 1, &region);
16664 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016665
Dave Houlton584d51e2017-02-16 12:52:54 -070016666 // imageheight not a multiple of block height (4)
16667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16668 region.bufferRowLength = 0;
16669 region.bufferImageHeight = 130;
16670 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16671 buffer_64k.handle(), 1, &region);
16672 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016673 }
Dave Houlton59a20702017-02-02 17:26:23 -070016674}
16675
Tony Barbourd6673642016-05-05 14:46:39 -060016676TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016677 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016678
Tony Barbour1fa09702017-03-16 12:09:08 -060016679 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016680
Rene Lindsay135204f2016-12-22 17:11:09 -070016681 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016682 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016683 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 -070016684 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016685 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016686 vk_testing::Buffer buffer;
16687 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016688 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016689 VkBufferImageCopy region = {};
16690 region.bufferRowLength = 128;
16691 region.bufferImageHeight = 128;
16692 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16693 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016694 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016695 region.imageExtent.height = 4;
16696 region.imageExtent.width = 4;
16697 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016698
16699 VkImageObj image2(m_device);
16700 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 -070016701 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016702 ASSERT_TRUE(image2.initialized());
16703 vk_testing::Buffer buffer2;
16704 VkMemoryPropertyFlags reqs2 = 0;
16705 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16706 VkBufferImageCopy region2 = {};
16707 region2.bufferRowLength = 128;
16708 region2.bufferImageHeight = 128;
16709 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16710 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16711 region2.imageSubresource.layerCount = 1;
16712 region2.imageExtent.height = 4;
16713 region2.imageExtent.width = 4;
16714 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016715 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016716
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016717 // Image must have offset.z of 0 and extent.depth of 1
16718 // Introduce failure by setting imageExtent.depth to 0
16719 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016721 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016722 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016723 m_errorMonitor->VerifyFound();
16724
16725 region.imageExtent.depth = 1;
16726
16727 // Image must have offset.z of 0 and extent.depth of 1
16728 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016729 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016730 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016733 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016734 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016735 m_errorMonitor->VerifyFound();
16736
16737 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016738 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16739 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016740 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016741 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016742 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16743 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016744 m_errorMonitor->VerifyFound();
16745
16746 // BufferOffset must be a multiple of 4
16747 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016748 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016750 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16751 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016752 m_errorMonitor->VerifyFound();
16753
16754 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16755 region.bufferOffset = 0;
16756 region.imageExtent.height = 128;
16757 region.imageExtent.width = 128;
16758 // Introduce failure by setting bufferRowLength > 0 but less than width
16759 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016760 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016761 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16762 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016763 m_errorMonitor->VerifyFound();
16764
16765 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16766 region.bufferRowLength = 128;
16767 // Introduce failure by setting bufferRowHeight > 0 but less than height
16768 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016770 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16771 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016772 m_errorMonitor->VerifyFound();
16773
16774 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016775 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016776 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16777 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016778 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016779 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16780 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016781 VkImageBlit blitRegion = {};
16782 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16783 blitRegion.srcSubresource.baseArrayLayer = 0;
16784 blitRegion.srcSubresource.layerCount = 1;
16785 blitRegion.srcSubresource.mipLevel = 0;
16786 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16787 blitRegion.dstSubresource.baseArrayLayer = 0;
16788 blitRegion.dstSubresource.layerCount = 1;
16789 blitRegion.dstSubresource.mipLevel = 0;
16790
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016791 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16793 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16795 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016796 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16797 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016798 m_errorMonitor->VerifyFound();
16799
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016801 VkImageMemoryBarrier img_barrier;
16802 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16803 img_barrier.pNext = NULL;
16804 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16805 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16806 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16807 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16808 img_barrier.image = image.handle();
16809 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16810 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16811 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16812 img_barrier.subresourceRange.baseArrayLayer = 0;
16813 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016814 img_barrier.subresourceRange.layerCount = 0;
16815 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016816 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16817 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016818 m_errorMonitor->VerifyFound();
16819 img_barrier.subresourceRange.layerCount = 1;
16820}
16821
16822TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016823 TEST_DESCRIPTION("Exceed the limits of image format ");
16824
Tony Barbour1fa09702017-03-16 12:09:08 -060016825 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016826
16827 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16828 {
16829 VkFormatProperties properties;
16830 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16831 if (properties.linearTilingFeatures == 0) {
16832 printf(" Image format not supported; skipped.\n");
16833 return;
16834 }
16835 }
16836
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016838 VkImageCreateInfo image_create_info = {};
16839 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16840 image_create_info.pNext = NULL;
16841 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016842 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016843 image_create_info.extent.width = 32;
16844 image_create_info.extent.height = 32;
16845 image_create_info.extent.depth = 1;
16846 image_create_info.mipLevels = 1;
16847 image_create_info.arrayLayers = 1;
16848 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16849 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16850 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16851 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16852 image_create_info.flags = 0;
16853
16854 VkImage nullImg;
16855 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016856 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16857 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016858 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016859 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16860 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16861 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016862 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016863
Tony Barbour0907e362017-03-09 15:05:30 -070016864 uint32_t maxDim =
16865 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16866 // If max mip levels exceeds image extents, skip the max mip levels test
16867 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16869 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16870 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16871 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16872 m_errorMonitor->VerifyFound();
16873 image_create_info.mipLevels = 1;
16874 }
Tony Barbourd6673642016-05-05 14:46:39 -060016875
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016877 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16878 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16879 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16880 m_errorMonitor->VerifyFound();
16881 image_create_info.arrayLayers = 1;
16882
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016884 int samples = imgFmtProps.sampleCounts >> 1;
16885 image_create_info.samples = (VkSampleCountFlagBits)samples;
16886 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16887 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16888 m_errorMonitor->VerifyFound();
16889 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16890
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16892 "pCreateInfo->initialLayout, must be "
16893 "VK_IMAGE_LAYOUT_UNDEFINED or "
16894 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016895 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16896 // Expect INVALID_LAYOUT
16897 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16898 m_errorMonitor->VerifyFound();
16899 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16900}
16901
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016902TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016903 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016905
Tony Barbour1fa09702017-03-16 12:09:08 -060016906 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016907
16908 VkImageObj src_image(m_device);
16909 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16910 VkImageObj dst_image(m_device);
16911 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16912
Tony Barbour552f6c02016-12-21 14:34:07 -070016913 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016914 VkImageCopy copy_region;
16915 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16916 copy_region.srcSubresource.mipLevel = 0;
16917 copy_region.srcSubresource.baseArrayLayer = 0;
16918 copy_region.srcSubresource.layerCount = 0;
16919 copy_region.srcOffset.x = 0;
16920 copy_region.srcOffset.y = 0;
16921 copy_region.srcOffset.z = 0;
16922 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16923 copy_region.dstSubresource.mipLevel = 0;
16924 copy_region.dstSubresource.baseArrayLayer = 0;
16925 copy_region.dstSubresource.layerCount = 0;
16926 copy_region.dstOffset.x = 0;
16927 copy_region.dstOffset.y = 0;
16928 copy_region.dstOffset.z = 0;
16929 copy_region.extent.width = 64;
16930 copy_region.extent.height = 64;
16931 copy_region.extent.depth = 1;
16932 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16933 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016934 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016935
16936 m_errorMonitor->VerifyFound();
16937}
16938
16939TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016940 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016942
Tony Barbour1fa09702017-03-16 12:09:08 -060016943 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016944
16945 VkImageObj src_image(m_device);
16946 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16947 VkImageObj dst_image(m_device);
16948 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16949
Tony Barbour552f6c02016-12-21 14:34:07 -070016950 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016951 VkImageCopy copy_region;
16952 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16953 copy_region.srcSubresource.mipLevel = 0;
16954 copy_region.srcSubresource.baseArrayLayer = 0;
16955 copy_region.srcSubresource.layerCount = 0;
16956 copy_region.srcOffset.x = 0;
16957 copy_region.srcOffset.y = 0;
16958 copy_region.srcOffset.z = 0;
16959 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16960 copy_region.dstSubresource.mipLevel = 0;
16961 copy_region.dstSubresource.baseArrayLayer = 0;
16962 copy_region.dstSubresource.layerCount = 0;
16963 copy_region.dstOffset.x = 0;
16964 copy_region.dstOffset.y = 0;
16965 copy_region.dstOffset.z = 0;
16966 copy_region.extent.width = 64;
16967 copy_region.extent.height = 64;
16968 copy_region.extent.depth = 1;
16969 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16970 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016971 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016972
16973 m_errorMonitor->VerifyFound();
16974}
16975
Karl Schultz6addd812016-02-02 17:17:23 -070016976TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016977 VkResult err;
16978 bool pass;
16979
16980 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016982
Tony Barbour1fa09702017-03-16 12:09:08 -060016983 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016984
16985 // Create two images of different types and try to copy between them
16986 VkImage srcImage;
16987 VkImage dstImage;
16988 VkDeviceMemory srcMem;
16989 VkDeviceMemory destMem;
16990 VkMemoryRequirements memReqs;
16991
16992 VkImageCreateInfo image_create_info = {};
16993 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16994 image_create_info.pNext = NULL;
16995 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16996 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16997 image_create_info.extent.width = 32;
16998 image_create_info.extent.height = 32;
16999 image_create_info.extent.depth = 1;
17000 image_create_info.mipLevels = 1;
17001 image_create_info.arrayLayers = 1;
17002 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17003 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17004 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17005 image_create_info.flags = 0;
17006
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017007 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017008 ASSERT_VK_SUCCESS(err);
17009
17010 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17011 // Introduce failure by creating second image with a different-sized format.
17012 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
17013
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017014 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017015 ASSERT_VK_SUCCESS(err);
17016
17017 // Allocate memory
17018 VkMemoryAllocateInfo memAlloc = {};
17019 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17020 memAlloc.pNext = NULL;
17021 memAlloc.allocationSize = 0;
17022 memAlloc.memoryTypeIndex = 0;
17023
17024 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17025 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017026 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017027 ASSERT_TRUE(pass);
17028 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17029 ASSERT_VK_SUCCESS(err);
17030
17031 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17032 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017033 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017034 ASSERT_TRUE(pass);
17035 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17036 ASSERT_VK_SUCCESS(err);
17037
17038 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17039 ASSERT_VK_SUCCESS(err);
17040 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17041 ASSERT_VK_SUCCESS(err);
17042
Tony Barbour552f6c02016-12-21 14:34:07 -070017043 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017044 VkImageCopy copyRegion;
17045 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17046 copyRegion.srcSubresource.mipLevel = 0;
17047 copyRegion.srcSubresource.baseArrayLayer = 0;
17048 copyRegion.srcSubresource.layerCount = 0;
17049 copyRegion.srcOffset.x = 0;
17050 copyRegion.srcOffset.y = 0;
17051 copyRegion.srcOffset.z = 0;
17052 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17053 copyRegion.dstSubresource.mipLevel = 0;
17054 copyRegion.dstSubresource.baseArrayLayer = 0;
17055 copyRegion.dstSubresource.layerCount = 0;
17056 copyRegion.dstOffset.x = 0;
17057 copyRegion.dstOffset.y = 0;
17058 copyRegion.dstOffset.z = 0;
17059 copyRegion.extent.width = 1;
17060 copyRegion.extent.height = 1;
17061 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017062 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017063 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017064
17065 m_errorMonitor->VerifyFound();
17066
17067 vkDestroyImage(m_device->device(), srcImage, NULL);
17068 vkDestroyImage(m_device->device(), dstImage, NULL);
17069 vkFreeMemory(m_device->device(), srcMem, NULL);
17070 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017071}
17072
Karl Schultz6addd812016-02-02 17:17:23 -070017073TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17074 VkResult err;
17075 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017076
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017077 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17079 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017080
Tony Barbour1fa09702017-03-16 12:09:08 -060017081 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017082 auto depth_format = find_depth_stencil_format(m_device);
17083 if (!depth_format) {
17084 return;
17085 }
Mike Stroyana3082432015-09-25 13:39:21 -060017086
17087 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017088 VkImage srcImage;
17089 VkImage dstImage;
17090 VkDeviceMemory srcMem;
17091 VkDeviceMemory destMem;
17092 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017093
17094 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017095 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17096 image_create_info.pNext = NULL;
17097 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017098 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017099 image_create_info.extent.width = 32;
17100 image_create_info.extent.height = 32;
17101 image_create_info.extent.depth = 1;
17102 image_create_info.mipLevels = 1;
17103 image_create_info.arrayLayers = 1;
17104 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17105 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17106 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17107 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017108
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017109 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017110 ASSERT_VK_SUCCESS(err);
17111
Karl Schultzbdb75952016-04-19 11:36:49 -060017112 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17113
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017114 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017115 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017116 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017117 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017119 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017120 ASSERT_VK_SUCCESS(err);
17121
17122 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017123 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017124 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17125 memAlloc.pNext = NULL;
17126 memAlloc.allocationSize = 0;
17127 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017128
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017129 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017130 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017131 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017132 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017133 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017134 ASSERT_VK_SUCCESS(err);
17135
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017136 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017137 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017138 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017139 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017140 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017141 ASSERT_VK_SUCCESS(err);
17142
17143 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17144 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017145 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017146 ASSERT_VK_SUCCESS(err);
17147
Tony Barbour552f6c02016-12-21 14:34:07 -070017148 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017149 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017150 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017151 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017152 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017153 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017154 copyRegion.srcOffset.x = 0;
17155 copyRegion.srcOffset.y = 0;
17156 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017157 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017158 copyRegion.dstSubresource.mipLevel = 0;
17159 copyRegion.dstSubresource.baseArrayLayer = 0;
17160 copyRegion.dstSubresource.layerCount = 0;
17161 copyRegion.dstOffset.x = 0;
17162 copyRegion.dstOffset.y = 0;
17163 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017164 copyRegion.extent.width = 1;
17165 copyRegion.extent.height = 1;
17166 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017167 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017168 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017169
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017170 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017171
Chia-I Wuf7458c52015-10-26 21:10:41 +080017172 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017173 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017174 vkFreeMemory(m_device->device(), srcMem, NULL);
17175 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017176}
17177
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017178TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17179 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017180
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017181 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017182
17183 VkImageFormatProperties image_format_properties;
17184 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17185 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17186 &image_format_properties);
17187
17188 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17189 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17190 printf(" Image multi-sample support not found; skipped.\n");
17191 return;
17192 }
17193
17194 VkImageCreateInfo ci;
17195 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17196 ci.pNext = NULL;
17197 ci.flags = 0;
17198 ci.imageType = VK_IMAGE_TYPE_2D;
17199 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17200 ci.extent = {128, 128, 1};
17201 ci.mipLevels = 1;
17202 ci.arrayLayers = 1;
17203 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17204 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17205 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17206 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17207 ci.queueFamilyIndexCount = 0;
17208 ci.pQueueFamilyIndices = NULL;
17209 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17210
17211 VkImageObj image1(m_device);
17212 image1.init(&ci);
17213 ASSERT_TRUE(image1.initialized());
17214
17215 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17216 VkImageObj image2(m_device);
17217 image2.init(&ci);
17218 ASSERT_TRUE(image2.initialized());
17219
17220 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17221 VkImageObj image4(m_device);
17222 image4.init(&ci);
17223 ASSERT_TRUE(image4.initialized());
17224
17225 m_commandBuffer->BeginCommandBuffer();
17226
17227 VkImageCopy copyRegion;
17228 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17229 copyRegion.srcSubresource.mipLevel = 0;
17230 copyRegion.srcSubresource.baseArrayLayer = 0;
17231 copyRegion.srcSubresource.layerCount = 1;
17232 copyRegion.srcOffset = {0, 0, 0};
17233 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17234 copyRegion.dstSubresource.mipLevel = 0;
17235 copyRegion.dstSubresource.baseArrayLayer = 0;
17236 copyRegion.dstSubresource.layerCount = 1;
17237 copyRegion.dstOffset = {0, 0, 0};
17238 copyRegion.extent = {128, 128, 1};
17239
17240 // Copy a single sample image to/from a multi-sample image
17241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17242 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17243 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17244 m_errorMonitor->VerifyFound();
17245
17246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17247 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17248 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17249 m_errorMonitor->VerifyFound();
17250
17251 // Copy between multi-sample images with different sample counts
17252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17253 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17254 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17255 m_errorMonitor->VerifyFound();
17256
17257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17258 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17259 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17260 m_errorMonitor->VerifyFound();
17261
17262 m_commandBuffer->EndCommandBuffer();
17263}
17264
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017265TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17266 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017267 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017268
17269 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17270 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17271 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17272 ds_image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17273 ASSERT_TRUE(color_image.initialized());
17274 ASSERT_TRUE(depth_image.initialized());
17275 ASSERT_TRUE(ds_image.initialized());
17276
17277 VkImageCopy copyRegion;
17278 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17279 copyRegion.srcSubresource.mipLevel = 0;
17280 copyRegion.srcSubresource.baseArrayLayer = 0;
17281 copyRegion.srcSubresource.layerCount = 1;
17282 copyRegion.srcOffset = {0, 0, 0};
17283 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17284 copyRegion.dstSubresource.mipLevel = 0;
17285 copyRegion.dstSubresource.baseArrayLayer = 0;
17286 copyRegion.dstSubresource.layerCount = 1;
17287 copyRegion.dstOffset = {64, 0, 0};
17288 copyRegion.extent = {64, 128, 1};
17289
17290 // Submitting command before command buffer is in recording state
17291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You must call vkBeginCommandBuffer");// VALIDATION_ERROR_01192);
17292 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17293 m_errorMonitor->VerifyFound();
17294
17295 m_commandBuffer->BeginCommandBuffer();
17296
17297 // Src and dest aspect masks don't match
17298 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
17300 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17301 m_errorMonitor->VerifyFound();
17302 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17303
17304 // Illegal combinations of aspect bits - VU 01221
17305 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
17306 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17308 // These aspect/format mismatches are redundant but unavoidable here
17309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17311 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17312 m_errorMonitor->VerifyFound();
17313 // Metadata aspect is illegal - VU 01222
17314 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17315 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17317 // These aspect/format mismatches are redundant but unavoidable here
17318 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17319 m_errorMonitor->VerifyFound();
17320
17321 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17322 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17323
17324 // Aspect mask doesn't match source image format - VU 01200
17325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17326 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17328 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17329 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17330 m_errorMonitor->VerifyFound();
17331
17332 // Aspect mask doesn't match dest image format - VU 01201
17333 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17334 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17336 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17338 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17339 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17340 m_errorMonitor->VerifyFound();
17341
17342 m_commandBuffer->EndCommandBuffer();
17343}
17344
Karl Schultz6addd812016-02-02 17:17:23 -070017345TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17346 VkResult err;
17347 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017348
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017349 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17350 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017351
Tony Barbour1fa09702017-03-16 12:09:08 -060017352 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017353
17354 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017355 VkImage srcImage;
17356 VkImage dstImage;
17357 VkDeviceMemory srcMem;
17358 VkDeviceMemory destMem;
17359 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017360
17361 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017362 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17363 image_create_info.pNext = NULL;
17364 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17365 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17366 image_create_info.extent.width = 32;
17367 image_create_info.extent.height = 1;
17368 image_create_info.extent.depth = 1;
17369 image_create_info.mipLevels = 1;
17370 image_create_info.arrayLayers = 1;
17371 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17372 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17373 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17374 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017376 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017377 ASSERT_VK_SUCCESS(err);
17378
Karl Schultz6addd812016-02-02 17:17:23 -070017379 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017380
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017381 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017382 ASSERT_VK_SUCCESS(err);
17383
17384 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017385 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017386 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17387 memAlloc.pNext = NULL;
17388 memAlloc.allocationSize = 0;
17389 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017390
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017391 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017392 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017393 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017394 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017395 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017396 ASSERT_VK_SUCCESS(err);
17397
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017398 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017399 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017400 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017401 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017402 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017403 ASSERT_VK_SUCCESS(err);
17404
17405 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17406 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017407 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017408 ASSERT_VK_SUCCESS(err);
17409
Tony Barbour552f6c02016-12-21 14:34:07 -070017410 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017411 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017412 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17413 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017414 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017415 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017416 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017417 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017418 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017419 resolveRegion.srcOffset.x = 0;
17420 resolveRegion.srcOffset.y = 0;
17421 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017422 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017423 resolveRegion.dstSubresource.mipLevel = 0;
17424 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017425 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017426 resolveRegion.dstOffset.x = 0;
17427 resolveRegion.dstOffset.y = 0;
17428 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017429 resolveRegion.extent.width = 1;
17430 resolveRegion.extent.height = 1;
17431 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017432 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017433 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017434
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017435 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017436
Chia-I Wuf7458c52015-10-26 21:10:41 +080017437 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017438 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017439 vkFreeMemory(m_device->device(), srcMem, NULL);
17440 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017441}
17442
Karl Schultz6addd812016-02-02 17:17:23 -070017443TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17444 VkResult err;
17445 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017446
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17448 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017449
Tony Barbour1fa09702017-03-16 12:09:08 -060017450 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017451
Chris Forbesa7530692016-05-08 12:35:39 +120017452 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017453 VkImage srcImage;
17454 VkImage dstImage;
17455 VkDeviceMemory srcMem;
17456 VkDeviceMemory destMem;
17457 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017458
17459 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017460 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17461 image_create_info.pNext = NULL;
17462 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17463 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17464 image_create_info.extent.width = 32;
17465 image_create_info.extent.height = 1;
17466 image_create_info.extent.depth = 1;
17467 image_create_info.mipLevels = 1;
17468 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017469 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017470 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17471 // Note: Some implementations expect color attachment usage for any
17472 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017473 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017474 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017475
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017476 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017477 ASSERT_VK_SUCCESS(err);
17478
Karl Schultz6addd812016-02-02 17:17:23 -070017479 // Note: Some implementations expect color attachment usage for any
17480 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017481 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017482
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017483 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017484 ASSERT_VK_SUCCESS(err);
17485
17486 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017487 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017488 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17489 memAlloc.pNext = NULL;
17490 memAlloc.allocationSize = 0;
17491 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017492
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017493 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017494 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017495 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017496 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017497 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017498 ASSERT_VK_SUCCESS(err);
17499
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017500 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017501 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017502 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017503 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017504 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017505 ASSERT_VK_SUCCESS(err);
17506
17507 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17508 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017509 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017510 ASSERT_VK_SUCCESS(err);
17511
Tony Barbour552f6c02016-12-21 14:34:07 -070017512 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017513 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017514 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17515 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017516 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017517 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017518 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017519 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017520 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017521 resolveRegion.srcOffset.x = 0;
17522 resolveRegion.srcOffset.y = 0;
17523 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017524 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017525 resolveRegion.dstSubresource.mipLevel = 0;
17526 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017527 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017528 resolveRegion.dstOffset.x = 0;
17529 resolveRegion.dstOffset.y = 0;
17530 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017531 resolveRegion.extent.width = 1;
17532 resolveRegion.extent.height = 1;
17533 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017534 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017535 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017536
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017537 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017538
Chia-I Wuf7458c52015-10-26 21:10:41 +080017539 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017540 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017541 vkFreeMemory(m_device->device(), srcMem, NULL);
17542 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017543}
17544
Karl Schultz6addd812016-02-02 17:17:23 -070017545TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17546 VkResult err;
17547 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017548
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017549 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017550 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017551
Tony Barbour1fa09702017-03-16 12:09:08 -060017552 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017553
17554 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017555 VkImage srcImage;
17556 VkImage dstImage;
17557 VkDeviceMemory srcMem;
17558 VkDeviceMemory destMem;
17559 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017560
17561 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017562 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17563 image_create_info.pNext = NULL;
17564 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17565 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17566 image_create_info.extent.width = 32;
17567 image_create_info.extent.height = 1;
17568 image_create_info.extent.depth = 1;
17569 image_create_info.mipLevels = 1;
17570 image_create_info.arrayLayers = 1;
17571 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17572 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17573 // Note: Some implementations expect color attachment usage for any
17574 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017575 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017576 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017577
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017578 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017579 ASSERT_VK_SUCCESS(err);
17580
Karl Schultz6addd812016-02-02 17:17:23 -070017581 // Set format to something other than source image
17582 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17583 // Note: Some implementations expect color attachment usage for any
17584 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017585 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017586 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017587
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017588 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017589 ASSERT_VK_SUCCESS(err);
17590
17591 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017592 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017593 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17594 memAlloc.pNext = NULL;
17595 memAlloc.allocationSize = 0;
17596 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017597
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017598 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017599 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017600 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017601 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017602 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017603 ASSERT_VK_SUCCESS(err);
17604
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017605 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017606 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017607 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017608 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017609 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017610 ASSERT_VK_SUCCESS(err);
17611
17612 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17613 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017614 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017615 ASSERT_VK_SUCCESS(err);
17616
Tony Barbour552f6c02016-12-21 14:34:07 -070017617 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017618 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017619 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17620 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017621 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017622 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017623 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017624 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017625 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017626 resolveRegion.srcOffset.x = 0;
17627 resolveRegion.srcOffset.y = 0;
17628 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017629 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017630 resolveRegion.dstSubresource.mipLevel = 0;
17631 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017632 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017633 resolveRegion.dstOffset.x = 0;
17634 resolveRegion.dstOffset.y = 0;
17635 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017636 resolveRegion.extent.width = 1;
17637 resolveRegion.extent.height = 1;
17638 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017639 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017640 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017641
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017642 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017643
Chia-I Wuf7458c52015-10-26 21:10:41 +080017644 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017645 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017646 vkFreeMemory(m_device->device(), srcMem, NULL);
17647 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017648}
17649
Karl Schultz6addd812016-02-02 17:17:23 -070017650TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17651 VkResult err;
17652 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017653
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017655 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017656
Tony Barbour1fa09702017-03-16 12:09:08 -060017657 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017658
17659 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017660 VkImage srcImage;
17661 VkImage dstImage;
17662 VkDeviceMemory srcMem;
17663 VkDeviceMemory destMem;
17664 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017665
17666 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017667 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17668 image_create_info.pNext = NULL;
17669 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17670 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17671 image_create_info.extent.width = 32;
17672 image_create_info.extent.height = 1;
17673 image_create_info.extent.depth = 1;
17674 image_create_info.mipLevels = 1;
17675 image_create_info.arrayLayers = 1;
17676 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17677 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17678 // Note: Some implementations expect color attachment usage for any
17679 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017680 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017681 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017682
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017683 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017684 ASSERT_VK_SUCCESS(err);
17685
Karl Schultz6addd812016-02-02 17:17:23 -070017686 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17687 // Note: Some implementations expect color attachment usage for any
17688 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017689 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017690 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017691
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017692 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017693 ASSERT_VK_SUCCESS(err);
17694
17695 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017696 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017697 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17698 memAlloc.pNext = NULL;
17699 memAlloc.allocationSize = 0;
17700 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017701
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017702 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017703 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017704 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017705 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017706 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017707 ASSERT_VK_SUCCESS(err);
17708
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017709 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017710 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017711 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017712 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017713 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017714 ASSERT_VK_SUCCESS(err);
17715
17716 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17717 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017718 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017719 ASSERT_VK_SUCCESS(err);
17720
Tony Barbour552f6c02016-12-21 14:34:07 -070017721 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017722 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017723 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17724 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017725 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017726 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017727 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017728 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017729 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017730 resolveRegion.srcOffset.x = 0;
17731 resolveRegion.srcOffset.y = 0;
17732 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017733 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017734 resolveRegion.dstSubresource.mipLevel = 0;
17735 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017736 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017737 resolveRegion.dstOffset.x = 0;
17738 resolveRegion.dstOffset.y = 0;
17739 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017740 resolveRegion.extent.width = 1;
17741 resolveRegion.extent.height = 1;
17742 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017743 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017744 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017745
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017746 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017747
Chia-I Wuf7458c52015-10-26 21:10:41 +080017748 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017749 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017750 vkFreeMemory(m_device->device(), srcMem, NULL);
17751 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017752}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017753
Karl Schultz6addd812016-02-02 17:17:23 -070017754TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017755 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017756 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17757 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017758 // The image format check comes 2nd in validation so we trigger it first,
17759 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017760 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017761
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17763 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017764
Tony Barbour1fa09702017-03-16 12:09:08 -060017765 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017766 auto depth_format = find_depth_stencil_format(m_device);
17767 if (!depth_format) {
17768 return;
17769 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017770
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017771 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017772 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17773 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017774
17775 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017776 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17777 ds_pool_ci.pNext = NULL;
17778 ds_pool_ci.maxSets = 1;
17779 ds_pool_ci.poolSizeCount = 1;
17780 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017781
17782 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017783 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017784 ASSERT_VK_SUCCESS(err);
17785
17786 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017787 dsl_binding.binding = 0;
17788 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17789 dsl_binding.descriptorCount = 1;
17790 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17791 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017792
17793 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017794 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17795 ds_layout_ci.pNext = NULL;
17796 ds_layout_ci.bindingCount = 1;
17797 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017798 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017799 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017800 ASSERT_VK_SUCCESS(err);
17801
17802 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017803 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017804 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017805 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017806 alloc_info.descriptorPool = ds_pool;
17807 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017808 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017809 ASSERT_VK_SUCCESS(err);
17810
Karl Schultz6addd812016-02-02 17:17:23 -070017811 VkImage image_bad;
17812 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017813 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017814 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017815 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017816 const int32_t tex_width = 32;
17817 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017818
17819 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017820 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17821 image_create_info.pNext = NULL;
17822 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17823 image_create_info.format = tex_format_bad;
17824 image_create_info.extent.width = tex_width;
17825 image_create_info.extent.height = tex_height;
17826 image_create_info.extent.depth = 1;
17827 image_create_info.mipLevels = 1;
17828 image_create_info.arrayLayers = 1;
17829 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17830 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017831 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017832 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017833
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017835 ASSERT_VK_SUCCESS(err);
17836 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017837 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17838 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017839 ASSERT_VK_SUCCESS(err);
17840
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017841 // ---Bind image memory---
17842 VkMemoryRequirements img_mem_reqs;
17843 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17844 VkMemoryAllocateInfo image_alloc_info = {};
17845 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17846 image_alloc_info.pNext = NULL;
17847 image_alloc_info.memoryTypeIndex = 0;
17848 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017849 bool pass =
17850 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 -070017851 ASSERT_TRUE(pass);
17852 VkDeviceMemory mem;
17853 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17854 ASSERT_VK_SUCCESS(err);
17855 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17856 ASSERT_VK_SUCCESS(err);
17857 // -----------------------
17858
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017859 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017860 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017861 image_view_create_info.image = image_bad;
17862 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17863 image_view_create_info.format = tex_format_bad;
17864 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17865 image_view_create_info.subresourceRange.baseMipLevel = 0;
17866 image_view_create_info.subresourceRange.layerCount = 1;
17867 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017868 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017869
17870 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017871 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017872
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017873 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017874
Chia-I Wuf7458c52015-10-26 21:10:41 +080017875 vkDestroyImage(m_device->device(), image_bad, NULL);
17876 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017877 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17878 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017879
17880 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017881}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017882
17883TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017884 TEST_DESCRIPTION(
17885 "Call ClearColorImage w/ a depth|stencil image and "
17886 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017887
Tony Barbour1fa09702017-03-16 12:09:08 -060017888 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017889 auto depth_format = find_depth_stencil_format(m_device);
17890 if (!depth_format) {
17891 return;
17892 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17894
Tony Barbour552f6c02016-12-21 14:34:07 -070017895 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017896
17897 // Color image
17898 VkClearColorValue clear_color;
17899 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17900 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17901 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17902 const int32_t img_width = 32;
17903 const int32_t img_height = 32;
17904 VkImageCreateInfo image_create_info = {};
17905 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17906 image_create_info.pNext = NULL;
17907 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17908 image_create_info.format = color_format;
17909 image_create_info.extent.width = img_width;
17910 image_create_info.extent.height = img_height;
17911 image_create_info.extent.depth = 1;
17912 image_create_info.mipLevels = 1;
17913 image_create_info.arrayLayers = 1;
17914 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17915 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17916 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17917
17918 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017919 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017920
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017921 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017922
17923 // Depth/Stencil image
17924 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017925 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017926 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17927 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017928 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017929 ds_image_create_info.extent.width = 64;
17930 ds_image_create_info.extent.height = 64;
17931 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017932 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 -060017933
17934 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017935 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017937 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 -060017938
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017940
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017941 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017942 &color_range);
17943
17944 m_errorMonitor->VerifyFound();
17945
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17947 "vkCmdClearColorImage called with "
17948 "image created without "
17949 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017950
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017951 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017952 &color_range);
17953
17954 m_errorMonitor->VerifyFound();
17955
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017956 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17958 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017959
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017960 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17961 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017962
17963 m_errorMonitor->VerifyFound();
17964}
Tobin Ehliscde08892015-09-22 10:11:37 -060017965
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017966// WSI Enabled Tests
17967//
Chris Forbes09368e42016-10-13 11:59:22 +130017968#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017969TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17970
17971#if defined(VK_USE_PLATFORM_XCB_KHR)
17972 VkSurfaceKHR surface = VK_NULL_HANDLE;
17973
17974 VkResult err;
17975 bool pass;
17976 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17977 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17978 // uint32_t swapchain_image_count = 0;
17979 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17980 // uint32_t image_index = 0;
17981 // VkPresentInfoKHR present_info = {};
17982
Tony Barbour1fa09702017-03-16 12:09:08 -060017983 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017984
17985 // Use the create function from one of the VK_KHR_*_surface extension in
17986 // order to create a surface, testing all known errors in the process,
17987 // before successfully creating a surface:
17988 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
17989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
17990 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
17991 pass = (err != VK_SUCCESS);
17992 ASSERT_TRUE(pass);
17993 m_errorMonitor->VerifyFound();
17994
17995 // Next, try to create a surface with the wrong
17996 // VkXcbSurfaceCreateInfoKHR::sType:
17997 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
17998 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
17999 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18000 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18001 pass = (err != VK_SUCCESS);
18002 ASSERT_TRUE(pass);
18003 m_errorMonitor->VerifyFound();
18004
18005 // Create a native window, and then correctly create a surface:
18006 xcb_connection_t *connection;
18007 xcb_screen_t *screen;
18008 xcb_window_t xcb_window;
18009 xcb_intern_atom_reply_t *atom_wm_delete_window;
18010
18011 const xcb_setup_t *setup;
18012 xcb_screen_iterator_t iter;
18013 int scr;
18014 uint32_t value_mask, value_list[32];
18015 int width = 1;
18016 int height = 1;
18017
18018 connection = xcb_connect(NULL, &scr);
18019 ASSERT_TRUE(connection != NULL);
18020 setup = xcb_get_setup(connection);
18021 iter = xcb_setup_roots_iterator(setup);
18022 while (scr-- > 0)
18023 xcb_screen_next(&iter);
18024 screen = iter.data;
18025
18026 xcb_window = xcb_generate_id(connection);
18027
18028 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18029 value_list[0] = screen->black_pixel;
18030 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18031
18032 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18033 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18034
18035 /* Magic code that will send notification when window is destroyed */
18036 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18037 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18038
18039 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18040 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18041 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18042 free(reply);
18043
18044 xcb_map_window(connection, xcb_window);
18045
18046 // Force the x/y coordinates to 100,100 results are identical in consecutive
18047 // runs
18048 const uint32_t coords[] = { 100, 100 };
18049 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18050
18051 // Finally, try to correctly create a surface:
18052 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18053 xcb_create_info.pNext = NULL;
18054 xcb_create_info.flags = 0;
18055 xcb_create_info.connection = connection;
18056 xcb_create_info.window = xcb_window;
18057 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18058 pass = (err == VK_SUCCESS);
18059 ASSERT_TRUE(pass);
18060
18061 // Check if surface supports presentation:
18062
18063 // 1st, do so without having queried the queue families:
18064 VkBool32 supported = false;
18065 // TODO: Get the following error to come out:
18066 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18067 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18068 "function");
18069 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18070 pass = (err != VK_SUCCESS);
18071 // ASSERT_TRUE(pass);
18072 // m_errorMonitor->VerifyFound();
18073
18074 // Next, query a queue family index that's too large:
18075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18076 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18077 pass = (err != VK_SUCCESS);
18078 ASSERT_TRUE(pass);
18079 m_errorMonitor->VerifyFound();
18080
18081 // Finally, do so correctly:
18082 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18083 // SUPPORTED
18084 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18085 pass = (err == VK_SUCCESS);
18086 ASSERT_TRUE(pass);
18087
18088 // Before proceeding, try to create a swapchain without having called
18089 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18090 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18091 swapchain_create_info.pNext = NULL;
18092 swapchain_create_info.flags = 0;
18093 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18094 swapchain_create_info.surface = surface;
18095 swapchain_create_info.imageArrayLayers = 1;
18096 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18097 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18099 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18100 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18101 pass = (err != VK_SUCCESS);
18102 ASSERT_TRUE(pass);
18103 m_errorMonitor->VerifyFound();
18104
18105 // Get the surface capabilities:
18106 VkSurfaceCapabilitiesKHR surface_capabilities;
18107
18108 // Do so correctly (only error logged by this entrypoint is if the
18109 // extension isn't enabled):
18110 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18111 pass = (err == VK_SUCCESS);
18112 ASSERT_TRUE(pass);
18113
18114 // Get the surface formats:
18115 uint32_t surface_format_count;
18116
18117 // First, try without a pointer to surface_format_count:
18118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18119 "specified as NULL");
18120 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18121 pass = (err == VK_SUCCESS);
18122 ASSERT_TRUE(pass);
18123 m_errorMonitor->VerifyFound();
18124
18125 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18126 // correctly done a 1st try (to get the count):
18127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18128 surface_format_count = 0;
18129 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18130 pass = (err == VK_SUCCESS);
18131 ASSERT_TRUE(pass);
18132 m_errorMonitor->VerifyFound();
18133
18134 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18135 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18136 pass = (err == VK_SUCCESS);
18137 ASSERT_TRUE(pass);
18138
18139 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18140 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18141
18142 // Next, do a 2nd try with surface_format_count being set too high:
18143 surface_format_count += 5;
18144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18145 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18146 pass = (err == VK_SUCCESS);
18147 ASSERT_TRUE(pass);
18148 m_errorMonitor->VerifyFound();
18149
18150 // Finally, do a correct 1st and 2nd try:
18151 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18152 pass = (err == VK_SUCCESS);
18153 ASSERT_TRUE(pass);
18154 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18155 pass = (err == VK_SUCCESS);
18156 ASSERT_TRUE(pass);
18157
18158 // Get the surface present modes:
18159 uint32_t surface_present_mode_count;
18160
18161 // First, try without a pointer to surface_format_count:
18162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18163 "specified as NULL");
18164
18165 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18166 pass = (err == VK_SUCCESS);
18167 ASSERT_TRUE(pass);
18168 m_errorMonitor->VerifyFound();
18169
18170 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18171 // correctly done a 1st try (to get the count):
18172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18173 surface_present_mode_count = 0;
18174 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18175 (VkPresentModeKHR *)&surface_present_mode_count);
18176 pass = (err == VK_SUCCESS);
18177 ASSERT_TRUE(pass);
18178 m_errorMonitor->VerifyFound();
18179
18180 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18181 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18182 pass = (err == VK_SUCCESS);
18183 ASSERT_TRUE(pass);
18184
18185 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18186 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18187
18188 // Next, do a 2nd try with surface_format_count being set too high:
18189 surface_present_mode_count += 5;
18190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18191 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18192 pass = (err == VK_SUCCESS);
18193 ASSERT_TRUE(pass);
18194 m_errorMonitor->VerifyFound();
18195
18196 // Finally, do a correct 1st and 2nd try:
18197 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18198 pass = (err == VK_SUCCESS);
18199 ASSERT_TRUE(pass);
18200 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18201 pass = (err == VK_SUCCESS);
18202 ASSERT_TRUE(pass);
18203
18204 // Create a swapchain:
18205
18206 // First, try without a pointer to swapchain_create_info:
18207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18208 "specified as NULL");
18209
18210 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18211 pass = (err != VK_SUCCESS);
18212 ASSERT_TRUE(pass);
18213 m_errorMonitor->VerifyFound();
18214
18215 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18216 // sType:
18217 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18219
18220 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18221 pass = (err != VK_SUCCESS);
18222 ASSERT_TRUE(pass);
18223 m_errorMonitor->VerifyFound();
18224
18225 // Next, call with a NULL swapchain pointer:
18226 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18227 swapchain_create_info.pNext = NULL;
18228 swapchain_create_info.flags = 0;
18229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18230 "specified as NULL");
18231
18232 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18233 pass = (err != VK_SUCCESS);
18234 ASSERT_TRUE(pass);
18235 m_errorMonitor->VerifyFound();
18236
18237 // TODO: Enhance swapchain layer so that
18238 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18239
18240 // Next, call with a queue family index that's too large:
18241 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18242 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18243 swapchain_create_info.queueFamilyIndexCount = 2;
18244 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18246 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18247 pass = (err != VK_SUCCESS);
18248 ASSERT_TRUE(pass);
18249 m_errorMonitor->VerifyFound();
18250
18251 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18252 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18253 swapchain_create_info.queueFamilyIndexCount = 1;
18254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18255 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18256 "pCreateInfo->pQueueFamilyIndices).");
18257 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18258 pass = (err != VK_SUCCESS);
18259 ASSERT_TRUE(pass);
18260 m_errorMonitor->VerifyFound();
18261
18262 // Next, call with an invalid imageSharingMode:
18263 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18264 swapchain_create_info.queueFamilyIndexCount = 1;
18265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18266 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18267 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18268 pass = (err != VK_SUCCESS);
18269 ASSERT_TRUE(pass);
18270 m_errorMonitor->VerifyFound();
18271 // Fix for the future:
18272 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18273 // SUPPORTED
18274 swapchain_create_info.queueFamilyIndexCount = 0;
18275 queueFamilyIndex[0] = 0;
18276 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18277
18278 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18279 // Get the images from a swapchain:
18280 // Acquire an image from a swapchain:
18281 // Present an image to a swapchain:
18282 // Destroy the swapchain:
18283
18284 // TODOs:
18285 //
18286 // - Try destroying the device without first destroying the swapchain
18287 //
18288 // - Try destroying the device without first destroying the surface
18289 //
18290 // - Try destroying the surface without first destroying the swapchain
18291
18292 // Destroy the surface:
18293 vkDestroySurfaceKHR(instance(), surface, NULL);
18294
18295 // Tear down the window:
18296 xcb_destroy_window(connection, xcb_window);
18297 xcb_disconnect(connection);
18298
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018299#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018300 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018301#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018302}
Chris Forbes09368e42016-10-13 11:59:22 +130018303#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018304
18305//
18306// POSITIVE VALIDATION TESTS
18307//
18308// These tests do not expect to encounter ANY validation errors pass only if this is true
18309
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018310TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18311 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018312 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18314
18315 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18316 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18317 command_buffer_allocate_info.commandPool = m_commandPool;
18318 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18319 command_buffer_allocate_info.commandBufferCount = 1;
18320
18321 VkCommandBuffer secondary_command_buffer;
18322 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18323 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18324 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18325 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18326 command_buffer_inheritance_info.renderPass = m_renderPass;
18327 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18328
18329 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18330 command_buffer_begin_info.flags =
18331 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18332 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18333
18334 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18335 VkClearAttachment color_attachment;
18336 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18337 color_attachment.clearValue.color.float32[0] = 0;
18338 color_attachment.clearValue.color.float32[1] = 0;
18339 color_attachment.clearValue.color.float32[2] = 0;
18340 color_attachment.clearValue.color.float32[3] = 0;
18341 color_attachment.colorAttachment = 0;
18342 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18343 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18344}
18345
Tobin Ehlise0006882016-11-03 10:14:28 -060018346TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018347 TEST_DESCRIPTION(
18348 "Perform an image layout transition in a secondary command buffer followed "
18349 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018350 VkResult err;
18351 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018352 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070018353 auto depth_format = find_depth_stencil_format(m_device);
18354 if (!depth_format) {
18355 return;
18356 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18358 // Allocate a secondary and primary cmd buffer
18359 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18360 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18361 command_buffer_allocate_info.commandPool = m_commandPool;
18362 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18363 command_buffer_allocate_info.commandBufferCount = 1;
18364
18365 VkCommandBuffer secondary_command_buffer;
18366 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18367 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18368 VkCommandBuffer primary_command_buffer;
18369 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18370 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18371 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18372 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18373 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18374 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18375 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18376
18377 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18378 ASSERT_VK_SUCCESS(err);
18379 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018380 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 -060018381 ASSERT_TRUE(image.initialized());
18382 VkImageMemoryBarrier img_barrier = {};
18383 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18384 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18385 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18386 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18387 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18388 img_barrier.image = image.handle();
18389 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18390 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18391 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18392 img_barrier.subresourceRange.baseArrayLayer = 0;
18393 img_barrier.subresourceRange.baseMipLevel = 0;
18394 img_barrier.subresourceRange.layerCount = 1;
18395 img_barrier.subresourceRange.levelCount = 1;
18396 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18397 0, nullptr, 1, &img_barrier);
18398 err = vkEndCommandBuffer(secondary_command_buffer);
18399 ASSERT_VK_SUCCESS(err);
18400
18401 // Now update primary cmd buffer to execute secondary and transitions image
18402 command_buffer_begin_info.pInheritanceInfo = nullptr;
18403 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18404 ASSERT_VK_SUCCESS(err);
18405 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18406 VkImageMemoryBarrier img_barrier2 = {};
18407 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18408 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18409 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18410 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18411 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18412 img_barrier2.image = image.handle();
18413 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18414 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18415 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18416 img_barrier2.subresourceRange.baseArrayLayer = 0;
18417 img_barrier2.subresourceRange.baseMipLevel = 0;
18418 img_barrier2.subresourceRange.layerCount = 1;
18419 img_barrier2.subresourceRange.levelCount = 1;
18420 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18421 nullptr, 1, &img_barrier2);
18422 err = vkEndCommandBuffer(primary_command_buffer);
18423 ASSERT_VK_SUCCESS(err);
18424 VkSubmitInfo submit_info = {};
18425 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18426 submit_info.commandBufferCount = 1;
18427 submit_info.pCommandBuffers = &primary_command_buffer;
18428 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18429 ASSERT_VK_SUCCESS(err);
18430 m_errorMonitor->VerifyNotFound();
18431 err = vkDeviceWaitIdle(m_device->device());
18432 ASSERT_VK_SUCCESS(err);
18433 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
18434 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
18435}
18436
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018437// This is a positive test. No failures are expected.
18438TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018439 TEST_DESCRIPTION(
18440 "Ensure that the vkUpdateDescriptorSets validation code "
18441 "is ignoring VkWriteDescriptorSet members that are not "
18442 "related to the descriptor type specified by "
18443 "VkWriteDescriptorSet::descriptorType. Correct "
18444 "validation behavior will result in the test running to "
18445 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018446
18447 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18448
Tony Barbour1fa09702017-03-16 12:09:08 -060018449 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018450
18451 // Image Case
18452 {
18453 m_errorMonitor->ExpectSuccess();
18454
18455 VkImage image;
18456 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18457 const int32_t tex_width = 32;
18458 const int32_t tex_height = 32;
18459 VkImageCreateInfo image_create_info = {};
18460 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18461 image_create_info.pNext = NULL;
18462 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18463 image_create_info.format = tex_format;
18464 image_create_info.extent.width = tex_width;
18465 image_create_info.extent.height = tex_height;
18466 image_create_info.extent.depth = 1;
18467 image_create_info.mipLevels = 1;
18468 image_create_info.arrayLayers = 1;
18469 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18470 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18471 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18472 image_create_info.flags = 0;
18473 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18474 ASSERT_VK_SUCCESS(err);
18475
18476 VkMemoryRequirements memory_reqs;
18477 VkDeviceMemory image_memory;
18478 bool pass;
18479 VkMemoryAllocateInfo memory_info = {};
18480 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18481 memory_info.pNext = NULL;
18482 memory_info.allocationSize = 0;
18483 memory_info.memoryTypeIndex = 0;
18484 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18485 memory_info.allocationSize = memory_reqs.size;
18486 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18487 ASSERT_TRUE(pass);
18488 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18489 ASSERT_VK_SUCCESS(err);
18490 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18491 ASSERT_VK_SUCCESS(err);
18492
18493 VkImageViewCreateInfo image_view_create_info = {};
18494 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18495 image_view_create_info.image = image;
18496 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18497 image_view_create_info.format = tex_format;
18498 image_view_create_info.subresourceRange.layerCount = 1;
18499 image_view_create_info.subresourceRange.baseMipLevel = 0;
18500 image_view_create_info.subresourceRange.levelCount = 1;
18501 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18502
18503 VkImageView view;
18504 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18505 ASSERT_VK_SUCCESS(err);
18506
18507 VkDescriptorPoolSize ds_type_count = {};
18508 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18509 ds_type_count.descriptorCount = 1;
18510
18511 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18512 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18513 ds_pool_ci.pNext = NULL;
18514 ds_pool_ci.maxSets = 1;
18515 ds_pool_ci.poolSizeCount = 1;
18516 ds_pool_ci.pPoolSizes = &ds_type_count;
18517
18518 VkDescriptorPool ds_pool;
18519 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18520 ASSERT_VK_SUCCESS(err);
18521
18522 VkDescriptorSetLayoutBinding dsl_binding = {};
18523 dsl_binding.binding = 0;
18524 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18525 dsl_binding.descriptorCount = 1;
18526 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18527 dsl_binding.pImmutableSamplers = NULL;
18528
18529 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18530 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18531 ds_layout_ci.pNext = NULL;
18532 ds_layout_ci.bindingCount = 1;
18533 ds_layout_ci.pBindings = &dsl_binding;
18534 VkDescriptorSetLayout ds_layout;
18535 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18536 ASSERT_VK_SUCCESS(err);
18537
18538 VkDescriptorSet descriptor_set;
18539 VkDescriptorSetAllocateInfo alloc_info = {};
18540 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18541 alloc_info.descriptorSetCount = 1;
18542 alloc_info.descriptorPool = ds_pool;
18543 alloc_info.pSetLayouts = &ds_layout;
18544 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18545 ASSERT_VK_SUCCESS(err);
18546
18547 VkDescriptorImageInfo image_info = {};
18548 image_info.imageView = view;
18549 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18550
18551 VkWriteDescriptorSet descriptor_write;
18552 memset(&descriptor_write, 0, sizeof(descriptor_write));
18553 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18554 descriptor_write.dstSet = descriptor_set;
18555 descriptor_write.dstBinding = 0;
18556 descriptor_write.descriptorCount = 1;
18557 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18558 descriptor_write.pImageInfo = &image_info;
18559
18560 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18561 // be
18562 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18563 // This will most likely produce a crash if the parameter_validation
18564 // layer
18565 // does not correctly ignore pBufferInfo.
18566 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18567 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18568
18569 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18570
18571 m_errorMonitor->VerifyNotFound();
18572
18573 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18574 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18575 vkDestroyImageView(m_device->device(), view, NULL);
18576 vkDestroyImage(m_device->device(), image, NULL);
18577 vkFreeMemory(m_device->device(), image_memory, NULL);
18578 }
18579
18580 // Buffer Case
18581 {
18582 m_errorMonitor->ExpectSuccess();
18583
18584 VkBuffer buffer;
18585 uint32_t queue_family_index = 0;
18586 VkBufferCreateInfo buffer_create_info = {};
18587 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18588 buffer_create_info.size = 1024;
18589 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18590 buffer_create_info.queueFamilyIndexCount = 1;
18591 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18592
18593 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18594 ASSERT_VK_SUCCESS(err);
18595
18596 VkMemoryRequirements memory_reqs;
18597 VkDeviceMemory buffer_memory;
18598 bool pass;
18599 VkMemoryAllocateInfo memory_info = {};
18600 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18601 memory_info.pNext = NULL;
18602 memory_info.allocationSize = 0;
18603 memory_info.memoryTypeIndex = 0;
18604
18605 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18606 memory_info.allocationSize = memory_reqs.size;
18607 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18608 ASSERT_TRUE(pass);
18609
18610 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18611 ASSERT_VK_SUCCESS(err);
18612 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18613 ASSERT_VK_SUCCESS(err);
18614
18615 VkDescriptorPoolSize ds_type_count = {};
18616 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18617 ds_type_count.descriptorCount = 1;
18618
18619 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18620 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18621 ds_pool_ci.pNext = NULL;
18622 ds_pool_ci.maxSets = 1;
18623 ds_pool_ci.poolSizeCount = 1;
18624 ds_pool_ci.pPoolSizes = &ds_type_count;
18625
18626 VkDescriptorPool ds_pool;
18627 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18628 ASSERT_VK_SUCCESS(err);
18629
18630 VkDescriptorSetLayoutBinding dsl_binding = {};
18631 dsl_binding.binding = 0;
18632 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18633 dsl_binding.descriptorCount = 1;
18634 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18635 dsl_binding.pImmutableSamplers = NULL;
18636
18637 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18638 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18639 ds_layout_ci.pNext = NULL;
18640 ds_layout_ci.bindingCount = 1;
18641 ds_layout_ci.pBindings = &dsl_binding;
18642 VkDescriptorSetLayout ds_layout;
18643 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18644 ASSERT_VK_SUCCESS(err);
18645
18646 VkDescriptorSet descriptor_set;
18647 VkDescriptorSetAllocateInfo alloc_info = {};
18648 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18649 alloc_info.descriptorSetCount = 1;
18650 alloc_info.descriptorPool = ds_pool;
18651 alloc_info.pSetLayouts = &ds_layout;
18652 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18653 ASSERT_VK_SUCCESS(err);
18654
18655 VkDescriptorBufferInfo buffer_info = {};
18656 buffer_info.buffer = buffer;
18657 buffer_info.offset = 0;
18658 buffer_info.range = 1024;
18659
18660 VkWriteDescriptorSet descriptor_write;
18661 memset(&descriptor_write, 0, sizeof(descriptor_write));
18662 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18663 descriptor_write.dstSet = descriptor_set;
18664 descriptor_write.dstBinding = 0;
18665 descriptor_write.descriptorCount = 1;
18666 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18667 descriptor_write.pBufferInfo = &buffer_info;
18668
18669 // Set pImageInfo and pTexelBufferView to invalid values, which should
18670 // be
18671 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18672 // This will most likely produce a crash if the parameter_validation
18673 // layer
18674 // does not correctly ignore pImageInfo.
18675 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18676 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18677
18678 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18679
18680 m_errorMonitor->VerifyNotFound();
18681
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018682 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18683 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18684 vkDestroyBuffer(m_device->device(), buffer, NULL);
18685 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18686 }
18687
18688 // Texel Buffer Case
18689 {
18690 m_errorMonitor->ExpectSuccess();
18691
18692 VkBuffer buffer;
18693 uint32_t queue_family_index = 0;
18694 VkBufferCreateInfo buffer_create_info = {};
18695 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18696 buffer_create_info.size = 1024;
18697 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18698 buffer_create_info.queueFamilyIndexCount = 1;
18699 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18700
18701 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18702 ASSERT_VK_SUCCESS(err);
18703
18704 VkMemoryRequirements memory_reqs;
18705 VkDeviceMemory buffer_memory;
18706 bool pass;
18707 VkMemoryAllocateInfo memory_info = {};
18708 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18709 memory_info.pNext = NULL;
18710 memory_info.allocationSize = 0;
18711 memory_info.memoryTypeIndex = 0;
18712
18713 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18714 memory_info.allocationSize = memory_reqs.size;
18715 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18716 ASSERT_TRUE(pass);
18717
18718 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18719 ASSERT_VK_SUCCESS(err);
18720 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18721 ASSERT_VK_SUCCESS(err);
18722
18723 VkBufferViewCreateInfo buff_view_ci = {};
18724 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18725 buff_view_ci.buffer = buffer;
18726 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18727 buff_view_ci.range = VK_WHOLE_SIZE;
18728 VkBufferView buffer_view;
18729 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18730
18731 VkDescriptorPoolSize ds_type_count = {};
18732 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18733 ds_type_count.descriptorCount = 1;
18734
18735 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18736 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18737 ds_pool_ci.pNext = NULL;
18738 ds_pool_ci.maxSets = 1;
18739 ds_pool_ci.poolSizeCount = 1;
18740 ds_pool_ci.pPoolSizes = &ds_type_count;
18741
18742 VkDescriptorPool ds_pool;
18743 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18744 ASSERT_VK_SUCCESS(err);
18745
18746 VkDescriptorSetLayoutBinding dsl_binding = {};
18747 dsl_binding.binding = 0;
18748 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18749 dsl_binding.descriptorCount = 1;
18750 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18751 dsl_binding.pImmutableSamplers = NULL;
18752
18753 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18754 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18755 ds_layout_ci.pNext = NULL;
18756 ds_layout_ci.bindingCount = 1;
18757 ds_layout_ci.pBindings = &dsl_binding;
18758 VkDescriptorSetLayout ds_layout;
18759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18760 ASSERT_VK_SUCCESS(err);
18761
18762 VkDescriptorSet descriptor_set;
18763 VkDescriptorSetAllocateInfo alloc_info = {};
18764 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18765 alloc_info.descriptorSetCount = 1;
18766 alloc_info.descriptorPool = ds_pool;
18767 alloc_info.pSetLayouts = &ds_layout;
18768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18769 ASSERT_VK_SUCCESS(err);
18770
18771 VkWriteDescriptorSet descriptor_write;
18772 memset(&descriptor_write, 0, sizeof(descriptor_write));
18773 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18774 descriptor_write.dstSet = descriptor_set;
18775 descriptor_write.dstBinding = 0;
18776 descriptor_write.descriptorCount = 1;
18777 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18778 descriptor_write.pTexelBufferView = &buffer_view;
18779
18780 // Set pImageInfo and pBufferInfo to invalid values, which should be
18781 // ignored for descriptorType ==
18782 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18783 // This will most likely produce a crash if the parameter_validation
18784 // layer
18785 // does not correctly ignore pImageInfo and pBufferInfo.
18786 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18787 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18788
18789 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18790
18791 m_errorMonitor->VerifyNotFound();
18792
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018793 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18794 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18795 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18796 vkDestroyBuffer(m_device->device(), buffer, NULL);
18797 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18798 }
18799}
18800
Tobin Ehlisf7428442016-10-25 07:58:24 -060018801TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18802 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18803
Tony Barbour1fa09702017-03-16 12:09:08 -060018804 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018805 // Create layout where two binding #s are "1"
18806 static const uint32_t NUM_BINDINGS = 3;
18807 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18808 dsl_binding[0].binding = 1;
18809 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18810 dsl_binding[0].descriptorCount = 1;
18811 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18812 dsl_binding[0].pImmutableSamplers = NULL;
18813 dsl_binding[1].binding = 0;
18814 dsl_binding[1].descriptorCount = 1;
18815 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18816 dsl_binding[1].descriptorCount = 1;
18817 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18818 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018819 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018820 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18821 dsl_binding[2].descriptorCount = 1;
18822 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18823 dsl_binding[2].pImmutableSamplers = NULL;
18824
18825 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18826 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18827 ds_layout_ci.pNext = NULL;
18828 ds_layout_ci.bindingCount = NUM_BINDINGS;
18829 ds_layout_ci.pBindings = dsl_binding;
18830 VkDescriptorSetLayout ds_layout;
18831 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18832 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18833 m_errorMonitor->VerifyFound();
18834}
18835
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018836TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018837 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18838
Tony Barbour1fa09702017-03-16 12:09:08 -060018839 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018840
Tony Barbour552f6c02016-12-21 14:34:07 -070018841 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018842
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018843 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18844
18845 {
18846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18847 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18848 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18849 m_errorMonitor->VerifyFound();
18850 }
18851
18852 {
18853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18854 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18855 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18856 m_errorMonitor->VerifyFound();
18857 }
18858
18859 {
18860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18861 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18863 m_errorMonitor->VerifyFound();
18864 }
18865
18866 {
18867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18868 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18869 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18870 m_errorMonitor->VerifyFound();
18871 }
18872
18873 {
18874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18875 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18876 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18877 m_errorMonitor->VerifyFound();
18878 }
18879
18880 {
18881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18882 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18883 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18884 m_errorMonitor->VerifyFound();
18885 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018886
18887 {
18888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18889 VkRect2D scissor = {{-1, 0}, {16, 16}};
18890 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18891 m_errorMonitor->VerifyFound();
18892 }
18893
18894 {
18895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18896 VkRect2D scissor = {{0, -2}, {16, 16}};
18897 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18898 m_errorMonitor->VerifyFound();
18899 }
18900
18901 {
18902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18903 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18904 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18905 m_errorMonitor->VerifyFound();
18906 }
18907
18908 {
18909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18910 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18911 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18912 m_errorMonitor->VerifyFound();
18913 }
18914
Tony Barbour552f6c02016-12-21 14:34:07 -070018915 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018916}
18917
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018918// This is a positive test. No failures are expected.
18919TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18920 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18921 VkResult err;
18922
Tony Barbour1fa09702017-03-16 12:09:08 -060018923 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018924 m_errorMonitor->ExpectSuccess();
18925 VkDescriptorPoolSize ds_type_count = {};
18926 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18927 ds_type_count.descriptorCount = 2;
18928
18929 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18930 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18931 ds_pool_ci.pNext = NULL;
18932 ds_pool_ci.maxSets = 1;
18933 ds_pool_ci.poolSizeCount = 1;
18934 ds_pool_ci.pPoolSizes = &ds_type_count;
18935
18936 VkDescriptorPool ds_pool;
18937 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18938 ASSERT_VK_SUCCESS(err);
18939
18940 // Create layout with two uniform buffer descriptors w/ empty binding between them
18941 static const uint32_t NUM_BINDINGS = 3;
18942 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18943 dsl_binding[0].binding = 0;
18944 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18945 dsl_binding[0].descriptorCount = 1;
18946 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18947 dsl_binding[0].pImmutableSamplers = NULL;
18948 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018949 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018950 dsl_binding[2].binding = 2;
18951 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18952 dsl_binding[2].descriptorCount = 1;
18953 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18954 dsl_binding[2].pImmutableSamplers = NULL;
18955
18956 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18957 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18958 ds_layout_ci.pNext = NULL;
18959 ds_layout_ci.bindingCount = NUM_BINDINGS;
18960 ds_layout_ci.pBindings = dsl_binding;
18961 VkDescriptorSetLayout ds_layout;
18962 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18963 ASSERT_VK_SUCCESS(err);
18964
18965 VkDescriptorSet descriptor_set = {};
18966 VkDescriptorSetAllocateInfo alloc_info = {};
18967 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18968 alloc_info.descriptorSetCount = 1;
18969 alloc_info.descriptorPool = ds_pool;
18970 alloc_info.pSetLayouts = &ds_layout;
18971 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18972 ASSERT_VK_SUCCESS(err);
18973
18974 // Create a buffer to be used for update
18975 VkBufferCreateInfo buff_ci = {};
18976 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18977 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18978 buff_ci.size = 256;
18979 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18980 VkBuffer buffer;
18981 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
18982 ASSERT_VK_SUCCESS(err);
18983 // Have to bind memory to buffer before descriptor update
18984 VkMemoryAllocateInfo mem_alloc = {};
18985 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18986 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018987 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018988 mem_alloc.memoryTypeIndex = 0;
18989
18990 VkMemoryRequirements mem_reqs;
18991 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
18992 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
18993 if (!pass) {
18994 vkDestroyBuffer(m_device->device(), buffer, NULL);
18995 return;
18996 }
18997
18998 VkDeviceMemory mem;
18999 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19000 ASSERT_VK_SUCCESS(err);
19001 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19002 ASSERT_VK_SUCCESS(err);
19003
19004 // Only update the descriptor at binding 2
19005 VkDescriptorBufferInfo buff_info = {};
19006 buff_info.buffer = buffer;
19007 buff_info.offset = 0;
19008 buff_info.range = VK_WHOLE_SIZE;
19009 VkWriteDescriptorSet descriptor_write = {};
19010 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19011 descriptor_write.dstBinding = 2;
19012 descriptor_write.descriptorCount = 1;
19013 descriptor_write.pTexelBufferView = nullptr;
19014 descriptor_write.pBufferInfo = &buff_info;
19015 descriptor_write.pImageInfo = nullptr;
19016 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19017 descriptor_write.dstSet = descriptor_set;
19018
19019 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19020
19021 m_errorMonitor->VerifyNotFound();
19022 // Cleanup
19023 vkFreeMemory(m_device->device(), mem, NULL);
19024 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19025 vkDestroyBuffer(m_device->device(), buffer, NULL);
19026 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19027}
19028
19029// This is a positive test. No failures are expected.
19030TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19031 VkResult err;
19032 bool pass;
19033
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019034 TEST_DESCRIPTION(
19035 "Create a buffer, allocate memory, bind memory, destroy "
19036 "the buffer, create an image, and bind the same memory to "
19037 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019038
19039 m_errorMonitor->ExpectSuccess();
19040
Tony Barbour1fa09702017-03-16 12:09:08 -060019041 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019042
19043 VkBuffer buffer;
19044 VkImage image;
19045 VkDeviceMemory mem;
19046 VkMemoryRequirements mem_reqs;
19047
19048 VkBufferCreateInfo buf_info = {};
19049 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19050 buf_info.pNext = NULL;
19051 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19052 buf_info.size = 256;
19053 buf_info.queueFamilyIndexCount = 0;
19054 buf_info.pQueueFamilyIndices = NULL;
19055 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19056 buf_info.flags = 0;
19057 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19058 ASSERT_VK_SUCCESS(err);
19059
19060 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19061
19062 VkMemoryAllocateInfo alloc_info = {};
19063 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19064 alloc_info.pNext = NULL;
19065 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019066
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019067 // Ensure memory is big enough for both bindings
19068 alloc_info.allocationSize = 0x10000;
19069
19070 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19071 if (!pass) {
19072 vkDestroyBuffer(m_device->device(), buffer, NULL);
19073 return;
19074 }
19075
19076 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19077 ASSERT_VK_SUCCESS(err);
19078
19079 uint8_t *pData;
19080 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19081 ASSERT_VK_SUCCESS(err);
19082
19083 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19084
19085 vkUnmapMemory(m_device->device(), mem);
19086
19087 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19088 ASSERT_VK_SUCCESS(err);
19089
19090 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19091 // memory. In fact, it was never used by the GPU.
19092 // Just be be sure, wait for idle.
19093 vkDestroyBuffer(m_device->device(), buffer, NULL);
19094 vkDeviceWaitIdle(m_device->device());
19095
Tobin Ehlis6a005702016-12-28 15:25:56 -070019096 // Use optimal as some platforms report linear support but then fail image creation
19097 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19098 VkImageFormatProperties image_format_properties;
19099 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19100 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19101 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019102 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019103 vkFreeMemory(m_device->device(), mem, NULL);
19104 return;
19105 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019106 VkImageCreateInfo image_create_info = {};
19107 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19108 image_create_info.pNext = NULL;
19109 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19110 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19111 image_create_info.extent.width = 64;
19112 image_create_info.extent.height = 64;
19113 image_create_info.extent.depth = 1;
19114 image_create_info.mipLevels = 1;
19115 image_create_info.arrayLayers = 1;
19116 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019117 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019118 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19119 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19120 image_create_info.queueFamilyIndexCount = 0;
19121 image_create_info.pQueueFamilyIndices = NULL;
19122 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19123 image_create_info.flags = 0;
19124
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019125 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019126 * to be textures or it will be the staging image if they are not.
19127 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019128 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19129 ASSERT_VK_SUCCESS(err);
19130
19131 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19132
Tobin Ehlis6a005702016-12-28 15:25:56 -070019133 VkMemoryAllocateInfo mem_alloc = {};
19134 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19135 mem_alloc.pNext = NULL;
19136 mem_alloc.allocationSize = 0;
19137 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019138 mem_alloc.allocationSize = mem_reqs.size;
19139
19140 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19141 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019142 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019143 vkDestroyImage(m_device->device(), image, NULL);
19144 return;
19145 }
19146
19147 // VALIDATION FAILURE:
19148 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19149 ASSERT_VK_SUCCESS(err);
19150
19151 m_errorMonitor->VerifyNotFound();
19152
19153 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019154 vkDestroyImage(m_device->device(), image, NULL);
19155}
19156
Tony Barbourab713912017-02-02 14:17:35 -070019157// This is a positive test. No failures are expected.
19158TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19159 VkResult err;
19160
19161 TEST_DESCRIPTION(
19162 "Call all applicable destroy and free routines with NULL"
19163 "handles, expecting no validation errors");
19164
19165 m_errorMonitor->ExpectSuccess();
19166
Tony Barbour1fa09702017-03-16 12:09:08 -060019167 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019168 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19169 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19170 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19171 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19172 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19173 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19174 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19175 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19176 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19177 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19178 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19179 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19180 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19181 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19182 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19183 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19184 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19185 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19186 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19187 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19188
19189 VkCommandPool command_pool;
19190 VkCommandPoolCreateInfo pool_create_info{};
19191 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19192 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19193 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19194 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19195 VkCommandBuffer command_buffers[3] = {};
19196 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19197 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19198 command_buffer_allocate_info.commandPool = command_pool;
19199 command_buffer_allocate_info.commandBufferCount = 1;
19200 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19201 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19202 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19203 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19204
19205 VkDescriptorPoolSize ds_type_count = {};
19206 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19207 ds_type_count.descriptorCount = 1;
19208
19209 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19210 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19211 ds_pool_ci.pNext = NULL;
19212 ds_pool_ci.maxSets = 1;
19213 ds_pool_ci.poolSizeCount = 1;
19214 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19215 ds_pool_ci.pPoolSizes = &ds_type_count;
19216
19217 VkDescriptorPool ds_pool;
19218 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19219 ASSERT_VK_SUCCESS(err);
19220
19221 VkDescriptorSetLayoutBinding dsl_binding = {};
19222 dsl_binding.binding = 2;
19223 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19224 dsl_binding.descriptorCount = 1;
19225 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19226 dsl_binding.pImmutableSamplers = NULL;
19227 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19228 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19229 ds_layout_ci.pNext = NULL;
19230 ds_layout_ci.bindingCount = 1;
19231 ds_layout_ci.pBindings = &dsl_binding;
19232 VkDescriptorSetLayout ds_layout;
19233 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19234 ASSERT_VK_SUCCESS(err);
19235
19236 VkDescriptorSet descriptor_sets[3] = {};
19237 VkDescriptorSetAllocateInfo alloc_info = {};
19238 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19239 alloc_info.descriptorSetCount = 1;
19240 alloc_info.descriptorPool = ds_pool;
19241 alloc_info.pSetLayouts = &ds_layout;
19242 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19243 ASSERT_VK_SUCCESS(err);
19244 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19245 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19246 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19247
19248 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19249
19250 m_errorMonitor->VerifyNotFound();
19251}
19252
Tony Barbour626994c2017-02-08 15:29:37 -070019253TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019254 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019255
19256 m_errorMonitor->ExpectSuccess();
19257
Tony Barbour1fa09702017-03-16 12:09:08 -060019258 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019259 VkCommandBuffer cmd_bufs[4];
19260 VkCommandBufferAllocateInfo alloc_info;
19261 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19262 alloc_info.pNext = NULL;
19263 alloc_info.commandBufferCount = 4;
19264 alloc_info.commandPool = m_commandPool;
19265 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19266 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19267 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019268 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19269 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19270 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019271 ASSERT_TRUE(image.initialized());
19272 VkCommandBufferBeginInfo cb_binfo;
19273 cb_binfo.pNext = NULL;
19274 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19275 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19276 cb_binfo.flags = 0;
19277 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19278 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19279 VkImageMemoryBarrier img_barrier = {};
19280 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19281 img_barrier.pNext = NULL;
19282 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19283 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19284 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19285 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19286 img_barrier.image = image.handle();
19287 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19288 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19289 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19290 img_barrier.subresourceRange.baseArrayLayer = 0;
19291 img_barrier.subresourceRange.baseMipLevel = 0;
19292 img_barrier.subresourceRange.layerCount = 1;
19293 img_barrier.subresourceRange.levelCount = 1;
19294 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19295 &img_barrier);
19296 vkEndCommandBuffer(cmd_bufs[0]);
19297 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19298 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19299 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19300 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19301 &img_barrier);
19302 vkEndCommandBuffer(cmd_bufs[1]);
19303 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19304 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19305 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19306 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19307 &img_barrier);
19308 vkEndCommandBuffer(cmd_bufs[2]);
19309 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19310 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19311 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19312 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19313 &img_barrier);
19314 vkEndCommandBuffer(cmd_bufs[3]);
19315
19316 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19317 VkSemaphore semaphore1, semaphore2;
19318 VkSemaphoreCreateInfo semaphore_create_info{};
19319 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19320 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19321 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19322 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19323 VkSubmitInfo submit_info[3];
19324 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19325 submit_info[0].pNext = nullptr;
19326 submit_info[0].commandBufferCount = 1;
19327 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19328 submit_info[0].signalSemaphoreCount = 1;
19329 submit_info[0].pSignalSemaphores = &semaphore1;
19330 submit_info[0].waitSemaphoreCount = 0;
19331 submit_info[0].pWaitDstStageMask = nullptr;
19332 submit_info[0].pWaitDstStageMask = flags;
19333 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19334 submit_info[1].pNext = nullptr;
19335 submit_info[1].commandBufferCount = 1;
19336 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19337 submit_info[1].waitSemaphoreCount = 1;
19338 submit_info[1].pWaitSemaphores = &semaphore1;
19339 submit_info[1].signalSemaphoreCount = 1;
19340 submit_info[1].pSignalSemaphores = &semaphore2;
19341 submit_info[1].pWaitDstStageMask = flags;
19342 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19343 submit_info[2].pNext = nullptr;
19344 submit_info[2].commandBufferCount = 2;
19345 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19346 submit_info[2].waitSemaphoreCount = 1;
19347 submit_info[2].pWaitSemaphores = &semaphore2;
19348 submit_info[2].signalSemaphoreCount = 0;
19349 submit_info[2].pSignalSemaphores = nullptr;
19350 submit_info[2].pWaitDstStageMask = flags;
19351 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19352 vkQueueWaitIdle(m_device->m_queue);
19353
19354 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19355 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19356 m_errorMonitor->VerifyNotFound();
19357}
19358
Tobin Ehlis953e8392016-11-17 10:54:13 -070019359TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19360 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19361 // We previously had a bug where dynamic offset of inactive bindings was still being used
19362 VkResult err;
19363 m_errorMonitor->ExpectSuccess();
19364
Tony Barbour1fa09702017-03-16 12:09:08 -060019365 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019366 ASSERT_NO_FATAL_FAILURE(InitViewport());
19367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19368
19369 VkDescriptorPoolSize ds_type_count = {};
19370 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19371 ds_type_count.descriptorCount = 3;
19372
19373 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19374 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19375 ds_pool_ci.pNext = NULL;
19376 ds_pool_ci.maxSets = 1;
19377 ds_pool_ci.poolSizeCount = 1;
19378 ds_pool_ci.pPoolSizes = &ds_type_count;
19379
19380 VkDescriptorPool ds_pool;
19381 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19382 ASSERT_VK_SUCCESS(err);
19383
19384 const uint32_t BINDING_COUNT = 3;
19385 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019386 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019387 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19388 dsl_binding[0].descriptorCount = 1;
19389 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19390 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019391 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019392 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19393 dsl_binding[1].descriptorCount = 1;
19394 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19395 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019396 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019397 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19398 dsl_binding[2].descriptorCount = 1;
19399 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19400 dsl_binding[2].pImmutableSamplers = NULL;
19401
19402 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19403 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19404 ds_layout_ci.pNext = NULL;
19405 ds_layout_ci.bindingCount = BINDING_COUNT;
19406 ds_layout_ci.pBindings = dsl_binding;
19407 VkDescriptorSetLayout ds_layout;
19408 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19409 ASSERT_VK_SUCCESS(err);
19410
19411 VkDescriptorSet descriptor_set;
19412 VkDescriptorSetAllocateInfo alloc_info = {};
19413 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19414 alloc_info.descriptorSetCount = 1;
19415 alloc_info.descriptorPool = ds_pool;
19416 alloc_info.pSetLayouts = &ds_layout;
19417 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19418 ASSERT_VK_SUCCESS(err);
19419
19420 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19421 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19422 pipeline_layout_ci.pNext = NULL;
19423 pipeline_layout_ci.setLayoutCount = 1;
19424 pipeline_layout_ci.pSetLayouts = &ds_layout;
19425
19426 VkPipelineLayout pipeline_layout;
19427 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19428 ASSERT_VK_SUCCESS(err);
19429
19430 // Create two buffers to update the descriptors with
19431 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19432 uint32_t qfi = 0;
19433 VkBufferCreateInfo buffCI = {};
19434 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19435 buffCI.size = 2048;
19436 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19437 buffCI.queueFamilyIndexCount = 1;
19438 buffCI.pQueueFamilyIndices = &qfi;
19439
19440 VkBuffer dyub1;
19441 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19442 ASSERT_VK_SUCCESS(err);
19443 // buffer2
19444 buffCI.size = 1024;
19445 VkBuffer dyub2;
19446 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19447 ASSERT_VK_SUCCESS(err);
19448 // Allocate memory and bind to buffers
19449 VkMemoryAllocateInfo mem_alloc[2] = {};
19450 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19451 mem_alloc[0].pNext = NULL;
19452 mem_alloc[0].memoryTypeIndex = 0;
19453 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19454 mem_alloc[1].pNext = NULL;
19455 mem_alloc[1].memoryTypeIndex = 0;
19456
19457 VkMemoryRequirements mem_reqs1;
19458 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19459 VkMemoryRequirements mem_reqs2;
19460 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19461 mem_alloc[0].allocationSize = mem_reqs1.size;
19462 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19463 mem_alloc[1].allocationSize = mem_reqs2.size;
19464 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19465 if (!pass) {
19466 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19467 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19468 return;
19469 }
19470
19471 VkDeviceMemory mem1;
19472 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19473 ASSERT_VK_SUCCESS(err);
19474 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19475 ASSERT_VK_SUCCESS(err);
19476 VkDeviceMemory mem2;
19477 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19478 ASSERT_VK_SUCCESS(err);
19479 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19480 ASSERT_VK_SUCCESS(err);
19481 // Update descriptors
19482 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19483 buff_info[0].buffer = dyub1;
19484 buff_info[0].offset = 0;
19485 buff_info[0].range = 256;
19486 buff_info[1].buffer = dyub1;
19487 buff_info[1].offset = 256;
19488 buff_info[1].range = 512;
19489 buff_info[2].buffer = dyub2;
19490 buff_info[2].offset = 0;
19491 buff_info[2].range = 512;
19492
19493 VkWriteDescriptorSet descriptor_write;
19494 memset(&descriptor_write, 0, sizeof(descriptor_write));
19495 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19496 descriptor_write.dstSet = descriptor_set;
19497 descriptor_write.dstBinding = 0;
19498 descriptor_write.descriptorCount = BINDING_COUNT;
19499 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19500 descriptor_write.pBufferInfo = buff_info;
19501
19502 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19503
Tony Barbour552f6c02016-12-21 14:34:07 -070019504 m_commandBuffer->BeginCommandBuffer();
19505 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019506
19507 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019508 char const *vsSource =
19509 "#version 450\n"
19510 "\n"
19511 "out gl_PerVertex { \n"
19512 " vec4 gl_Position;\n"
19513 "};\n"
19514 "void main(){\n"
19515 " gl_Position = vec4(1);\n"
19516 "}\n";
19517 char const *fsSource =
19518 "#version 450\n"
19519 "\n"
19520 "layout(location=0) out vec4 x;\n"
19521 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19522 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19523 "void main(){\n"
19524 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19525 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019526 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19527 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19528 VkPipelineObj pipe(m_device);
19529 pipe.SetViewport(m_viewports);
19530 pipe.SetScissor(m_scissors);
19531 pipe.AddShader(&vs);
19532 pipe.AddShader(&fs);
19533 pipe.AddColorAttachment();
19534 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19535
19536 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19537 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19538 // we used to have a bug in this case.
19539 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19540 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19541 &descriptor_set, BINDING_COUNT, dyn_off);
19542 Draw(1, 0, 0, 0);
19543 m_errorMonitor->VerifyNotFound();
19544
19545 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19546 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19547 vkFreeMemory(m_device->device(), mem1, NULL);
19548 vkFreeMemory(m_device->device(), mem2, NULL);
19549
19550 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19551 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19552 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19553}
19554
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019555TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019556 TEST_DESCRIPTION(
19557 "Ensure that validations handling of non-coherent memory "
19558 "mapping while using VK_WHOLE_SIZE does not cause access "
19559 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019560 VkResult err;
19561 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019562 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019563
19564 VkDeviceMemory mem;
19565 VkMemoryRequirements mem_reqs;
19566 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019567 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019568 VkMemoryAllocateInfo alloc_info = {};
19569 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19570 alloc_info.pNext = NULL;
19571 alloc_info.memoryTypeIndex = 0;
19572
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019573 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019574 alloc_info.allocationSize = allocation_size;
19575
19576 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19577 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 -070019578 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019579 if (!pass) {
19580 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019581 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19582 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019583 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019584 pass = m_device->phy().set_memory_type(
19585 mem_reqs.memoryTypeBits, &alloc_info,
19586 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19587 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019588 if (!pass) {
19589 return;
19590 }
19591 }
19592 }
19593
19594 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19595 ASSERT_VK_SUCCESS(err);
19596
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019597 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019598 m_errorMonitor->ExpectSuccess();
19599 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19600 ASSERT_VK_SUCCESS(err);
19601 VkMappedMemoryRange mmr = {};
19602 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19603 mmr.memory = mem;
19604 mmr.offset = 0;
19605 mmr.size = VK_WHOLE_SIZE;
19606 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19607 ASSERT_VK_SUCCESS(err);
19608 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19609 ASSERT_VK_SUCCESS(err);
19610 m_errorMonitor->VerifyNotFound();
19611 vkUnmapMemory(m_device->device(), mem);
19612
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019613 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019614 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019615 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019616 ASSERT_VK_SUCCESS(err);
19617 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19618 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019619 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019620 mmr.size = VK_WHOLE_SIZE;
19621 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19622 ASSERT_VK_SUCCESS(err);
19623 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19624 ASSERT_VK_SUCCESS(err);
19625 m_errorMonitor->VerifyNotFound();
19626 vkUnmapMemory(m_device->device(), mem);
19627
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019628 // Map with offset and size
19629 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019630 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019631 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019632 ASSERT_VK_SUCCESS(err);
19633 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19634 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019635 mmr.offset = 4 * atom_size;
19636 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019637 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19638 ASSERT_VK_SUCCESS(err);
19639 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19640 ASSERT_VK_SUCCESS(err);
19641 m_errorMonitor->VerifyNotFound();
19642 vkUnmapMemory(m_device->device(), mem);
19643
19644 // Map without offset and flush WHOLE_SIZE with two separate offsets
19645 m_errorMonitor->ExpectSuccess();
19646 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19647 ASSERT_VK_SUCCESS(err);
19648 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19649 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019650 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019651 mmr.size = VK_WHOLE_SIZE;
19652 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19653 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019654 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019655 mmr.size = VK_WHOLE_SIZE;
19656 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19657 ASSERT_VK_SUCCESS(err);
19658 m_errorMonitor->VerifyNotFound();
19659 vkUnmapMemory(m_device->device(), mem);
19660
19661 vkFreeMemory(m_device->device(), mem, NULL);
19662}
19663
19664// This is a positive test. We used to expect error in this case but spec now allows it
19665TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19666 m_errorMonitor->ExpectSuccess();
19667 vk_testing::Fence testFence;
19668 VkFenceCreateInfo fenceInfo = {};
19669 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19670 fenceInfo.pNext = NULL;
19671
Tony Barbour1fa09702017-03-16 12:09:08 -060019672 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019673 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019674 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019675 VkResult result = vkResetFences(m_device->device(), 1, fences);
19676 ASSERT_VK_SUCCESS(result);
19677
19678 m_errorMonitor->VerifyNotFound();
19679}
19680
19681TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19682 m_errorMonitor->ExpectSuccess();
19683
Tony Barbour1fa09702017-03-16 12:09:08 -060019684 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019685 VkResult err;
19686
19687 // Record (empty!) command buffer that can be submitted multiple times
19688 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019689 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19690 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019691 m_commandBuffer->BeginCommandBuffer(&cbbi);
19692 m_commandBuffer->EndCommandBuffer();
19693
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019694 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019695 VkFence fence;
19696 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19697 ASSERT_VK_SUCCESS(err);
19698
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019699 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019700 VkSemaphore s1, s2;
19701 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19702 ASSERT_VK_SUCCESS(err);
19703 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19704 ASSERT_VK_SUCCESS(err);
19705
19706 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019707 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019708 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19709 ASSERT_VK_SUCCESS(err);
19710
19711 // Submit CB again, signaling s2.
19712 si.pSignalSemaphores = &s2;
19713 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19714 ASSERT_VK_SUCCESS(err);
19715
19716 // Wait for fence.
19717 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19718 ASSERT_VK_SUCCESS(err);
19719
19720 // CB is still in flight from second submission, but semaphore s1 is no
19721 // longer in flight. delete it.
19722 vkDestroySemaphore(m_device->device(), s1, nullptr);
19723
19724 m_errorMonitor->VerifyNotFound();
19725
19726 // Force device idle and clean up remaining objects
19727 vkDeviceWaitIdle(m_device->device());
19728 vkDestroySemaphore(m_device->device(), s2, nullptr);
19729 vkDestroyFence(m_device->device(), fence, nullptr);
19730}
19731
19732TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19733 m_errorMonitor->ExpectSuccess();
19734
Tony Barbour1fa09702017-03-16 12:09:08 -060019735 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019736 VkResult err;
19737
19738 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019739 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019740 VkFence f1;
19741 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19742 ASSERT_VK_SUCCESS(err);
19743
19744 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019745 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019746 VkFence f2;
19747 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19748 ASSERT_VK_SUCCESS(err);
19749
19750 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019751 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019752 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19753
19754 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019755 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019756 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19757
19758 // Should have both retired!
19759 vkDestroyFence(m_device->device(), f1, nullptr);
19760 vkDestroyFence(m_device->device(), f2, nullptr);
19761
19762 m_errorMonitor->VerifyNotFound();
19763}
19764
19765TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019766 TEST_DESCRIPTION(
19767 "Verify that creating an image view from an image with valid usage "
19768 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019769
Tony Barbour1fa09702017-03-16 12:09:08 -060019770 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019771
19772 m_errorMonitor->ExpectSuccess();
19773 // Verify that we can create a view with usage INPUT_ATTACHMENT
19774 VkImageObj image(m_device);
19775 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19776 ASSERT_TRUE(image.initialized());
19777 VkImageView imageView;
19778 VkImageViewCreateInfo ivci = {};
19779 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19780 ivci.image = image.handle();
19781 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19782 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19783 ivci.subresourceRange.layerCount = 1;
19784 ivci.subresourceRange.baseMipLevel = 0;
19785 ivci.subresourceRange.levelCount = 1;
19786 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19787
19788 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19789 m_errorMonitor->VerifyNotFound();
19790 vkDestroyImageView(m_device->device(), imageView, NULL);
19791}
19792
19793// This is a positive test. No failures are expected.
19794TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019795 TEST_DESCRIPTION(
19796 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19797 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019798
Tony Barbour1fa09702017-03-16 12:09:08 -060019799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019800
19801 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019802 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019803
19804 m_errorMonitor->ExpectSuccess();
19805
19806 VkImage image;
19807 VkImageCreateInfo image_create_info = {};
19808 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19809 image_create_info.pNext = NULL;
19810 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19811 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19812 image_create_info.extent.width = 64;
19813 image_create_info.extent.height = 64;
19814 image_create_info.extent.depth = 1;
19815 image_create_info.mipLevels = 1;
19816 image_create_info.arrayLayers = 1;
19817 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19818 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19819 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19820 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19821 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19822 ASSERT_VK_SUCCESS(err);
19823
19824 VkMemoryRequirements memory_reqs;
19825 VkDeviceMemory memory_one, memory_two;
19826 bool pass;
19827 VkMemoryAllocateInfo memory_info = {};
19828 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19829 memory_info.pNext = NULL;
19830 memory_info.allocationSize = 0;
19831 memory_info.memoryTypeIndex = 0;
19832 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19833 // Find an image big enough to allow sparse mapping of 2 memory regions
19834 // Increase the image size until it is at least twice the
19835 // size of the required alignment, to ensure we can bind both
19836 // allocated memory blocks to the image on aligned offsets.
19837 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19838 vkDestroyImage(m_device->device(), image, nullptr);
19839 image_create_info.extent.width *= 2;
19840 image_create_info.extent.height *= 2;
19841 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19842 ASSERT_VK_SUCCESS(err);
19843 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19844 }
19845 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19846 // at the end of the first
19847 memory_info.allocationSize = memory_reqs.alignment;
19848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19849 ASSERT_TRUE(pass);
19850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19851 ASSERT_VK_SUCCESS(err);
19852 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19853 ASSERT_VK_SUCCESS(err);
19854 VkSparseMemoryBind binds[2];
19855 binds[0].flags = 0;
19856 binds[0].memory = memory_one;
19857 binds[0].memoryOffset = 0;
19858 binds[0].resourceOffset = 0;
19859 binds[0].size = memory_info.allocationSize;
19860 binds[1].flags = 0;
19861 binds[1].memory = memory_two;
19862 binds[1].memoryOffset = 0;
19863 binds[1].resourceOffset = memory_info.allocationSize;
19864 binds[1].size = memory_info.allocationSize;
19865
19866 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19867 opaqueBindInfo.image = image;
19868 opaqueBindInfo.bindCount = 2;
19869 opaqueBindInfo.pBinds = binds;
19870
19871 VkFence fence = VK_NULL_HANDLE;
19872 VkBindSparseInfo bindSparseInfo = {};
19873 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19874 bindSparseInfo.imageOpaqueBindCount = 1;
19875 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19876
19877 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19878 vkQueueWaitIdle(m_device->m_queue);
19879 vkDestroyImage(m_device->device(), image, NULL);
19880 vkFreeMemory(m_device->device(), memory_one, NULL);
19881 vkFreeMemory(m_device->device(), memory_two, NULL);
19882 m_errorMonitor->VerifyNotFound();
19883}
19884
19885TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019886 TEST_DESCRIPTION(
19887 "Ensure that CmdBeginRenderPass with an attachment's "
19888 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19889 "the command buffer has prior knowledge of that "
19890 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019891
19892 m_errorMonitor->ExpectSuccess();
19893
Tony Barbour1fa09702017-03-16 12:09:08 -060019894 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019895
19896 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019897 VkAttachmentDescription attachment = {0,
19898 VK_FORMAT_R8G8B8A8_UNORM,
19899 VK_SAMPLE_COUNT_1_BIT,
19900 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19901 VK_ATTACHMENT_STORE_OP_STORE,
19902 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19903 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19904 VK_IMAGE_LAYOUT_UNDEFINED,
19905 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019906
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019907 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019908
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019909 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019910
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019911 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019912
19913 VkRenderPass rp;
19914 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19915 ASSERT_VK_SUCCESS(err);
19916
19917 // A compatible framebuffer.
19918 VkImageObj image(m_device);
19919 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19920 ASSERT_TRUE(image.initialized());
19921
19922 VkImageViewCreateInfo ivci = {
19923 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19924 nullptr,
19925 0,
19926 image.handle(),
19927 VK_IMAGE_VIEW_TYPE_2D,
19928 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019929 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19930 VK_COMPONENT_SWIZZLE_IDENTITY},
19931 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019932 };
19933 VkImageView view;
19934 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19935 ASSERT_VK_SUCCESS(err);
19936
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019937 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019938 VkFramebuffer fb;
19939 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19940 ASSERT_VK_SUCCESS(err);
19941
19942 // Record a single command buffer which uses this renderpass twice. The
19943 // bug is triggered at the beginning of the second renderpass, when the
19944 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019945 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 -070019946 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019947 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19948 vkCmdEndRenderPass(m_commandBuffer->handle());
19949 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19950
19951 m_errorMonitor->VerifyNotFound();
19952
19953 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019954 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019955
19956 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19957 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19958 vkDestroyImageView(m_device->device(), view, nullptr);
19959}
19960
19961TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019962 TEST_DESCRIPTION(
19963 "This test should pass. Create a Framebuffer and "
19964 "command buffer, bind them together, then destroy "
19965 "command pool and framebuffer and verify there are no "
19966 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019967
19968 m_errorMonitor->ExpectSuccess();
19969
Tony Barbour1fa09702017-03-16 12:09:08 -060019970 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019971
19972 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019973 VkAttachmentDescription attachment = {0,
19974 VK_FORMAT_R8G8B8A8_UNORM,
19975 VK_SAMPLE_COUNT_1_BIT,
19976 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19977 VK_ATTACHMENT_STORE_OP_STORE,
19978 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19979 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19980 VK_IMAGE_LAYOUT_UNDEFINED,
19981 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019982
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019983 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019984
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019985 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019986
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019987 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019988
19989 VkRenderPass rp;
19990 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19991 ASSERT_VK_SUCCESS(err);
19992
19993 // A compatible framebuffer.
19994 VkImageObj image(m_device);
19995 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19996 ASSERT_TRUE(image.initialized());
19997
19998 VkImageViewCreateInfo ivci = {
19999 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20000 nullptr,
20001 0,
20002 image.handle(),
20003 VK_IMAGE_VIEW_TYPE_2D,
20004 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020005 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20006 VK_COMPONENT_SWIZZLE_IDENTITY},
20007 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020008 };
20009 VkImageView view;
20010 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20011 ASSERT_VK_SUCCESS(err);
20012
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020013 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020014 VkFramebuffer fb;
20015 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20016 ASSERT_VK_SUCCESS(err);
20017
20018 // Explicitly create a command buffer to bind the FB to so that we can then
20019 // destroy the command pool in order to implicitly free command buffer
20020 VkCommandPool command_pool;
20021 VkCommandPoolCreateInfo pool_create_info{};
20022 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20023 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20024 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20025 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20026
20027 VkCommandBuffer command_buffer;
20028 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20029 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20030 command_buffer_allocate_info.commandPool = command_pool;
20031 command_buffer_allocate_info.commandBufferCount = 1;
20032 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20033 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20034
20035 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020036 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 -060020037 VkCommandBufferBeginInfo begin_info{};
20038 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20039 vkBeginCommandBuffer(command_buffer, &begin_info);
20040
20041 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20042 vkCmdEndRenderPass(command_buffer);
20043 vkEndCommandBuffer(command_buffer);
20044 vkDestroyImageView(m_device->device(), view, nullptr);
20045 // Destroy command pool to implicitly free command buffer
20046 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20047 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20048 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20049 m_errorMonitor->VerifyNotFound();
20050}
20051
20052TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020053 TEST_DESCRIPTION(
20054 "Ensure that CmdBeginRenderPass applies the layout "
20055 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020056
20057 m_errorMonitor->ExpectSuccess();
20058
Tony Barbour1fa09702017-03-16 12:09:08 -060020059 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020060
20061 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020062 VkAttachmentDescription attachment = {0,
20063 VK_FORMAT_R8G8B8A8_UNORM,
20064 VK_SAMPLE_COUNT_1_BIT,
20065 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20066 VK_ATTACHMENT_STORE_OP_STORE,
20067 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20068 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20069 VK_IMAGE_LAYOUT_UNDEFINED,
20070 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020071
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020072 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020073
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020074 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020075
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020076 VkSubpassDependency dep = {0,
20077 0,
20078 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20079 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20080 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20081 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20082 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020083
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020084 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020085
20086 VkResult err;
20087 VkRenderPass rp;
20088 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20089 ASSERT_VK_SUCCESS(err);
20090
20091 // A compatible framebuffer.
20092 VkImageObj image(m_device);
20093 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20094 ASSERT_TRUE(image.initialized());
20095
20096 VkImageViewCreateInfo ivci = {
20097 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20098 nullptr,
20099 0,
20100 image.handle(),
20101 VK_IMAGE_VIEW_TYPE_2D,
20102 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020103 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20104 VK_COMPONENT_SWIZZLE_IDENTITY},
20105 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020106 };
20107 VkImageView view;
20108 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20109 ASSERT_VK_SUCCESS(err);
20110
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020111 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020112 VkFramebuffer fb;
20113 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20114 ASSERT_VK_SUCCESS(err);
20115
20116 // Record a single command buffer which issues a pipeline barrier w/
20117 // image memory barrier for the attachment. This detects the previously
20118 // missing tracking of the subpass layout by throwing a validation error
20119 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020120 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 -070020121 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020122 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20123
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020124 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20125 nullptr,
20126 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20127 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20128 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20129 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20130 VK_QUEUE_FAMILY_IGNORED,
20131 VK_QUEUE_FAMILY_IGNORED,
20132 image.handle(),
20133 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020134 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020135 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20136 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020137
20138 vkCmdEndRenderPass(m_commandBuffer->handle());
20139 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020140 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020141
20142 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20143 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20144 vkDestroyImageView(m_device->device(), view, nullptr);
20145}
20146
20147TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020148 TEST_DESCRIPTION(
20149 "Validate that when an imageView of a depth/stencil image "
20150 "is used as a depth/stencil framebuffer attachment, the "
20151 "aspectMask is ignored and both depth and stencil image "
20152 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020153
Tony Barbour1fa09702017-03-16 12:09:08 -060020154 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020155 VkFormatProperties format_properties;
20156 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20157 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20158 return;
20159 }
20160
20161 m_errorMonitor->ExpectSuccess();
20162
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020163 VkAttachmentDescription attachment = {0,
20164 VK_FORMAT_D32_SFLOAT_S8_UINT,
20165 VK_SAMPLE_COUNT_1_BIT,
20166 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20167 VK_ATTACHMENT_STORE_OP_STORE,
20168 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20169 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20170 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20171 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020172
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020173 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020174
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020175 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020176
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020177 VkSubpassDependency dep = {0,
20178 0,
20179 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20180 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20181 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20182 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20183 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020184
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020185 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020186
20187 VkResult err;
20188 VkRenderPass rp;
20189 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20190 ASSERT_VK_SUCCESS(err);
20191
20192 VkImageObj image(m_device);
20193 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020194 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020195 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020196 ASSERT_TRUE(image.initialized());
20197 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20198
20199 VkImageViewCreateInfo ivci = {
20200 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20201 nullptr,
20202 0,
20203 image.handle(),
20204 VK_IMAGE_VIEW_TYPE_2D,
20205 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020206 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20207 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020208 };
20209 VkImageView view;
20210 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20211 ASSERT_VK_SUCCESS(err);
20212
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020213 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020214 VkFramebuffer fb;
20215 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20216 ASSERT_VK_SUCCESS(err);
20217
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020218 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 -070020219 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020220 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20221
20222 VkImageMemoryBarrier imb = {};
20223 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20224 imb.pNext = nullptr;
20225 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20226 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20227 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20228 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20229 imb.srcQueueFamilyIndex = 0;
20230 imb.dstQueueFamilyIndex = 0;
20231 imb.image = image.handle();
20232 imb.subresourceRange.aspectMask = 0x6;
20233 imb.subresourceRange.baseMipLevel = 0;
20234 imb.subresourceRange.levelCount = 0x1;
20235 imb.subresourceRange.baseArrayLayer = 0;
20236 imb.subresourceRange.layerCount = 0x1;
20237
20238 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020239 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20240 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020241
20242 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020243 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020244 QueueCommandBuffer(false);
20245 m_errorMonitor->VerifyNotFound();
20246
20247 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20248 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20249 vkDestroyImageView(m_device->device(), view, nullptr);
20250}
20251
20252TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020253 TEST_DESCRIPTION(
20254 "Ensure that layout transitions work correctly without "
20255 "errors, when an attachment reference is "
20256 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020257
20258 m_errorMonitor->ExpectSuccess();
20259
Tony Barbour1fa09702017-03-16 12:09:08 -060020260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020261
20262 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020263 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020264
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020265 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020266
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020267 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020268
20269 VkRenderPass rp;
20270 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20271 ASSERT_VK_SUCCESS(err);
20272
20273 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020274 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020275 VkFramebuffer fb;
20276 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20277 ASSERT_VK_SUCCESS(err);
20278
20279 // Record a command buffer which just begins and ends the renderpass. The
20280 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020281 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 -070020282 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020283 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20284 vkCmdEndRenderPass(m_commandBuffer->handle());
20285 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020286 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020287
20288 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20289 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20290}
20291
20292// This is a positive test. No errors are expected.
20293TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020294 TEST_DESCRIPTION(
20295 "Create a stencil-only attachment with a LOAD_OP set to "
20296 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020297 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020298 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070020299 auto depth_format = find_depth_stencil_format(m_device);
20300 if (!depth_format) {
20301 printf(" No Depth + Stencil format found. Skipped.\n");
20302 return;
20303 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020304 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020305 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020306 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20307 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020308 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20309 return;
20310 }
20311
Tony Barbourf887b162017-03-09 10:06:46 -070020312 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020313 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020314 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020315 VkAttachmentDescription att = {};
20316 VkAttachmentReference ref = {};
20317 att.format = depth_stencil_fmt;
20318 att.samples = VK_SAMPLE_COUNT_1_BIT;
20319 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20320 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20321 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20322 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20323 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20324 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20325
20326 VkClearValue clear;
20327 clear.depthStencil.depth = 1.0;
20328 clear.depthStencil.stencil = 0;
20329 ref.attachment = 0;
20330 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20331
20332 VkSubpassDescription subpass = {};
20333 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20334 subpass.flags = 0;
20335 subpass.inputAttachmentCount = 0;
20336 subpass.pInputAttachments = NULL;
20337 subpass.colorAttachmentCount = 0;
20338 subpass.pColorAttachments = NULL;
20339 subpass.pResolveAttachments = NULL;
20340 subpass.pDepthStencilAttachment = &ref;
20341 subpass.preserveAttachmentCount = 0;
20342 subpass.pPreserveAttachments = NULL;
20343
20344 VkRenderPass rp;
20345 VkRenderPassCreateInfo rp_info = {};
20346 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20347 rp_info.attachmentCount = 1;
20348 rp_info.pAttachments = &att;
20349 rp_info.subpassCount = 1;
20350 rp_info.pSubpasses = &subpass;
20351 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20352 ASSERT_VK_SUCCESS(result);
20353
20354 VkImageView *depthView = m_depthStencil->BindInfo();
20355 VkFramebufferCreateInfo fb_info = {};
20356 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20357 fb_info.pNext = NULL;
20358 fb_info.renderPass = rp;
20359 fb_info.attachmentCount = 1;
20360 fb_info.pAttachments = depthView;
20361 fb_info.width = 100;
20362 fb_info.height = 100;
20363 fb_info.layers = 1;
20364 VkFramebuffer fb;
20365 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20366 ASSERT_VK_SUCCESS(result);
20367
20368 VkRenderPassBeginInfo rpbinfo = {};
20369 rpbinfo.clearValueCount = 1;
20370 rpbinfo.pClearValues = &clear;
20371 rpbinfo.pNext = NULL;
20372 rpbinfo.renderPass = rp;
20373 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20374 rpbinfo.renderArea.extent.width = 100;
20375 rpbinfo.renderArea.extent.height = 100;
20376 rpbinfo.renderArea.offset.x = 0;
20377 rpbinfo.renderArea.offset.y = 0;
20378 rpbinfo.framebuffer = fb;
20379
20380 VkFence fence = {};
20381 VkFenceCreateInfo fence_ci = {};
20382 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20383 fence_ci.pNext = nullptr;
20384 fence_ci.flags = 0;
20385 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20386 ASSERT_VK_SUCCESS(result);
20387
20388 m_commandBuffer->BeginCommandBuffer();
20389 m_commandBuffer->BeginRenderPass(rpbinfo);
20390 m_commandBuffer->EndRenderPass();
20391 m_commandBuffer->EndCommandBuffer();
20392 m_commandBuffer->QueueCommandBuffer(fence);
20393
20394 VkImageObj destImage(m_device);
20395 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 -070020396 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020397 VkImageMemoryBarrier barrier = {};
20398 VkImageSubresourceRange range;
20399 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20400 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20401 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20402 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20403 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20404 barrier.image = m_depthStencil->handle();
20405 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20406 range.baseMipLevel = 0;
20407 range.levelCount = 1;
20408 range.baseArrayLayer = 0;
20409 range.layerCount = 1;
20410 barrier.subresourceRange = range;
20411 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20412 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20413 cmdbuf.BeginCommandBuffer();
20414 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 -070020415 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020416 barrier.srcAccessMask = 0;
20417 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20418 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20419 barrier.image = destImage.handle();
20420 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20421 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 -070020422 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020423 VkImageCopy cregion;
20424 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20425 cregion.srcSubresource.mipLevel = 0;
20426 cregion.srcSubresource.baseArrayLayer = 0;
20427 cregion.srcSubresource.layerCount = 1;
20428 cregion.srcOffset.x = 0;
20429 cregion.srcOffset.y = 0;
20430 cregion.srcOffset.z = 0;
20431 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20432 cregion.dstSubresource.mipLevel = 0;
20433 cregion.dstSubresource.baseArrayLayer = 0;
20434 cregion.dstSubresource.layerCount = 1;
20435 cregion.dstOffset.x = 0;
20436 cregion.dstOffset.y = 0;
20437 cregion.dstOffset.z = 0;
20438 cregion.extent.width = 100;
20439 cregion.extent.height = 100;
20440 cregion.extent.depth = 1;
20441 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020442 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020443 cmdbuf.EndCommandBuffer();
20444
20445 VkSubmitInfo submit_info;
20446 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20447 submit_info.pNext = NULL;
20448 submit_info.waitSemaphoreCount = 0;
20449 submit_info.pWaitSemaphores = NULL;
20450 submit_info.pWaitDstStageMask = NULL;
20451 submit_info.commandBufferCount = 1;
20452 submit_info.pCommandBuffers = &cmdbuf.handle();
20453 submit_info.signalSemaphoreCount = 0;
20454 submit_info.pSignalSemaphores = NULL;
20455
20456 m_errorMonitor->ExpectSuccess();
20457 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20458 m_errorMonitor->VerifyNotFound();
20459
20460 vkQueueWaitIdle(m_device->m_queue);
20461 vkDestroyFence(m_device->device(), fence, nullptr);
20462 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20463 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20464}
20465
20466// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020467TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20468 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20469
20470 m_errorMonitor->ExpectSuccess();
20471
Tony Barbour1fa09702017-03-16 12:09:08 -060020472 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblene4e225d2017-03-07 23:15:43 -070020473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20474
20475 VkImageMemoryBarrier img_barrier = {};
20476 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20477 img_barrier.pNext = NULL;
20478 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20479 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20480 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20481 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20482 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20483 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20484 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20485 img_barrier.subresourceRange.baseArrayLayer = 0;
20486 img_barrier.subresourceRange.baseMipLevel = 0;
20487 img_barrier.subresourceRange.layerCount = 1;
20488 img_barrier.subresourceRange.levelCount = 1;
20489
20490 {
20491 VkImageObj img_color(m_device);
20492 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20493 ASSERT_TRUE(img_color.initialized());
20494
20495 VkImageObj img_ds1(m_device);
20496 img_ds1.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20497 ASSERT_TRUE(img_ds1.initialized());
20498
20499 VkImageObj img_ds2(m_device);
20500 img_ds2.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20501 ASSERT_TRUE(img_ds2.initialized());
20502
20503 VkImageObj img_xfer_src(m_device);
20504 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20505 ASSERT_TRUE(img_xfer_src.initialized());
20506
20507 VkImageObj img_xfer_dst(m_device);
20508 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20509 ASSERT_TRUE(img_xfer_dst.initialized());
20510
20511 VkImageObj img_sampled(m_device);
20512 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20513 ASSERT_TRUE(img_sampled.initialized());
20514
20515 VkImageObj img_input(m_device);
20516 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20517 ASSERT_TRUE(img_input.initialized());
20518
20519 const struct {
20520 VkImageObj &image_obj;
20521 VkImageLayout old_layout;
20522 VkImageLayout new_layout;
20523 } buffer_layouts[] = {
20524 // clang-format off
20525 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20526 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20527 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20528 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20529 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20530 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20531 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20532 // clang-format on
20533 };
20534 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20535
20536 m_commandBuffer->BeginCommandBuffer();
20537 for (uint32_t i = 0; i < layout_count; ++i) {
20538 img_barrier.image = buffer_layouts[i].image_obj.handle();
20539 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20540 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20541 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20542 : VK_IMAGE_ASPECT_COLOR_BIT;
20543
20544 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20545 img_barrier.newLayout = buffer_layouts[i].new_layout;
20546 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20547 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20548
20549 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20550 img_barrier.newLayout = buffer_layouts[i].old_layout;
20551 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20552 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20553 }
20554 m_commandBuffer->EndCommandBuffer();
20555
20556 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20557 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20558 }
20559 m_errorMonitor->VerifyNotFound();
20560}
20561
20562// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020563TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20564 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20565
20566 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020567 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020568
20569 VkEvent event;
20570 VkEventCreateInfo event_create_info{};
20571 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20572 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20573
20574 VkCommandPool command_pool;
20575 VkCommandPoolCreateInfo pool_create_info{};
20576 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20577 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20578 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20579 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20580
20581 VkCommandBuffer command_buffer;
20582 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20583 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20584 command_buffer_allocate_info.commandPool = command_pool;
20585 command_buffer_allocate_info.commandBufferCount = 1;
20586 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20587 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20588
20589 VkQueue queue = VK_NULL_HANDLE;
20590 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20591
20592 {
20593 VkCommandBufferBeginInfo begin_info{};
20594 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20595 vkBeginCommandBuffer(command_buffer, &begin_info);
20596
20597 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 -070020598 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020599 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20600 vkEndCommandBuffer(command_buffer);
20601 }
20602 {
20603 VkSubmitInfo submit_info{};
20604 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20605 submit_info.commandBufferCount = 1;
20606 submit_info.pCommandBuffers = &command_buffer;
20607 submit_info.signalSemaphoreCount = 0;
20608 submit_info.pSignalSemaphores = nullptr;
20609 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20610 }
20611 { vkSetEvent(m_device->device(), event); }
20612
20613 vkQueueWaitIdle(queue);
20614
20615 vkDestroyEvent(m_device->device(), event, nullptr);
20616 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20617 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20618
20619 m_errorMonitor->VerifyNotFound();
20620}
20621// This is a positive test. No errors should be generated.
20622TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20623 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20624
Tony Barbour1fa09702017-03-16 12:09:08 -060020625 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020626 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020627
20628 m_errorMonitor->ExpectSuccess();
20629
20630 VkQueryPool query_pool;
20631 VkQueryPoolCreateInfo query_pool_create_info{};
20632 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20633 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20634 query_pool_create_info.queryCount = 1;
20635 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20636
20637 VkCommandPool command_pool;
20638 VkCommandPoolCreateInfo pool_create_info{};
20639 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20640 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20641 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20642 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20643
20644 VkCommandBuffer command_buffer;
20645 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20646 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20647 command_buffer_allocate_info.commandPool = command_pool;
20648 command_buffer_allocate_info.commandBufferCount = 1;
20649 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20650 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20651
20652 VkCommandBuffer secondary_command_buffer;
20653 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20654 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20655
20656 VkQueue queue = VK_NULL_HANDLE;
20657 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20658
20659 uint32_t qfi = 0;
20660 VkBufferCreateInfo buff_create_info = {};
20661 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20662 buff_create_info.size = 1024;
20663 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20664 buff_create_info.queueFamilyIndexCount = 1;
20665 buff_create_info.pQueueFamilyIndices = &qfi;
20666
20667 VkResult err;
20668 VkBuffer buffer;
20669 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20670 ASSERT_VK_SUCCESS(err);
20671 VkMemoryAllocateInfo mem_alloc = {};
20672 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20673 mem_alloc.pNext = NULL;
20674 mem_alloc.allocationSize = 1024;
20675 mem_alloc.memoryTypeIndex = 0;
20676
20677 VkMemoryRequirements memReqs;
20678 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20679 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20680 if (!pass) {
20681 vkDestroyBuffer(m_device->device(), buffer, NULL);
20682 return;
20683 }
20684
20685 VkDeviceMemory mem;
20686 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20687 ASSERT_VK_SUCCESS(err);
20688 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20689 ASSERT_VK_SUCCESS(err);
20690
20691 VkCommandBufferInheritanceInfo hinfo = {};
20692 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20693 hinfo.renderPass = VK_NULL_HANDLE;
20694 hinfo.subpass = 0;
20695 hinfo.framebuffer = VK_NULL_HANDLE;
20696 hinfo.occlusionQueryEnable = VK_FALSE;
20697 hinfo.queryFlags = 0;
20698 hinfo.pipelineStatistics = 0;
20699
20700 {
20701 VkCommandBufferBeginInfo begin_info{};
20702 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20703 begin_info.pInheritanceInfo = &hinfo;
20704 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20705
20706 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20707 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20708
20709 vkEndCommandBuffer(secondary_command_buffer);
20710
20711 begin_info.pInheritanceInfo = nullptr;
20712 vkBeginCommandBuffer(command_buffer, &begin_info);
20713
20714 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20715 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20716
20717 vkEndCommandBuffer(command_buffer);
20718 }
20719 {
20720 VkSubmitInfo submit_info{};
20721 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20722 submit_info.commandBufferCount = 1;
20723 submit_info.pCommandBuffers = &command_buffer;
20724 submit_info.signalSemaphoreCount = 0;
20725 submit_info.pSignalSemaphores = nullptr;
20726 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20727 }
20728
20729 vkQueueWaitIdle(queue);
20730
20731 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20732 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20733 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20734 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20735 vkDestroyBuffer(m_device->device(), buffer, NULL);
20736 vkFreeMemory(m_device->device(), mem, NULL);
20737
20738 m_errorMonitor->VerifyNotFound();
20739}
20740
20741// This is a positive test. No errors should be generated.
20742TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20743 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20744
Tony Barbour1fa09702017-03-16 12:09:08 -060020745 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020746 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020747
20748 m_errorMonitor->ExpectSuccess();
20749
20750 VkQueryPool query_pool;
20751 VkQueryPoolCreateInfo query_pool_create_info{};
20752 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20753 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20754 query_pool_create_info.queryCount = 1;
20755 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20756
20757 VkCommandPool command_pool;
20758 VkCommandPoolCreateInfo pool_create_info{};
20759 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20760 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20761 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20762 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20763
20764 VkCommandBuffer command_buffer[2];
20765 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20766 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20767 command_buffer_allocate_info.commandPool = command_pool;
20768 command_buffer_allocate_info.commandBufferCount = 2;
20769 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20770 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20771
20772 VkQueue queue = VK_NULL_HANDLE;
20773 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20774
20775 uint32_t qfi = 0;
20776 VkBufferCreateInfo buff_create_info = {};
20777 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20778 buff_create_info.size = 1024;
20779 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20780 buff_create_info.queueFamilyIndexCount = 1;
20781 buff_create_info.pQueueFamilyIndices = &qfi;
20782
20783 VkResult err;
20784 VkBuffer buffer;
20785 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20786 ASSERT_VK_SUCCESS(err);
20787 VkMemoryAllocateInfo mem_alloc = {};
20788 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20789 mem_alloc.pNext = NULL;
20790 mem_alloc.allocationSize = 1024;
20791 mem_alloc.memoryTypeIndex = 0;
20792
20793 VkMemoryRequirements memReqs;
20794 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20795 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20796 if (!pass) {
20797 vkDestroyBuffer(m_device->device(), buffer, NULL);
20798 return;
20799 }
20800
20801 VkDeviceMemory mem;
20802 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20803 ASSERT_VK_SUCCESS(err);
20804 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20805 ASSERT_VK_SUCCESS(err);
20806
20807 {
20808 VkCommandBufferBeginInfo begin_info{};
20809 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20810 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20811
20812 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20813 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20814
20815 vkEndCommandBuffer(command_buffer[0]);
20816
20817 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20818
20819 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20820
20821 vkEndCommandBuffer(command_buffer[1]);
20822 }
20823 {
20824 VkSubmitInfo submit_info{};
20825 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20826 submit_info.commandBufferCount = 2;
20827 submit_info.pCommandBuffers = command_buffer;
20828 submit_info.signalSemaphoreCount = 0;
20829 submit_info.pSignalSemaphores = nullptr;
20830 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20831 }
20832
20833 vkQueueWaitIdle(queue);
20834
20835 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20836 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20837 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20838 vkDestroyBuffer(m_device->device(), buffer, NULL);
20839 vkFreeMemory(m_device->device(), mem, NULL);
20840
20841 m_errorMonitor->VerifyNotFound();
20842}
20843
Tony Barbourc46924f2016-11-04 11:49:52 -060020844TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020845 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20846
Tony Barbour1fa09702017-03-16 12:09:08 -060020847 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020848 VkEvent event;
20849 VkEventCreateInfo event_create_info{};
20850 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20851 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20852
20853 VkCommandPool command_pool;
20854 VkCommandPoolCreateInfo pool_create_info{};
20855 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20856 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20857 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20858 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20859
20860 VkCommandBuffer command_buffer;
20861 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20862 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20863 command_buffer_allocate_info.commandPool = command_pool;
20864 command_buffer_allocate_info.commandBufferCount = 1;
20865 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20866 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20867
20868 VkQueue queue = VK_NULL_HANDLE;
20869 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20870
20871 {
20872 VkCommandBufferBeginInfo begin_info{};
20873 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20874 vkBeginCommandBuffer(command_buffer, &begin_info);
20875
20876 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020877 vkEndCommandBuffer(command_buffer);
20878 }
20879 {
20880 VkSubmitInfo submit_info{};
20881 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20882 submit_info.commandBufferCount = 1;
20883 submit_info.pCommandBuffers = &command_buffer;
20884 submit_info.signalSemaphoreCount = 0;
20885 submit_info.pSignalSemaphores = nullptr;
20886 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20887 }
20888 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20890 "that is already in use by a "
20891 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020892 vkSetEvent(m_device->device(), event);
20893 m_errorMonitor->VerifyFound();
20894 }
20895
20896 vkQueueWaitIdle(queue);
20897
20898 vkDestroyEvent(m_device->device(), event, nullptr);
20899 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20900 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20901}
20902
20903// This is a positive test. No errors should be generated.
20904TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020905 TEST_DESCRIPTION(
20906 "Two command buffers with two separate fences are each "
20907 "run through a Submit & WaitForFences cycle 3 times. This "
20908 "previously revealed a bug so running this positive test "
20909 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020910 m_errorMonitor->ExpectSuccess();
20911
Tony Barbour1fa09702017-03-16 12:09:08 -060020912 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020913 VkQueue queue = VK_NULL_HANDLE;
20914 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20915
20916 static const uint32_t NUM_OBJECTS = 2;
20917 static const uint32_t NUM_FRAMES = 3;
20918 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20919 VkFence fences[NUM_OBJECTS] = {};
20920
20921 VkCommandPool cmd_pool;
20922 VkCommandPoolCreateInfo cmd_pool_ci = {};
20923 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20924 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20925 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20926 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20927 ASSERT_VK_SUCCESS(err);
20928
20929 VkCommandBufferAllocateInfo cmd_buf_info = {};
20930 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20931 cmd_buf_info.commandPool = cmd_pool;
20932 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20933 cmd_buf_info.commandBufferCount = 1;
20934
20935 VkFenceCreateInfo fence_ci = {};
20936 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20937 fence_ci.pNext = nullptr;
20938 fence_ci.flags = 0;
20939
20940 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20941 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20942 ASSERT_VK_SUCCESS(err);
20943 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20944 ASSERT_VK_SUCCESS(err);
20945 }
20946
20947 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20948 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20949 // Create empty cmd buffer
20950 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20951 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20952
20953 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20954 ASSERT_VK_SUCCESS(err);
20955 err = vkEndCommandBuffer(cmd_buffers[obj]);
20956 ASSERT_VK_SUCCESS(err);
20957
20958 VkSubmitInfo submit_info = {};
20959 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20960 submit_info.commandBufferCount = 1;
20961 submit_info.pCommandBuffers = &cmd_buffers[obj];
20962 // Submit cmd buffer and wait for fence
20963 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20964 ASSERT_VK_SUCCESS(err);
20965 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20966 ASSERT_VK_SUCCESS(err);
20967 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20968 ASSERT_VK_SUCCESS(err);
20969 }
20970 }
20971 m_errorMonitor->VerifyNotFound();
20972 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20973 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20974 vkDestroyFence(m_device->device(), fences[i], nullptr);
20975 }
20976}
20977// This is a positive test. No errors should be generated.
20978TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020979 TEST_DESCRIPTION(
20980 "Two command buffers, each in a separate QueueSubmit call "
20981 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020982
Tony Barbour1fa09702017-03-16 12:09:08 -060020983 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020984 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020985
20986 m_errorMonitor->ExpectSuccess();
20987
20988 VkSemaphore semaphore;
20989 VkSemaphoreCreateInfo semaphore_create_info{};
20990 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20991 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20992
20993 VkCommandPool command_pool;
20994 VkCommandPoolCreateInfo pool_create_info{};
20995 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20996 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20997 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20998 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20999
21000 VkCommandBuffer command_buffer[2];
21001 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21002 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21003 command_buffer_allocate_info.commandPool = command_pool;
21004 command_buffer_allocate_info.commandBufferCount = 2;
21005 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21006 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21007
21008 VkQueue queue = VK_NULL_HANDLE;
21009 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21010
21011 {
21012 VkCommandBufferBeginInfo begin_info{};
21013 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21014 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21015
21016 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 -070021017 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021018
21019 VkViewport viewport{};
21020 viewport.maxDepth = 1.0f;
21021 viewport.minDepth = 0.0f;
21022 viewport.width = 512;
21023 viewport.height = 512;
21024 viewport.x = 0;
21025 viewport.y = 0;
21026 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21027 vkEndCommandBuffer(command_buffer[0]);
21028 }
21029 {
21030 VkCommandBufferBeginInfo begin_info{};
21031 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21032 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21033
21034 VkViewport viewport{};
21035 viewport.maxDepth = 1.0f;
21036 viewport.minDepth = 0.0f;
21037 viewport.width = 512;
21038 viewport.height = 512;
21039 viewport.x = 0;
21040 viewport.y = 0;
21041 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21042 vkEndCommandBuffer(command_buffer[1]);
21043 }
21044 {
21045 VkSubmitInfo submit_info{};
21046 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21047 submit_info.commandBufferCount = 1;
21048 submit_info.pCommandBuffers = &command_buffer[0];
21049 submit_info.signalSemaphoreCount = 1;
21050 submit_info.pSignalSemaphores = &semaphore;
21051 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21052 }
21053 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021054 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021055 VkSubmitInfo submit_info{};
21056 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21057 submit_info.commandBufferCount = 1;
21058 submit_info.pCommandBuffers = &command_buffer[1];
21059 submit_info.waitSemaphoreCount = 1;
21060 submit_info.pWaitSemaphores = &semaphore;
21061 submit_info.pWaitDstStageMask = flags;
21062 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21063 }
21064
21065 vkQueueWaitIdle(m_device->m_queue);
21066
21067 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21068 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21069 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21070
21071 m_errorMonitor->VerifyNotFound();
21072}
21073
21074// This is a positive test. No errors should be generated.
21075TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021076 TEST_DESCRIPTION(
21077 "Two command buffers, each in a separate QueueSubmit call "
21078 "submitted on separate queues, the second having a fence"
21079 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021080
Tony Barbour1fa09702017-03-16 12:09:08 -060021081 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021082 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021083
21084 m_errorMonitor->ExpectSuccess();
21085
21086 VkFence fence;
21087 VkFenceCreateInfo fence_create_info{};
21088 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21089 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21090
21091 VkSemaphore semaphore;
21092 VkSemaphoreCreateInfo semaphore_create_info{};
21093 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21094 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21095
21096 VkCommandPool command_pool;
21097 VkCommandPoolCreateInfo pool_create_info{};
21098 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21099 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21100 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21101 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21102
21103 VkCommandBuffer command_buffer[2];
21104 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21105 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21106 command_buffer_allocate_info.commandPool = command_pool;
21107 command_buffer_allocate_info.commandBufferCount = 2;
21108 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21109 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21110
21111 VkQueue queue = VK_NULL_HANDLE;
21112 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21113
21114 {
21115 VkCommandBufferBeginInfo begin_info{};
21116 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21117 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21118
21119 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 -070021120 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021121
21122 VkViewport viewport{};
21123 viewport.maxDepth = 1.0f;
21124 viewport.minDepth = 0.0f;
21125 viewport.width = 512;
21126 viewport.height = 512;
21127 viewport.x = 0;
21128 viewport.y = 0;
21129 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21130 vkEndCommandBuffer(command_buffer[0]);
21131 }
21132 {
21133 VkCommandBufferBeginInfo begin_info{};
21134 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21135 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21136
21137 VkViewport viewport{};
21138 viewport.maxDepth = 1.0f;
21139 viewport.minDepth = 0.0f;
21140 viewport.width = 512;
21141 viewport.height = 512;
21142 viewport.x = 0;
21143 viewport.y = 0;
21144 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21145 vkEndCommandBuffer(command_buffer[1]);
21146 }
21147 {
21148 VkSubmitInfo submit_info{};
21149 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21150 submit_info.commandBufferCount = 1;
21151 submit_info.pCommandBuffers = &command_buffer[0];
21152 submit_info.signalSemaphoreCount = 1;
21153 submit_info.pSignalSemaphores = &semaphore;
21154 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21155 }
21156 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021157 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021158 VkSubmitInfo submit_info{};
21159 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21160 submit_info.commandBufferCount = 1;
21161 submit_info.pCommandBuffers = &command_buffer[1];
21162 submit_info.waitSemaphoreCount = 1;
21163 submit_info.pWaitSemaphores = &semaphore;
21164 submit_info.pWaitDstStageMask = flags;
21165 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21166 }
21167
21168 vkQueueWaitIdle(m_device->m_queue);
21169
21170 vkDestroyFence(m_device->device(), fence, nullptr);
21171 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21172 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21173 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21174
21175 m_errorMonitor->VerifyNotFound();
21176}
21177
21178// This is a positive test. No errors should be generated.
21179TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021180 TEST_DESCRIPTION(
21181 "Two command buffers, each in a separate QueueSubmit call "
21182 "submitted on separate queues, the second having a fence"
21183 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021184
Tony Barbour1fa09702017-03-16 12:09:08 -060021185 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021186 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021187
21188 m_errorMonitor->ExpectSuccess();
21189
21190 VkFence fence;
21191 VkFenceCreateInfo fence_create_info{};
21192 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21193 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21194
21195 VkSemaphore semaphore;
21196 VkSemaphoreCreateInfo semaphore_create_info{};
21197 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21198 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21199
21200 VkCommandPool command_pool;
21201 VkCommandPoolCreateInfo pool_create_info{};
21202 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21203 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21204 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21205 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21206
21207 VkCommandBuffer command_buffer[2];
21208 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21209 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21210 command_buffer_allocate_info.commandPool = command_pool;
21211 command_buffer_allocate_info.commandBufferCount = 2;
21212 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21213 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21214
21215 VkQueue queue = VK_NULL_HANDLE;
21216 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21217
21218 {
21219 VkCommandBufferBeginInfo begin_info{};
21220 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21221 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21222
21223 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 -070021224 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021225
21226 VkViewport viewport{};
21227 viewport.maxDepth = 1.0f;
21228 viewport.minDepth = 0.0f;
21229 viewport.width = 512;
21230 viewport.height = 512;
21231 viewport.x = 0;
21232 viewport.y = 0;
21233 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21234 vkEndCommandBuffer(command_buffer[0]);
21235 }
21236 {
21237 VkCommandBufferBeginInfo begin_info{};
21238 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21239 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21240
21241 VkViewport viewport{};
21242 viewport.maxDepth = 1.0f;
21243 viewport.minDepth = 0.0f;
21244 viewport.width = 512;
21245 viewport.height = 512;
21246 viewport.x = 0;
21247 viewport.y = 0;
21248 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21249 vkEndCommandBuffer(command_buffer[1]);
21250 }
21251 {
21252 VkSubmitInfo submit_info{};
21253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21254 submit_info.commandBufferCount = 1;
21255 submit_info.pCommandBuffers = &command_buffer[0];
21256 submit_info.signalSemaphoreCount = 1;
21257 submit_info.pSignalSemaphores = &semaphore;
21258 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21259 }
21260 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021261 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021262 VkSubmitInfo submit_info{};
21263 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21264 submit_info.commandBufferCount = 1;
21265 submit_info.pCommandBuffers = &command_buffer[1];
21266 submit_info.waitSemaphoreCount = 1;
21267 submit_info.pWaitSemaphores = &semaphore;
21268 submit_info.pWaitDstStageMask = flags;
21269 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21270 }
21271
21272 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21273 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21274
21275 vkDestroyFence(m_device->device(), fence, nullptr);
21276 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21277 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21278 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21279
21280 m_errorMonitor->VerifyNotFound();
21281}
21282
21283TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021284 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021285 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021286 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021287 return;
21288 }
21289
21290 VkResult err;
21291
21292 m_errorMonitor->ExpectSuccess();
21293
21294 VkQueue q0 = m_device->m_queue;
21295 VkQueue q1 = nullptr;
21296 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21297 ASSERT_NE(q1, nullptr);
21298
21299 // An (empty) command buffer. We must have work in the first submission --
21300 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021301 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021302 VkCommandPool pool;
21303 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21304 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021305 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21306 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021307 VkCommandBuffer cb;
21308 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21309 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021310 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021311 err = vkBeginCommandBuffer(cb, &cbbi);
21312 ASSERT_VK_SUCCESS(err);
21313 err = vkEndCommandBuffer(cb);
21314 ASSERT_VK_SUCCESS(err);
21315
21316 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021317 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021318 VkSemaphore s;
21319 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21320 ASSERT_VK_SUCCESS(err);
21321
21322 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021323 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021324
21325 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21326 ASSERT_VK_SUCCESS(err);
21327
21328 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021329 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021330 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021331
21332 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21333 ASSERT_VK_SUCCESS(err);
21334
21335 // Wait for q0 idle
21336 err = vkQueueWaitIdle(q0);
21337 ASSERT_VK_SUCCESS(err);
21338
21339 // Command buffer should have been completed (it was on q0); reset the pool.
21340 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21341
21342 m_errorMonitor->VerifyNotFound();
21343
21344 // Force device completely idle and clean up resources
21345 vkDeviceWaitIdle(m_device->device());
21346 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21347 vkDestroySemaphore(m_device->device(), s, nullptr);
21348}
21349
21350// This is a positive test. No errors should be generated.
21351TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021352 TEST_DESCRIPTION(
21353 "Two command buffers, each in a separate QueueSubmit call "
21354 "submitted on separate queues, the second having a fence, "
21355 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021356
Tony Barbour1fa09702017-03-16 12:09:08 -060021357 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021358 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021359
21360 m_errorMonitor->ExpectSuccess();
21361
Tony Barbour1fa09702017-03-16 12:09:08 -060021362 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021363 VkFence fence;
21364 VkFenceCreateInfo fence_create_info{};
21365 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21366 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21367
21368 VkSemaphore semaphore;
21369 VkSemaphoreCreateInfo semaphore_create_info{};
21370 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21371 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21372
21373 VkCommandPool command_pool;
21374 VkCommandPoolCreateInfo pool_create_info{};
21375 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21376 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21377 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21378 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21379
21380 VkCommandBuffer command_buffer[2];
21381 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21382 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21383 command_buffer_allocate_info.commandPool = command_pool;
21384 command_buffer_allocate_info.commandBufferCount = 2;
21385 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21386 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21387
21388 VkQueue queue = VK_NULL_HANDLE;
21389 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21390
21391 {
21392 VkCommandBufferBeginInfo begin_info{};
21393 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21394 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21395
21396 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 -070021397 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021398
21399 VkViewport viewport{};
21400 viewport.maxDepth = 1.0f;
21401 viewport.minDepth = 0.0f;
21402 viewport.width = 512;
21403 viewport.height = 512;
21404 viewport.x = 0;
21405 viewport.y = 0;
21406 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21407 vkEndCommandBuffer(command_buffer[0]);
21408 }
21409 {
21410 VkCommandBufferBeginInfo begin_info{};
21411 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21412 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21413
21414 VkViewport viewport{};
21415 viewport.maxDepth = 1.0f;
21416 viewport.minDepth = 0.0f;
21417 viewport.width = 512;
21418 viewport.height = 512;
21419 viewport.x = 0;
21420 viewport.y = 0;
21421 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21422 vkEndCommandBuffer(command_buffer[1]);
21423 }
21424 {
21425 VkSubmitInfo submit_info{};
21426 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21427 submit_info.commandBufferCount = 1;
21428 submit_info.pCommandBuffers = &command_buffer[0];
21429 submit_info.signalSemaphoreCount = 1;
21430 submit_info.pSignalSemaphores = &semaphore;
21431 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21432 }
21433 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021434 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021435 VkSubmitInfo submit_info{};
21436 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21437 submit_info.commandBufferCount = 1;
21438 submit_info.pCommandBuffers = &command_buffer[1];
21439 submit_info.waitSemaphoreCount = 1;
21440 submit_info.pWaitSemaphores = &semaphore;
21441 submit_info.pWaitDstStageMask = flags;
21442 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21443 }
21444
21445 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21446
21447 vkDestroyFence(m_device->device(), fence, nullptr);
21448 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21449 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21450 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21451
21452 m_errorMonitor->VerifyNotFound();
21453}
21454
21455// This is a positive test. No errors should be generated.
21456TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021457 TEST_DESCRIPTION(
21458 "Two command buffers, each in a separate QueueSubmit call "
21459 "on the same queue, sharing a signal/wait semaphore, the "
21460 "second having a fence, "
21461 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021462
21463 m_errorMonitor->ExpectSuccess();
21464
Tony Barbour1fa09702017-03-16 12:09:08 -060021465 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021466 VkFence fence;
21467 VkFenceCreateInfo fence_create_info{};
21468 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21469 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21470
21471 VkSemaphore semaphore;
21472 VkSemaphoreCreateInfo semaphore_create_info{};
21473 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21474 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21475
21476 VkCommandPool command_pool;
21477 VkCommandPoolCreateInfo pool_create_info{};
21478 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21479 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21480 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21481 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21482
21483 VkCommandBuffer command_buffer[2];
21484 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21485 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21486 command_buffer_allocate_info.commandPool = command_pool;
21487 command_buffer_allocate_info.commandBufferCount = 2;
21488 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21489 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21490
21491 {
21492 VkCommandBufferBeginInfo begin_info{};
21493 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21494 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21495
21496 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 -070021497 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021498
21499 VkViewport viewport{};
21500 viewport.maxDepth = 1.0f;
21501 viewport.minDepth = 0.0f;
21502 viewport.width = 512;
21503 viewport.height = 512;
21504 viewport.x = 0;
21505 viewport.y = 0;
21506 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21507 vkEndCommandBuffer(command_buffer[0]);
21508 }
21509 {
21510 VkCommandBufferBeginInfo begin_info{};
21511 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21512 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21513
21514 VkViewport viewport{};
21515 viewport.maxDepth = 1.0f;
21516 viewport.minDepth = 0.0f;
21517 viewport.width = 512;
21518 viewport.height = 512;
21519 viewport.x = 0;
21520 viewport.y = 0;
21521 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21522 vkEndCommandBuffer(command_buffer[1]);
21523 }
21524 {
21525 VkSubmitInfo submit_info{};
21526 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21527 submit_info.commandBufferCount = 1;
21528 submit_info.pCommandBuffers = &command_buffer[0];
21529 submit_info.signalSemaphoreCount = 1;
21530 submit_info.pSignalSemaphores = &semaphore;
21531 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21532 }
21533 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021534 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021535 VkSubmitInfo submit_info{};
21536 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21537 submit_info.commandBufferCount = 1;
21538 submit_info.pCommandBuffers = &command_buffer[1];
21539 submit_info.waitSemaphoreCount = 1;
21540 submit_info.pWaitSemaphores = &semaphore;
21541 submit_info.pWaitDstStageMask = flags;
21542 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21543 }
21544
21545 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21546
21547 vkDestroyFence(m_device->device(), fence, nullptr);
21548 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21549 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21550 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21551
21552 m_errorMonitor->VerifyNotFound();
21553}
21554
21555// This is a positive test. No errors should be generated.
21556TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021557 TEST_DESCRIPTION(
21558 "Two command buffers, each in a separate QueueSubmit call "
21559 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21560 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021561
21562 m_errorMonitor->ExpectSuccess();
21563
Tony Barbour1fa09702017-03-16 12:09:08 -060021564 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021565 VkFence fence;
21566 VkFenceCreateInfo fence_create_info{};
21567 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21568 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21569
21570 VkCommandPool command_pool;
21571 VkCommandPoolCreateInfo pool_create_info{};
21572 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21573 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21574 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21575 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21576
21577 VkCommandBuffer command_buffer[2];
21578 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21579 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21580 command_buffer_allocate_info.commandPool = command_pool;
21581 command_buffer_allocate_info.commandBufferCount = 2;
21582 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21583 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21584
21585 {
21586 VkCommandBufferBeginInfo begin_info{};
21587 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21588 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21589
21590 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 -070021591 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021592
21593 VkViewport viewport{};
21594 viewport.maxDepth = 1.0f;
21595 viewport.minDepth = 0.0f;
21596 viewport.width = 512;
21597 viewport.height = 512;
21598 viewport.x = 0;
21599 viewport.y = 0;
21600 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21601 vkEndCommandBuffer(command_buffer[0]);
21602 }
21603 {
21604 VkCommandBufferBeginInfo begin_info{};
21605 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21606 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21607
21608 VkViewport viewport{};
21609 viewport.maxDepth = 1.0f;
21610 viewport.minDepth = 0.0f;
21611 viewport.width = 512;
21612 viewport.height = 512;
21613 viewport.x = 0;
21614 viewport.y = 0;
21615 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21616 vkEndCommandBuffer(command_buffer[1]);
21617 }
21618 {
21619 VkSubmitInfo submit_info{};
21620 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21621 submit_info.commandBufferCount = 1;
21622 submit_info.pCommandBuffers = &command_buffer[0];
21623 submit_info.signalSemaphoreCount = 0;
21624 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21625 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21626 }
21627 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021628 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021629 VkSubmitInfo submit_info{};
21630 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21631 submit_info.commandBufferCount = 1;
21632 submit_info.pCommandBuffers = &command_buffer[1];
21633 submit_info.waitSemaphoreCount = 0;
21634 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21635 submit_info.pWaitDstStageMask = flags;
21636 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21637 }
21638
21639 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21640
21641 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21642 ASSERT_VK_SUCCESS(err);
21643
21644 vkDestroyFence(m_device->device(), fence, nullptr);
21645 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21646 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21647
21648 m_errorMonitor->VerifyNotFound();
21649}
21650
21651// This is a positive test. No errors should be generated.
21652TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021653 TEST_DESCRIPTION(
21654 "Two command buffers, each in a separate QueueSubmit call "
21655 "on the same queue, the second having a fence, followed "
21656 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021657
21658 m_errorMonitor->ExpectSuccess();
21659
Tony Barbour1fa09702017-03-16 12:09:08 -060021660 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021661 VkFence fence;
21662 VkFenceCreateInfo fence_create_info{};
21663 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21664 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21665
21666 VkCommandPool command_pool;
21667 VkCommandPoolCreateInfo pool_create_info{};
21668 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21669 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21670 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21671 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21672
21673 VkCommandBuffer command_buffer[2];
21674 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21675 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21676 command_buffer_allocate_info.commandPool = command_pool;
21677 command_buffer_allocate_info.commandBufferCount = 2;
21678 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21679 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21680
21681 {
21682 VkCommandBufferBeginInfo begin_info{};
21683 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21684 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21685
21686 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 -070021687 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021688
21689 VkViewport viewport{};
21690 viewport.maxDepth = 1.0f;
21691 viewport.minDepth = 0.0f;
21692 viewport.width = 512;
21693 viewport.height = 512;
21694 viewport.x = 0;
21695 viewport.y = 0;
21696 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21697 vkEndCommandBuffer(command_buffer[0]);
21698 }
21699 {
21700 VkCommandBufferBeginInfo begin_info{};
21701 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21702 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21703
21704 VkViewport viewport{};
21705 viewport.maxDepth = 1.0f;
21706 viewport.minDepth = 0.0f;
21707 viewport.width = 512;
21708 viewport.height = 512;
21709 viewport.x = 0;
21710 viewport.y = 0;
21711 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21712 vkEndCommandBuffer(command_buffer[1]);
21713 }
21714 {
21715 VkSubmitInfo submit_info{};
21716 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21717 submit_info.commandBufferCount = 1;
21718 submit_info.pCommandBuffers = &command_buffer[0];
21719 submit_info.signalSemaphoreCount = 0;
21720 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21721 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21722 }
21723 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021724 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021725 VkSubmitInfo submit_info{};
21726 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21727 submit_info.commandBufferCount = 1;
21728 submit_info.pCommandBuffers = &command_buffer[1];
21729 submit_info.waitSemaphoreCount = 0;
21730 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21731 submit_info.pWaitDstStageMask = flags;
21732 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21733 }
21734
21735 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21736
21737 vkDestroyFence(m_device->device(), fence, nullptr);
21738 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21739 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21740
21741 m_errorMonitor->VerifyNotFound();
21742}
21743
21744// This is a positive test. No errors should be generated.
21745TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021746 TEST_DESCRIPTION(
21747 "Two command buffers each in a separate SubmitInfo sent in a single "
21748 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021749 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021750
21751 m_errorMonitor->ExpectSuccess();
21752
21753 VkFence fence;
21754 VkFenceCreateInfo fence_create_info{};
21755 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21756 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21757
21758 VkSemaphore semaphore;
21759 VkSemaphoreCreateInfo semaphore_create_info{};
21760 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21761 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21762
21763 VkCommandPool command_pool;
21764 VkCommandPoolCreateInfo pool_create_info{};
21765 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21766 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21767 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21768 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21769
21770 VkCommandBuffer command_buffer[2];
21771 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21772 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21773 command_buffer_allocate_info.commandPool = command_pool;
21774 command_buffer_allocate_info.commandBufferCount = 2;
21775 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21776 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21777
21778 {
21779 VkCommandBufferBeginInfo begin_info{};
21780 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21781 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21782
21783 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 -070021784 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021785
21786 VkViewport viewport{};
21787 viewport.maxDepth = 1.0f;
21788 viewport.minDepth = 0.0f;
21789 viewport.width = 512;
21790 viewport.height = 512;
21791 viewport.x = 0;
21792 viewport.y = 0;
21793 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21794 vkEndCommandBuffer(command_buffer[0]);
21795 }
21796 {
21797 VkCommandBufferBeginInfo begin_info{};
21798 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21799 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21800
21801 VkViewport viewport{};
21802 viewport.maxDepth = 1.0f;
21803 viewport.minDepth = 0.0f;
21804 viewport.width = 512;
21805 viewport.height = 512;
21806 viewport.x = 0;
21807 viewport.y = 0;
21808 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21809 vkEndCommandBuffer(command_buffer[1]);
21810 }
21811 {
21812 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021813 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021814
21815 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21816 submit_info[0].pNext = NULL;
21817 submit_info[0].commandBufferCount = 1;
21818 submit_info[0].pCommandBuffers = &command_buffer[0];
21819 submit_info[0].signalSemaphoreCount = 1;
21820 submit_info[0].pSignalSemaphores = &semaphore;
21821 submit_info[0].waitSemaphoreCount = 0;
21822 submit_info[0].pWaitSemaphores = NULL;
21823 submit_info[0].pWaitDstStageMask = 0;
21824
21825 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21826 submit_info[1].pNext = NULL;
21827 submit_info[1].commandBufferCount = 1;
21828 submit_info[1].pCommandBuffers = &command_buffer[1];
21829 submit_info[1].waitSemaphoreCount = 1;
21830 submit_info[1].pWaitSemaphores = &semaphore;
21831 submit_info[1].pWaitDstStageMask = flags;
21832 submit_info[1].signalSemaphoreCount = 0;
21833 submit_info[1].pSignalSemaphores = NULL;
21834 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21835 }
21836
21837 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21838
21839 vkDestroyFence(m_device->device(), fence, nullptr);
21840 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21841 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21842 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21843
21844 m_errorMonitor->VerifyNotFound();
21845}
21846
21847TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21848 m_errorMonitor->ExpectSuccess();
21849
Tony Barbour1fa09702017-03-16 12:09:08 -060021850 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21852
Tony Barbour552f6c02016-12-21 14:34:07 -070021853 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021854
21855 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21856 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21857 m_errorMonitor->VerifyNotFound();
21858 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21859 m_errorMonitor->VerifyNotFound();
21860 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21861 m_errorMonitor->VerifyNotFound();
21862
21863 m_commandBuffer->EndCommandBuffer();
21864 m_errorMonitor->VerifyNotFound();
21865}
21866
21867TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021868 TEST_DESCRIPTION(
21869 "Positive test where we create a renderpass with an "
21870 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21871 "has a valid layout, and a second subpass then uses a "
21872 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021873 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021874 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021875 auto depth_format = find_depth_stencil_format(m_device);
21876 if (!depth_format) {
21877 printf(" No Depth + Stencil format found. Skipped.\n");
21878 return;
21879 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021880
21881 VkAttachmentReference attach[2] = {};
21882 attach[0].attachment = 0;
21883 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21884 attach[1].attachment = 0;
21885 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21886 VkSubpassDescription subpasses[2] = {};
21887 // First subpass clears DS attach on load
21888 subpasses[0].pDepthStencilAttachment = &attach[0];
21889 // 2nd subpass reads in DS as input attachment
21890 subpasses[1].inputAttachmentCount = 1;
21891 subpasses[1].pInputAttachments = &attach[1];
21892 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021893 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021894 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21895 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21896 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21897 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21898 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21899 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21900 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21901 VkRenderPassCreateInfo rpci = {};
21902 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21903 rpci.attachmentCount = 1;
21904 rpci.pAttachments = &attach_desc;
21905 rpci.subpassCount = 2;
21906 rpci.pSubpasses = subpasses;
21907
21908 // Now create RenderPass and verify no errors
21909 VkRenderPass rp;
21910 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21911 m_errorMonitor->VerifyNotFound();
21912
21913 vkDestroyRenderPass(m_device->device(), rp, NULL);
21914}
21915
Tobin Ehlis01103de2017-02-16 13:22:47 -070021916TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21917 TEST_DESCRIPTION(
21918 "Create a render pass with depth-stencil attachment where layout transition "
21919 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21920 "transition has correctly occurred at queue submit time with no validation errors.");
21921
Tony Barbour1fa09702017-03-16 12:09:08 -060021922 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021923 auto depth_format = find_depth_stencil_format(m_device);
21924 if (!depth_format) {
21925 printf(" No Depth + Stencil format found. Skipped.\n");
21926 return;
21927 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021928 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021929 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021930 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21931 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021932 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021933 return;
21934 }
21935
21936 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021937 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21938
21939 // A renderpass with one depth/stencil attachment.
21940 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021941 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021942 VK_SAMPLE_COUNT_1_BIT,
21943 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21944 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21945 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21946 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21947 VK_IMAGE_LAYOUT_UNDEFINED,
21948 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21949
21950 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21951
21952 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21953
21954 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21955
21956 VkRenderPass rp;
21957 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21958 ASSERT_VK_SUCCESS(err);
21959 // A compatible ds image.
21960 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021961 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 -070021962 ASSERT_TRUE(image.initialized());
21963
21964 VkImageViewCreateInfo ivci = {
21965 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21966 nullptr,
21967 0,
21968 image.handle(),
21969 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021970 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021971 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21972 VK_COMPONENT_SWIZZLE_IDENTITY},
21973 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21974 };
21975 VkImageView view;
21976 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21977 ASSERT_VK_SUCCESS(err);
21978
21979 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
21980 VkFramebuffer fb;
21981 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21982 ASSERT_VK_SUCCESS(err);
21983
21984 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
21985 m_commandBuffer->BeginCommandBuffer();
21986 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21987 vkCmdEndRenderPass(m_commandBuffer->handle());
21988 m_commandBuffer->EndCommandBuffer();
21989 QueueCommandBuffer(false);
21990 m_errorMonitor->VerifyNotFound();
21991
21992 // Cleanup
21993 vkDestroyImageView(m_device->device(), view, NULL);
21994 vkDestroyRenderPass(m_device->device(), rp, NULL);
21995 vkDestroyFramebuffer(m_device->device(), fb, NULL);
21996}
21997
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021998TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021999 TEST_DESCRIPTION(
22000 "Test that pipeline validation accepts matrices passed "
22001 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022002 m_errorMonitor->ExpectSuccess();
22003
Tony Barbour1fa09702017-03-16 12:09:08 -060022004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22006
22007 VkVertexInputBindingDescription input_binding;
22008 memset(&input_binding, 0, sizeof(input_binding));
22009
22010 VkVertexInputAttributeDescription input_attribs[2];
22011 memset(input_attribs, 0, sizeof(input_attribs));
22012
22013 for (int i = 0; i < 2; i++) {
22014 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22015 input_attribs[i].location = i;
22016 }
22017
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022018 char const *vsSource =
22019 "#version 450\n"
22020 "\n"
22021 "layout(location=0) in mat2x4 x;\n"
22022 "out gl_PerVertex {\n"
22023 " vec4 gl_Position;\n"
22024 "};\n"
22025 "void main(){\n"
22026 " gl_Position = x[0] + x[1];\n"
22027 "}\n";
22028 char const *fsSource =
22029 "#version 450\n"
22030 "\n"
22031 "layout(location=0) out vec4 color;\n"
22032 "void main(){\n"
22033 " color = vec4(1);\n"
22034 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022035
22036 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22037 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22038
22039 VkPipelineObj pipe(m_device);
22040 pipe.AddColorAttachment();
22041 pipe.AddShader(&vs);
22042 pipe.AddShader(&fs);
22043
22044 pipe.AddVertexInputBindings(&input_binding, 1);
22045 pipe.AddVertexInputAttribs(input_attribs, 2);
22046
22047 VkDescriptorSetObj descriptorSet(m_device);
22048 descriptorSet.AppendDummy();
22049 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22050
22051 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22052
22053 /* expect success */
22054 m_errorMonitor->VerifyNotFound();
22055}
22056
22057TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22058 m_errorMonitor->ExpectSuccess();
22059
Tony Barbour1fa09702017-03-16 12:09:08 -060022060 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022061 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22062
22063 VkVertexInputBindingDescription input_binding;
22064 memset(&input_binding, 0, sizeof(input_binding));
22065
22066 VkVertexInputAttributeDescription input_attribs[2];
22067 memset(input_attribs, 0, sizeof(input_attribs));
22068
22069 for (int i = 0; i < 2; i++) {
22070 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22071 input_attribs[i].location = i;
22072 }
22073
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022074 char const *vsSource =
22075 "#version 450\n"
22076 "\n"
22077 "layout(location=0) in vec4 x[2];\n"
22078 "out gl_PerVertex {\n"
22079 " vec4 gl_Position;\n"
22080 "};\n"
22081 "void main(){\n"
22082 " gl_Position = x[0] + x[1];\n"
22083 "}\n";
22084 char const *fsSource =
22085 "#version 450\n"
22086 "\n"
22087 "layout(location=0) out vec4 color;\n"
22088 "void main(){\n"
22089 " color = vec4(1);\n"
22090 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022091
22092 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22093 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22094
22095 VkPipelineObj pipe(m_device);
22096 pipe.AddColorAttachment();
22097 pipe.AddShader(&vs);
22098 pipe.AddShader(&fs);
22099
22100 pipe.AddVertexInputBindings(&input_binding, 1);
22101 pipe.AddVertexInputAttribs(input_attribs, 2);
22102
22103 VkDescriptorSetObj descriptorSet(m_device);
22104 descriptorSet.AppendDummy();
22105 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22106
22107 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22108
22109 m_errorMonitor->VerifyNotFound();
22110}
22111
22112TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022113 TEST_DESCRIPTION(
22114 "Test that pipeline validation accepts consuming a vertex attribute "
22115 "through multiple vertex shader inputs, each consuming a different "
22116 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022117 m_errorMonitor->ExpectSuccess();
22118
Tony Barbour1fa09702017-03-16 12:09:08 -060022119 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22121
22122 VkVertexInputBindingDescription input_binding;
22123 memset(&input_binding, 0, sizeof(input_binding));
22124
22125 VkVertexInputAttributeDescription input_attribs[3];
22126 memset(input_attribs, 0, sizeof(input_attribs));
22127
22128 for (int i = 0; i < 3; i++) {
22129 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22130 input_attribs[i].location = i;
22131 }
22132
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022133 char const *vsSource =
22134 "#version 450\n"
22135 "\n"
22136 "layout(location=0) in vec4 x;\n"
22137 "layout(location=1) in vec3 y1;\n"
22138 "layout(location=1, component=3) in float y2;\n"
22139 "layout(location=2) in vec4 z;\n"
22140 "out gl_PerVertex {\n"
22141 " vec4 gl_Position;\n"
22142 "};\n"
22143 "void main(){\n"
22144 " gl_Position = x + vec4(y1, y2) + z;\n"
22145 "}\n";
22146 char const *fsSource =
22147 "#version 450\n"
22148 "\n"
22149 "layout(location=0) out vec4 color;\n"
22150 "void main(){\n"
22151 " color = vec4(1);\n"
22152 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022153
22154 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22155 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22156
22157 VkPipelineObj pipe(m_device);
22158 pipe.AddColorAttachment();
22159 pipe.AddShader(&vs);
22160 pipe.AddShader(&fs);
22161
22162 pipe.AddVertexInputBindings(&input_binding, 1);
22163 pipe.AddVertexInputAttribs(input_attribs, 3);
22164
22165 VkDescriptorSetObj descriptorSet(m_device);
22166 descriptorSet.AppendDummy();
22167 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22168
22169 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22170
22171 m_errorMonitor->VerifyNotFound();
22172}
22173
22174TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22175 m_errorMonitor->ExpectSuccess();
22176
Tony Barbour1fa09702017-03-16 12:09:08 -060022177 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022178 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22179
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022180 char const *vsSource =
22181 "#version 450\n"
22182 "out gl_PerVertex {\n"
22183 " vec4 gl_Position;\n"
22184 "};\n"
22185 "void main(){\n"
22186 " gl_Position = vec4(0);\n"
22187 "}\n";
22188 char const *fsSource =
22189 "#version 450\n"
22190 "\n"
22191 "layout(location=0) out vec4 color;\n"
22192 "void main(){\n"
22193 " color = vec4(1);\n"
22194 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022195
22196 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22197 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22198
22199 VkPipelineObj pipe(m_device);
22200 pipe.AddColorAttachment();
22201 pipe.AddShader(&vs);
22202 pipe.AddShader(&fs);
22203
22204 VkDescriptorSetObj descriptorSet(m_device);
22205 descriptorSet.AppendDummy();
22206 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22207
22208 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22209
22210 m_errorMonitor->VerifyNotFound();
22211}
22212
22213TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022214 TEST_DESCRIPTION(
22215 "Test that pipeline validation accepts the relaxed type matching rules "
22216 "set out in 14.1.3: fundamental type must match, and producer side must "
22217 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022218 m_errorMonitor->ExpectSuccess();
22219
22220 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22221
Tony Barbour1fa09702017-03-16 12:09:08 -060022222 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22224
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022225 char const *vsSource =
22226 "#version 450\n"
22227 "out gl_PerVertex {\n"
22228 " vec4 gl_Position;\n"
22229 "};\n"
22230 "layout(location=0) out vec3 x;\n"
22231 "layout(location=1) out ivec3 y;\n"
22232 "layout(location=2) out vec3 z;\n"
22233 "void main(){\n"
22234 " gl_Position = vec4(0);\n"
22235 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22236 "}\n";
22237 char const *fsSource =
22238 "#version 450\n"
22239 "\n"
22240 "layout(location=0) out vec4 color;\n"
22241 "layout(location=0) in float x;\n"
22242 "layout(location=1) flat in int y;\n"
22243 "layout(location=2) in vec2 z;\n"
22244 "void main(){\n"
22245 " color = vec4(1 + x + y + z.x);\n"
22246 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022247
22248 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22249 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22250
22251 VkPipelineObj pipe(m_device);
22252 pipe.AddColorAttachment();
22253 pipe.AddShader(&vs);
22254 pipe.AddShader(&fs);
22255
22256 VkDescriptorSetObj descriptorSet(m_device);
22257 descriptorSet.AppendDummy();
22258 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22259
22260 VkResult err = VK_SUCCESS;
22261 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22262 ASSERT_VK_SUCCESS(err);
22263
22264 m_errorMonitor->VerifyNotFound();
22265}
22266
22267TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022268 TEST_DESCRIPTION(
22269 "Test that pipeline validation accepts per-vertex variables "
22270 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022271 m_errorMonitor->ExpectSuccess();
22272
Tony Barbour1fa09702017-03-16 12:09:08 -060022273 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022274 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22275
22276 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022277 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022278 return;
22279 }
22280
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022281 char const *vsSource =
22282 "#version 450\n"
22283 "void main(){}\n";
22284 char const *tcsSource =
22285 "#version 450\n"
22286 "layout(location=0) out int x[];\n"
22287 "layout(vertices=3) out;\n"
22288 "void main(){\n"
22289 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22290 " gl_TessLevelInner[0] = 1;\n"
22291 " x[gl_InvocationID] = gl_InvocationID;\n"
22292 "}\n";
22293 char const *tesSource =
22294 "#version 450\n"
22295 "layout(triangles, equal_spacing, cw) in;\n"
22296 "layout(location=0) in int x[];\n"
22297 "out gl_PerVertex { vec4 gl_Position; };\n"
22298 "void main(){\n"
22299 " gl_Position.xyz = gl_TessCoord;\n"
22300 " gl_Position.w = x[0] + x[1] + x[2];\n"
22301 "}\n";
22302 char const *fsSource =
22303 "#version 450\n"
22304 "layout(location=0) out vec4 color;\n"
22305 "void main(){\n"
22306 " color = vec4(1);\n"
22307 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022308
22309 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22310 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22311 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22312 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22313
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022314 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22315 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022316
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022317 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022318
22319 VkPipelineObj pipe(m_device);
22320 pipe.SetInputAssembly(&iasci);
22321 pipe.SetTessellation(&tsci);
22322 pipe.AddColorAttachment();
22323 pipe.AddShader(&vs);
22324 pipe.AddShader(&tcs);
22325 pipe.AddShader(&tes);
22326 pipe.AddShader(&fs);
22327
22328 VkDescriptorSetObj descriptorSet(m_device);
22329 descriptorSet.AppendDummy();
22330 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22331
22332 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22333
22334 m_errorMonitor->VerifyNotFound();
22335}
22336
22337TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022338 TEST_DESCRIPTION(
22339 "Test that pipeline validation accepts a user-defined "
22340 "interface block passed into the geometry shader. This "
22341 "is interesting because the 'extra' array level is not "
22342 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022343 m_errorMonitor->ExpectSuccess();
22344
Tony Barbour1fa09702017-03-16 12:09:08 -060022345 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022346 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22347
22348 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022349 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022350 return;
22351 }
22352
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022353 char const *vsSource =
22354 "#version 450\n"
22355 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22356 "void main(){\n"
22357 " vs_out.x = vec4(1);\n"
22358 "}\n";
22359 char const *gsSource =
22360 "#version 450\n"
22361 "layout(triangles) in;\n"
22362 "layout(triangle_strip, max_vertices=3) out;\n"
22363 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22364 "out gl_PerVertex { vec4 gl_Position; };\n"
22365 "void main() {\n"
22366 " gl_Position = gs_in[0].x;\n"
22367 " EmitVertex();\n"
22368 "}\n";
22369 char const *fsSource =
22370 "#version 450\n"
22371 "layout(location=0) out vec4 color;\n"
22372 "void main(){\n"
22373 " color = vec4(1);\n"
22374 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022375
22376 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22377 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22378 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22379
22380 VkPipelineObj pipe(m_device);
22381 pipe.AddColorAttachment();
22382 pipe.AddShader(&vs);
22383 pipe.AddShader(&gs);
22384 pipe.AddShader(&fs);
22385
22386 VkDescriptorSetObj descriptorSet(m_device);
22387 descriptorSet.AppendDummy();
22388 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22389
22390 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22391
22392 m_errorMonitor->VerifyNotFound();
22393}
22394
22395TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022396 TEST_DESCRIPTION(
22397 "Test that pipeline validation accepts basic use of 64bit vertex "
22398 "attributes. This is interesting because they consume multiple "
22399 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022400 m_errorMonitor->ExpectSuccess();
22401
Tony Barbour1fa09702017-03-16 12:09:08 -060022402 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022403 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22404
22405 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022406 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022407 return;
22408 }
22409
22410 VkVertexInputBindingDescription input_bindings[1];
22411 memset(input_bindings, 0, sizeof(input_bindings));
22412
22413 VkVertexInputAttributeDescription input_attribs[4];
22414 memset(input_attribs, 0, sizeof(input_attribs));
22415 input_attribs[0].location = 0;
22416 input_attribs[0].offset = 0;
22417 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22418 input_attribs[1].location = 2;
22419 input_attribs[1].offset = 32;
22420 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22421 input_attribs[2].location = 4;
22422 input_attribs[2].offset = 64;
22423 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22424 input_attribs[3].location = 6;
22425 input_attribs[3].offset = 96;
22426 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22427
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022428 char const *vsSource =
22429 "#version 450\n"
22430 "\n"
22431 "layout(location=0) in dmat4 x;\n"
22432 "out gl_PerVertex {\n"
22433 " vec4 gl_Position;\n"
22434 "};\n"
22435 "void main(){\n"
22436 " gl_Position = vec4(x[0][0]);\n"
22437 "}\n";
22438 char const *fsSource =
22439 "#version 450\n"
22440 "\n"
22441 "layout(location=0) out vec4 color;\n"
22442 "void main(){\n"
22443 " color = vec4(1);\n"
22444 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022445
22446 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22447 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22448
22449 VkPipelineObj pipe(m_device);
22450 pipe.AddColorAttachment();
22451 pipe.AddShader(&vs);
22452 pipe.AddShader(&fs);
22453
22454 pipe.AddVertexInputBindings(input_bindings, 1);
22455 pipe.AddVertexInputAttribs(input_attribs, 4);
22456
22457 VkDescriptorSetObj descriptorSet(m_device);
22458 descriptorSet.AppendDummy();
22459 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22460
22461 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22462
22463 m_errorMonitor->VerifyNotFound();
22464}
22465
22466TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22467 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22468 m_errorMonitor->ExpectSuccess();
22469
Tony Barbour1fa09702017-03-16 12:09:08 -060022470 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022471
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022472 char const *vsSource =
22473 "#version 450\n"
22474 "\n"
22475 "out gl_PerVertex {\n"
22476 " vec4 gl_Position;\n"
22477 "};\n"
22478 "void main(){\n"
22479 " gl_Position = vec4(1);\n"
22480 "}\n";
22481 char const *fsSource =
22482 "#version 450\n"
22483 "\n"
22484 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22485 "layout(location=0) out vec4 color;\n"
22486 "void main() {\n"
22487 " color = subpassLoad(x);\n"
22488 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022489
22490 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22491 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22492
22493 VkPipelineObj pipe(m_device);
22494 pipe.AddShader(&vs);
22495 pipe.AddShader(&fs);
22496 pipe.AddColorAttachment();
22497 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22498
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022499 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22500 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022501 VkDescriptorSetLayout dsl;
22502 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22503 ASSERT_VK_SUCCESS(err);
22504
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022505 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022506 VkPipelineLayout pl;
22507 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22508 ASSERT_VK_SUCCESS(err);
22509
22510 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022511 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22512 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22513 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22514 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22515 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 -060022516 };
22517 VkAttachmentReference color = {
22518 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22519 };
22520 VkAttachmentReference input = {
22521 1, VK_IMAGE_LAYOUT_GENERAL,
22522 };
22523
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022524 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022525
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022526 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022527 VkRenderPass rp;
22528 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22529 ASSERT_VK_SUCCESS(err);
22530
22531 // should be OK. would go wrong here if it's going to...
22532 pipe.CreateVKPipeline(pl, rp);
22533
22534 m_errorMonitor->VerifyNotFound();
22535
22536 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22537 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22538 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22539}
22540
22541TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022542 TEST_DESCRIPTION(
22543 "Test that pipeline validation accepts a compute pipeline which declares a "
22544 "descriptor-backed resource which is not provided, but the shader does not "
22545 "statically use it. This is interesting because it requires compute pipelines "
22546 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022547 m_errorMonitor->ExpectSuccess();
22548
Tony Barbour1fa09702017-03-16 12:09:08 -060022549 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022550
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022551 char const *csSource =
22552 "#version 450\n"
22553 "\n"
22554 "layout(local_size_x=1) in;\n"
22555 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22556 "void main(){\n"
22557 " // x is not used.\n"
22558 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022559
22560 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22561
22562 VkDescriptorSetObj descriptorSet(m_device);
22563 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22564
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022565 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22566 nullptr,
22567 0,
22568 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22569 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22570 descriptorSet.GetPipelineLayout(),
22571 VK_NULL_HANDLE,
22572 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022573
22574 VkPipeline pipe;
22575 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22576
22577 m_errorMonitor->VerifyNotFound();
22578
22579 if (err == VK_SUCCESS) {
22580 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22581 }
22582}
22583
22584TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022585 TEST_DESCRIPTION(
22586 "Test that pipeline validation accepts a shader consuming only the "
22587 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022588 m_errorMonitor->ExpectSuccess();
22589
Tony Barbour1fa09702017-03-16 12:09:08 -060022590 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022591
22592 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022593 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22594 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22595 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022596 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022597 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022598 VkDescriptorSetLayout dsl;
22599 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22600 ASSERT_VK_SUCCESS(err);
22601
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022602 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022603 VkPipelineLayout pl;
22604 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22605 ASSERT_VK_SUCCESS(err);
22606
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022607 char const *csSource =
22608 "#version 450\n"
22609 "\n"
22610 "layout(local_size_x=1) in;\n"
22611 "layout(set=0, binding=0) uniform sampler s;\n"
22612 "layout(set=0, binding=1) uniform texture2D t;\n"
22613 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22614 "void main() {\n"
22615 " x = texture(sampler2D(t, s), vec2(0));\n"
22616 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022617 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22618
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022619 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22620 nullptr,
22621 0,
22622 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22623 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22624 pl,
22625 VK_NULL_HANDLE,
22626 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022627
22628 VkPipeline pipe;
22629 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22630
22631 m_errorMonitor->VerifyNotFound();
22632
22633 if (err == VK_SUCCESS) {
22634 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22635 }
22636
22637 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22638 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22639}
22640
22641TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022642 TEST_DESCRIPTION(
22643 "Test that pipeline validation accepts a shader consuming only the "
22644 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022645 m_errorMonitor->ExpectSuccess();
22646
Tony Barbour1fa09702017-03-16 12:09:08 -060022647 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022648
22649 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022650 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22651 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22652 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022653 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022654 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022655 VkDescriptorSetLayout dsl;
22656 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22657 ASSERT_VK_SUCCESS(err);
22658
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022659 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022660 VkPipelineLayout pl;
22661 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22662 ASSERT_VK_SUCCESS(err);
22663
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022664 char const *csSource =
22665 "#version 450\n"
22666 "\n"
22667 "layout(local_size_x=1) in;\n"
22668 "layout(set=0, binding=0) uniform texture2D t;\n"
22669 "layout(set=0, binding=1) uniform sampler s;\n"
22670 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22671 "void main() {\n"
22672 " x = texture(sampler2D(t, s), vec2(0));\n"
22673 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022674 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22675
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022676 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22677 nullptr,
22678 0,
22679 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22680 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22681 pl,
22682 VK_NULL_HANDLE,
22683 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022684
22685 VkPipeline pipe;
22686 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22687
22688 m_errorMonitor->VerifyNotFound();
22689
22690 if (err == VK_SUCCESS) {
22691 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22692 }
22693
22694 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22695 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22696}
22697
22698TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022699 TEST_DESCRIPTION(
22700 "Test that pipeline validation accepts a shader consuming "
22701 "both the sampler and the image of a combined image+sampler "
22702 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022703 m_errorMonitor->ExpectSuccess();
22704
Tony Barbour1fa09702017-03-16 12:09:08 -060022705 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022706
22707 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022708 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22709 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022710 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022711 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022712 VkDescriptorSetLayout dsl;
22713 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22714 ASSERT_VK_SUCCESS(err);
22715
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022716 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022717 VkPipelineLayout pl;
22718 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22719 ASSERT_VK_SUCCESS(err);
22720
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022721 char const *csSource =
22722 "#version 450\n"
22723 "\n"
22724 "layout(local_size_x=1) in;\n"
22725 "layout(set=0, binding=0) uniform texture2D t;\n"
22726 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22727 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22728 "void main() {\n"
22729 " x = texture(sampler2D(t, s), vec2(0));\n"
22730 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022731 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22732
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022733 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22734 nullptr,
22735 0,
22736 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22737 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22738 pl,
22739 VK_NULL_HANDLE,
22740 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022741
22742 VkPipeline pipe;
22743 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22744
22745 m_errorMonitor->VerifyNotFound();
22746
22747 if (err == VK_SUCCESS) {
22748 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22749 }
22750
22751 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22752 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22753}
22754
Tony Barbour3ed87a02017-03-15 16:19:02 -060022755TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022756 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22757
Tony Barbour3ed87a02017-03-15 16:19:02 -060022758 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022759 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022760
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022761 // Ensure that extension is available and enabled.
22762 uint32_t extension_count = 0;
22763 bool supports_maintenance1_extension = false;
22764 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22765 ASSERT_VK_SUCCESS(err);
22766 if (extension_count > 0) {
22767 std::vector<VkExtensionProperties> available_extensions(extension_count);
22768
22769 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22770 ASSERT_VK_SUCCESS(err);
22771 for (const auto &extension_props : available_extensions) {
22772 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22773 supports_maintenance1_extension = true;
22774 }
22775 }
22776 }
22777
22778 // Proceed if extension is supported by hardware
22779 if (!supports_maintenance1_extension) {
22780 printf(" Maintenance1 Extension not supported, skipping tests\n");
22781 return;
22782 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022783
22784 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022785 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022786 VkCommandBuffer cmd_buf;
22787 VkCommandBufferAllocateInfo alloc_info;
22788 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22789 alloc_info.pNext = NULL;
22790 alloc_info.commandBufferCount = 1;
22791 alloc_info.commandPool = m_commandPool;
22792 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22793 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22794
22795 VkCommandBufferBeginInfo cb_binfo;
22796 cb_binfo.pNext = NULL;
22797 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22798 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22799 cb_binfo.flags = 0;
22800 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22801 // Set Negative height, should give error if Maintenance 1 is not enabled
22802 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22803 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22804 vkEndCommandBuffer(cmd_buf);
22805
22806 m_errorMonitor->VerifyNotFound();
22807}
22808
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022809TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22810 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22811
Tony Barbour1fa09702017-03-16 12:09:08 -060022812 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022813
22814 // Positive test to check parameter_validation and unique_objects support
22815 // for NV_dedicated_allocation
22816 uint32_t extension_count = 0;
22817 bool supports_nv_dedicated_allocation = false;
22818 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22819 ASSERT_VK_SUCCESS(err);
22820
22821 if (extension_count > 0) {
22822 std::vector<VkExtensionProperties> available_extensions(extension_count);
22823
22824 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22825 ASSERT_VK_SUCCESS(err);
22826
22827 for (const auto &extension_props : available_extensions) {
22828 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22829 supports_nv_dedicated_allocation = true;
22830 }
22831 }
22832 }
22833
22834 if (supports_nv_dedicated_allocation) {
22835 m_errorMonitor->ExpectSuccess();
22836
22837 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22838 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22839 dedicated_buffer_create_info.pNext = nullptr;
22840 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22841
22842 uint32_t queue_family_index = 0;
22843 VkBufferCreateInfo buffer_create_info = {};
22844 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22845 buffer_create_info.pNext = &dedicated_buffer_create_info;
22846 buffer_create_info.size = 1024;
22847 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22848 buffer_create_info.queueFamilyIndexCount = 1;
22849 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22850
22851 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022852 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022853 ASSERT_VK_SUCCESS(err);
22854
22855 VkMemoryRequirements memory_reqs;
22856 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22857
22858 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22859 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22860 dedicated_memory_info.pNext = nullptr;
22861 dedicated_memory_info.buffer = buffer;
22862 dedicated_memory_info.image = VK_NULL_HANDLE;
22863
22864 VkMemoryAllocateInfo memory_info = {};
22865 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22866 memory_info.pNext = &dedicated_memory_info;
22867 memory_info.allocationSize = memory_reqs.size;
22868
22869 bool pass;
22870 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22871 ASSERT_TRUE(pass);
22872
22873 VkDeviceMemory buffer_memory;
22874 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22875 ASSERT_VK_SUCCESS(err);
22876
22877 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22878 ASSERT_VK_SUCCESS(err);
22879
22880 vkDestroyBuffer(m_device->device(), buffer, NULL);
22881 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22882
22883 m_errorMonitor->VerifyNotFound();
22884 }
22885}
22886
22887TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22888 VkResult err;
22889
22890 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22891
Tony Barbour1fa09702017-03-16 12:09:08 -060022892 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022893 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22894
22895 std::vector<const char *> device_extension_names;
22896 auto features = m_device->phy().features();
22897 // Artificially disable support for non-solid fill modes
22898 features.fillModeNonSolid = false;
22899 // The sacrificial device object
22900 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22901
22902 VkRenderpassObj render_pass(&test_device);
22903
22904 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22905 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22906 pipeline_layout_ci.setLayoutCount = 0;
22907 pipeline_layout_ci.pSetLayouts = NULL;
22908
22909 VkPipelineLayout pipeline_layout;
22910 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22911 ASSERT_VK_SUCCESS(err);
22912
22913 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22914 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22915 rs_ci.pNext = nullptr;
22916 rs_ci.lineWidth = 1.0f;
22917 rs_ci.rasterizerDiscardEnable = true;
22918
22919 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22920 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22921
22922 // Set polygonMode=FILL. No error is expected
22923 m_errorMonitor->ExpectSuccess();
22924 {
22925 VkPipelineObj pipe(&test_device);
22926 pipe.AddShader(&vs);
22927 pipe.AddShader(&fs);
22928 pipe.AddColorAttachment();
22929 // Set polygonMode to a good value
22930 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22931 pipe.SetRasterization(&rs_ci);
22932 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22933 }
22934 m_errorMonitor->VerifyNotFound();
22935
22936 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
22937}
22938
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022939#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022940TEST_F(VkPositiveLayerTest, LongFenceChain)
22941{
22942 m_errorMonitor->ExpectSuccess();
22943
Tony Barbour1fa09702017-03-16 12:09:08 -060022944 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022945 VkResult err;
22946
22947 std::vector<VkFence> fences;
22948
22949 const int chainLength = 32768;
22950
22951 for (int i = 0; i < chainLength; i++) {
22952 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
22953 VkFence fence;
22954 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
22955 ASSERT_VK_SUCCESS(err);
22956
22957 fences.push_back(fence);
22958
22959 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
22960 0, nullptr, 0, nullptr };
22961 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
22962 ASSERT_VK_SUCCESS(err);
22963
22964 }
22965
22966 // BOOM, stack overflow.
22967 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
22968
22969 for (auto fence : fences)
22970 vkDestroyFence(m_device->device(), fence, nullptr);
22971
22972 m_errorMonitor->VerifyNotFound();
22973}
22974#endif
22975
Cody Northrop1242dfd2016-07-13 17:24:59 -060022976#if defined(ANDROID) && defined(VALIDATION_APK)
22977static bool initialized = false;
22978static bool active = false;
22979
22980// Convert Intents to argv
22981// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022982std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022983 std::vector<std::string> args;
22984 JavaVM &vm = *app.activity->vm;
22985 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022986 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060022987
22988 JNIEnv &env = *p_env;
22989 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022990 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060022991 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022992 jmethodID get_string_extra_method =
22993 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060022994 jvalue get_string_extra_args;
22995 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022996 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060022997
22998 std::string args_str;
22999 if (extra_str) {
23000 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23001 args_str = extra_utf;
23002 env.ReleaseStringUTFChars(extra_str, extra_utf);
23003 env.DeleteLocalRef(extra_str);
23004 }
23005
23006 env.DeleteLocalRef(get_string_extra_args.l);
23007 env.DeleteLocalRef(intent);
23008 vm.DetachCurrentThread();
23009
23010 // split args_str
23011 std::stringstream ss(args_str);
23012 std::string arg;
23013 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023014 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023015 }
23016
23017 return args;
23018}
23019
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023020static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023021
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023022static void processCommand(struct android_app *app, int32_t cmd) {
23023 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023024 case APP_CMD_INIT_WINDOW: {
23025 if (app->window) {
23026 initialized = true;
23027 }
23028 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023029 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023030 case APP_CMD_GAINED_FOCUS: {
23031 active = true;
23032 break;
23033 }
23034 case APP_CMD_LOST_FOCUS: {
23035 active = false;
23036 break;
23037 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023038 }
23039}
23040
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023041void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023042 app_dummy();
23043
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023044 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023045
23046 int vulkanSupport = InitVulkan();
23047 if (vulkanSupport == 0) {
23048 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23049 return;
23050 }
23051
23052 app->onAppCmd = processCommand;
23053 app->onInputEvent = processInput;
23054
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023055 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023056 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023057 struct android_poll_source *source;
23058 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023059 if (source) {
23060 source->process(app, source);
23061 }
23062
23063 if (app->destroyRequested != 0) {
23064 VkTestFramework::Finish();
23065 return;
23066 }
23067 }
23068
23069 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023070 // Use the following key to send arguments to gtest, i.e.
23071 // --es args "--gtest_filter=-VkLayerTest.foo"
23072 const char key[] = "args";
23073 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023074
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023075 std::string filter = "";
23076 if (args.size() > 0) {
23077 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23078 filter += args[0];
23079 } else {
23080 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23081 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023082
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023083 int argc = 2;
23084 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23085 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023086
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023087 // Route output to files until we can override the gtest output
23088 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23089 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023090
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023091 ::testing::InitGoogleTest(&argc, argv);
23092 VkTestFramework::InitArgs(&argc, argv);
23093 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023094
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023095 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023097 if (result != 0) {
23098 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23099 } else {
23100 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23101 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023102
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023103 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023104
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023105 fclose(stdout);
23106 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023108 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023109 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023110 }
23111 }
23112}
23113#endif
23114
Tony Barbour300a6082015-04-07 13:44:53 -060023115int main(int argc, char **argv) {
23116 int result;
23117
Cody Northrop8e54a402016-03-08 22:25:52 -070023118#ifdef ANDROID
23119 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023120 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023121#endif
23122
Tony Barbour300a6082015-04-07 13:44:53 -060023123 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023124 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023125
23126 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23127
23128 result = RUN_ALL_TESTS();
23129
Tony Barbour6918cd52015-04-09 12:58:51 -060023130 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023131 return result;
23132}