blob: a1b0beb22cf315992d9bc24a6188ed6c1a6880f3 [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);
Tony Barbour02d08552017-03-24 16:36:01 -06002780 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002781 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 = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 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 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // 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);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5300 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005373 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 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 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 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 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 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // 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 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
6021 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006044TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6045 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006046 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.maxSets = 1;
6058 ds_pool_ci.poolSizeCount = 1;
6059 ds_pool_ci.pPoolSizes = &ds_type_count;
6060
6061 VkDescriptorPool ds_pool;
6062 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6063 ASSERT_VK_SUCCESS(err);
6064
6065 VkDescriptorSetLayoutBinding dsl_binding = {};
6066 dsl_binding.binding = 0;
6067 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6068 dsl_binding.descriptorCount = 1;
6069 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6070 dsl_binding.pImmutableSamplers = NULL;
6071
6072 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6073 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6074 ds_layout_ci.pNext = NULL;
6075 ds_layout_ci.bindingCount = 1;
6076 ds_layout_ci.pBindings = &dsl_binding;
6077 VkDescriptorSetLayout ds_layout;
6078 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6079 ASSERT_VK_SUCCESS(err);
6080
6081 VkDescriptorSet descriptor_set;
6082 VkDescriptorSetAllocateInfo alloc_info = {};
6083 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6084 alloc_info.descriptorSetCount = 1;
6085 alloc_info.descriptorPool = ds_pool;
6086 alloc_info.pSetLayouts = &ds_layout;
6087 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6088 ASSERT_VK_SUCCESS(err);
6089
6090 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6091 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6092 pipeline_layout_ci.pNext = NULL;
6093 pipeline_layout_ci.setLayoutCount = 1;
6094 pipeline_layout_ci.pSetLayouts = &ds_layout;
6095
6096 VkPipelineLayout pipeline_layout;
6097 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6098 ASSERT_VK_SUCCESS(err);
6099
6100 // Create image to update the descriptor with
6101 VkImageObj image(m_device);
6102 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6103 ASSERT_TRUE(image.initialized());
6104
6105 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6106 // Create Sampler
6107 VkSamplerCreateInfo sampler_ci = {};
6108 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6109 sampler_ci.pNext = NULL;
6110 sampler_ci.magFilter = VK_FILTER_NEAREST;
6111 sampler_ci.minFilter = VK_FILTER_NEAREST;
6112 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6113 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6114 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6115 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6116 sampler_ci.mipLodBias = 1.0;
6117 sampler_ci.anisotropyEnable = VK_FALSE;
6118 sampler_ci.maxAnisotropy = 1;
6119 sampler_ci.compareEnable = VK_FALSE;
6120 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6121 sampler_ci.minLod = 1.0;
6122 sampler_ci.maxLod = 1.0;
6123 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6124 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6125 VkSampler sampler;
6126 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6127 ASSERT_VK_SUCCESS(err);
6128 // Update descriptor with image and sampler
6129 VkDescriptorImageInfo img_info = {};
6130 img_info.sampler = sampler;
6131 img_info.imageView = view;
6132 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6133
6134 VkWriteDescriptorSet descriptor_write;
6135 memset(&descriptor_write, 0, sizeof(descriptor_write));
6136 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6137 descriptor_write.dstSet = descriptor_set;
6138 descriptor_write.dstBinding = 0;
6139 descriptor_write.descriptorCount = 1;
6140 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6141 descriptor_write.pImageInfo = &img_info;
6142
6143 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6144
6145 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006146 char const *vsSource =
6147 "#version 450\n"
6148 "\n"
6149 "out gl_PerVertex { \n"
6150 " vec4 gl_Position;\n"
6151 "};\n"
6152 "void main(){\n"
6153 " gl_Position = vec4(1);\n"
6154 "}\n";
6155 char const *fsSource =
6156 "#version 450\n"
6157 "\n"
6158 "layout(set=0, binding=0) uniform sampler2D s;\n"
6159 "layout(location=0) out vec4 x;\n"
6160 "void main(){\n"
6161 " x = texture(s, vec2(1));\n"
6162 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006163 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6164 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6165 VkPipelineObj pipe(m_device);
6166 pipe.AddShader(&vs);
6167 pipe.AddShader(&fs);
6168 pipe.AddColorAttachment();
6169 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6170
Tony Barbour552f6c02016-12-21 14:34:07 -07006171 m_commandBuffer->BeginCommandBuffer();
6172 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006173 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6174 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6175 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006176
6177 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6178 VkRect2D scissor = {{0, 0}, {16, 16}};
6179 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6180 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6181
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006182 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006183 m_commandBuffer->EndRenderPass();
6184 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006185 // Submit cmd buffer to put pool in-flight
6186 VkSubmitInfo submit_info = {};
6187 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6188 submit_info.commandBufferCount = 1;
6189 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6190 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6191 // Destroy pool while in-flight, causing error
6192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6193 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6194 m_errorMonitor->VerifyFound();
6195 vkQueueWaitIdle(m_device->m_queue);
6196 // Cleanup
6197 vkDestroySampler(m_device->device(), sampler, NULL);
6198 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6199 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006200 m_errorMonitor->SetUnexpectedError(
6201 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6202 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006203 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006204 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006205}
6206
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006207TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6208 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006210 ASSERT_NO_FATAL_FAILURE(InitViewport());
6211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6212
6213 VkDescriptorPoolSize ds_type_count = {};
6214 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6215 ds_type_count.descriptorCount = 1;
6216
6217 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6218 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6219 ds_pool_ci.pNext = NULL;
6220 ds_pool_ci.maxSets = 1;
6221 ds_pool_ci.poolSizeCount = 1;
6222 ds_pool_ci.pPoolSizes = &ds_type_count;
6223
6224 VkDescriptorPool ds_pool;
6225 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6226 ASSERT_VK_SUCCESS(err);
6227
6228 VkDescriptorSetLayoutBinding dsl_binding = {};
6229 dsl_binding.binding = 0;
6230 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6231 dsl_binding.descriptorCount = 1;
6232 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6233 dsl_binding.pImmutableSamplers = NULL;
6234
6235 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6236 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6237 ds_layout_ci.pNext = NULL;
6238 ds_layout_ci.bindingCount = 1;
6239 ds_layout_ci.pBindings = &dsl_binding;
6240 VkDescriptorSetLayout ds_layout;
6241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6242 ASSERT_VK_SUCCESS(err);
6243
6244 VkDescriptorSet descriptorSet;
6245 VkDescriptorSetAllocateInfo alloc_info = {};
6246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6247 alloc_info.descriptorSetCount = 1;
6248 alloc_info.descriptorPool = ds_pool;
6249 alloc_info.pSetLayouts = &ds_layout;
6250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6251 ASSERT_VK_SUCCESS(err);
6252
6253 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6254 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6255 pipeline_layout_ci.pNext = NULL;
6256 pipeline_layout_ci.setLayoutCount = 1;
6257 pipeline_layout_ci.pSetLayouts = &ds_layout;
6258
6259 VkPipelineLayout pipeline_layout;
6260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6261 ASSERT_VK_SUCCESS(err);
6262
6263 // Create images to update the descriptor with
6264 VkImage image;
6265 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6266 const int32_t tex_width = 32;
6267 const int32_t tex_height = 32;
6268 VkImageCreateInfo image_create_info = {};
6269 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6270 image_create_info.pNext = NULL;
6271 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6272 image_create_info.format = tex_format;
6273 image_create_info.extent.width = tex_width;
6274 image_create_info.extent.height = tex_height;
6275 image_create_info.extent.depth = 1;
6276 image_create_info.mipLevels = 1;
6277 image_create_info.arrayLayers = 1;
6278 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6279 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6280 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6281 image_create_info.flags = 0;
6282 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6283 ASSERT_VK_SUCCESS(err);
6284 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6285 VkMemoryRequirements memory_reqs;
6286 VkDeviceMemory image_memory;
6287 bool pass;
6288 VkMemoryAllocateInfo memory_info = {};
6289 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6290 memory_info.pNext = NULL;
6291 memory_info.allocationSize = 0;
6292 memory_info.memoryTypeIndex = 0;
6293 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6294 // Allocate enough memory for image
6295 memory_info.allocationSize = memory_reqs.size;
6296 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6297 ASSERT_TRUE(pass);
6298 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6299 ASSERT_VK_SUCCESS(err);
6300 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6301 ASSERT_VK_SUCCESS(err);
6302
6303 VkImageViewCreateInfo image_view_create_info = {};
6304 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6305 image_view_create_info.image = image;
6306 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6307 image_view_create_info.format = tex_format;
6308 image_view_create_info.subresourceRange.layerCount = 1;
6309 image_view_create_info.subresourceRange.baseMipLevel = 0;
6310 image_view_create_info.subresourceRange.levelCount = 1;
6311 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6312
6313 VkImageView view;
6314 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6315 ASSERT_VK_SUCCESS(err);
6316 // Create Samplers
6317 VkSamplerCreateInfo sampler_ci = {};
6318 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6319 sampler_ci.pNext = NULL;
6320 sampler_ci.magFilter = VK_FILTER_NEAREST;
6321 sampler_ci.minFilter = VK_FILTER_NEAREST;
6322 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6323 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6324 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6325 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6326 sampler_ci.mipLodBias = 1.0;
6327 sampler_ci.anisotropyEnable = VK_FALSE;
6328 sampler_ci.maxAnisotropy = 1;
6329 sampler_ci.compareEnable = VK_FALSE;
6330 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6331 sampler_ci.minLod = 1.0;
6332 sampler_ci.maxLod = 1.0;
6333 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6334 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6335 VkSampler sampler;
6336 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6337 ASSERT_VK_SUCCESS(err);
6338 // Update descriptor with image and sampler
6339 VkDescriptorImageInfo img_info = {};
6340 img_info.sampler = sampler;
6341 img_info.imageView = view;
6342 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6343
6344 VkWriteDescriptorSet descriptor_write;
6345 memset(&descriptor_write, 0, sizeof(descriptor_write));
6346 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6347 descriptor_write.dstSet = descriptorSet;
6348 descriptor_write.dstBinding = 0;
6349 descriptor_write.descriptorCount = 1;
6350 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6351 descriptor_write.pImageInfo = &img_info;
6352 // Break memory binding and attempt update
6353 vkFreeMemory(m_device->device(), image_memory, nullptr);
6354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006355 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6357 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6359 m_errorMonitor->VerifyFound();
6360 // Cleanup
6361 vkDestroyImage(m_device->device(), image, NULL);
6362 vkDestroySampler(m_device->device(), sampler, NULL);
6363 vkDestroyImageView(m_device->device(), view, NULL);
6364 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6365 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6366 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6367}
6368
Karl Schultz6addd812016-02-02 17:17:23 -07006369TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006370 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6371 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006372 // Create a valid cmd buffer
6373 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006374 uint64_t fake_pipeline_handle = 0xbaad6001;
6375 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006376 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6378
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006380 m_commandBuffer->BeginCommandBuffer();
6381 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006382 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006383 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006384
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006385 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006386 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 -06006387 Draw(1, 0, 0, 0);
6388 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006389
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006390 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006391 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 -07006392 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006393 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6394 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006395}
6396
Karl Schultz6addd812016-02-02 17:17:23 -07006397TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006398 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006399 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006400
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006402
Tony Barbour1fa09702017-03-16 12:09:08 -06006403 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006404 ASSERT_NO_FATAL_FAILURE(InitViewport());
6405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006406 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006407 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6408 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006409
6410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6412 ds_pool_ci.pNext = NULL;
6413 ds_pool_ci.maxSets = 1;
6414 ds_pool_ci.poolSizeCount = 1;
6415 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006416
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006417 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006418 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006419 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006420
Tony Barboureb254902015-07-15 12:50:33 -06006421 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006422 dsl_binding.binding = 0;
6423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6424 dsl_binding.descriptorCount = 1;
6425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6426 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006427
Tony Barboureb254902015-07-15 12:50:33 -06006428 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006429 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6430 ds_layout_ci.pNext = NULL;
6431 ds_layout_ci.bindingCount = 1;
6432 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006433 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006434 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006435 ASSERT_VK_SUCCESS(err);
6436
6437 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006438 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006439 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006440 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006441 alloc_info.descriptorPool = ds_pool;
6442 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006443 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006444 ASSERT_VK_SUCCESS(err);
6445
Tony Barboureb254902015-07-15 12:50:33 -06006446 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006447 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6448 pipeline_layout_ci.pNext = NULL;
6449 pipeline_layout_ci.setLayoutCount = 1;
6450 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006451
6452 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006453 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006454 ASSERT_VK_SUCCESS(err);
6455
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006456 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006457 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006458 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006459 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006460
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006461 VkPipelineObj pipe(m_device);
6462 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006463 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006464 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006465 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006466
Tony Barbour552f6c02016-12-21 14:34:07 -07006467 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006468 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6470 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006472 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006473
Chia-I Wuf7458c52015-10-26 21:10:41 +08006474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006477}
6478
Karl Schultz6addd812016-02-02 17:17:23 -07006479TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006480 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006481 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006482
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006484
Tony Barbour1fa09702017-03-16 12:09:08 -06006485 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006486 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006487 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6488 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006489
6490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6492 ds_pool_ci.pNext = NULL;
6493 ds_pool_ci.maxSets = 1;
6494 ds_pool_ci.poolSizeCount = 1;
6495 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006496
6497 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006498 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006499 ASSERT_VK_SUCCESS(err);
6500
6501 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006502 dsl_binding.binding = 0;
6503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6504 dsl_binding.descriptorCount = 1;
6505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6506 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006507
6508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6510 ds_layout_ci.pNext = NULL;
6511 ds_layout_ci.bindingCount = 1;
6512 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006513 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006515 ASSERT_VK_SUCCESS(err);
6516
6517 VkDescriptorSet descriptorSet;
6518 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006519 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006520 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006521 alloc_info.descriptorPool = ds_pool;
6522 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006523 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006524 ASSERT_VK_SUCCESS(err);
6525
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006526 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006527 VkWriteDescriptorSet descriptor_write;
6528 memset(&descriptor_write, 0, sizeof(descriptor_write));
6529 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6530 descriptor_write.dstSet = descriptorSet;
6531 descriptor_write.dstBinding = 0;
6532 descriptor_write.descriptorCount = 1;
6533 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6534 descriptor_write.pTexelBufferView = &view;
6535
6536 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006538 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006539
6540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6542}
6543
Mark Youngd339ba32016-05-30 13:28:35 -06006544TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006545 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 -06006546
6547 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006549 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006550
Tony Barbour1fa09702017-03-16 12:09:08 -06006551 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006552
6553 // Create a buffer with no bound memory and then attempt to create
6554 // a buffer view.
6555 VkBufferCreateInfo buff_ci = {};
6556 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006557 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006558 buff_ci.size = 256;
6559 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6560 VkBuffer buffer;
6561 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6562 ASSERT_VK_SUCCESS(err);
6563
6564 VkBufferViewCreateInfo buff_view_ci = {};
6565 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6566 buff_view_ci.buffer = buffer;
6567 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6568 buff_view_ci.range = VK_WHOLE_SIZE;
6569 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006570 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006571
6572 m_errorMonitor->VerifyFound();
6573 vkDestroyBuffer(m_device->device(), buffer, NULL);
6574 // If last error is success, it still created the view, so delete it.
6575 if (err == VK_SUCCESS) {
6576 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6577 }
6578}
6579
Karl Schultz6addd812016-02-02 17:17:23 -07006580TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6581 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6582 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006583 // 1. No dynamicOffset supplied
6584 // 2. Too many dynamicOffsets supplied
6585 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006586 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6588 " requires 1 dynamicOffsets, but only "
6589 "0 dynamicOffsets are left in "
6590 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006591
Tony Barbour1fa09702017-03-16 12:09:08 -06006592 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006593 ASSERT_NO_FATAL_FAILURE(InitViewport());
6594 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6595
6596 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006597 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6598 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006599
6600 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006601 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6602 ds_pool_ci.pNext = NULL;
6603 ds_pool_ci.maxSets = 1;
6604 ds_pool_ci.poolSizeCount = 1;
6605 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006606
6607 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006609 ASSERT_VK_SUCCESS(err);
6610
6611 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006612 dsl_binding.binding = 0;
6613 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6614 dsl_binding.descriptorCount = 1;
6615 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6616 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006617
6618 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006619 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6620 ds_layout_ci.pNext = NULL;
6621 ds_layout_ci.bindingCount = 1;
6622 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006623 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006624 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006625 ASSERT_VK_SUCCESS(err);
6626
6627 VkDescriptorSet descriptorSet;
6628 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006629 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006630 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006631 alloc_info.descriptorPool = ds_pool;
6632 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006634 ASSERT_VK_SUCCESS(err);
6635
6636 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006637 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6638 pipeline_layout_ci.pNext = NULL;
6639 pipeline_layout_ci.setLayoutCount = 1;
6640 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006641
6642 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006643 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006644 ASSERT_VK_SUCCESS(err);
6645
6646 // Create a buffer to update the descriptor with
6647 uint32_t qfi = 0;
6648 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006649 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6650 buffCI.size = 1024;
6651 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6652 buffCI.queueFamilyIndexCount = 1;
6653 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006654
6655 VkBuffer dyub;
6656 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6657 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006658 // Allocate memory and bind to buffer so we can make it to the appropriate
6659 // error
6660 VkMemoryAllocateInfo mem_alloc = {};
6661 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6662 mem_alloc.pNext = NULL;
6663 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006664 mem_alloc.memoryTypeIndex = 0;
6665
6666 VkMemoryRequirements memReqs;
6667 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006668 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006669 if (!pass) {
6670 vkDestroyBuffer(m_device->device(), dyub, NULL);
6671 return;
6672 }
6673
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006674 VkDeviceMemory mem;
6675 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6676 ASSERT_VK_SUCCESS(err);
6677 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6678 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006679 // Correctly update descriptor to avoid "NOT_UPDATED" error
6680 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006681 buffInfo.buffer = dyub;
6682 buffInfo.offset = 0;
6683 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006684
6685 VkWriteDescriptorSet descriptor_write;
6686 memset(&descriptor_write, 0, sizeof(descriptor_write));
6687 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6688 descriptor_write.dstSet = descriptorSet;
6689 descriptor_write.dstBinding = 0;
6690 descriptor_write.descriptorCount = 1;
6691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6692 descriptor_write.pBufferInfo = &buffInfo;
6693
6694 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6695
Tony Barbour552f6c02016-12-21 14:34:07 -07006696 m_commandBuffer->BeginCommandBuffer();
6697 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006698 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6699 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006700 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006701 uint32_t pDynOff[2] = {512, 756};
6702 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6704 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6706 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006707 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006708 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6710 " dynamic offset 512 combined with "
6711 "offset 0 and range 1024 that "
6712 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006713 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006714 char const *vsSource =
6715 "#version 450\n"
6716 "\n"
6717 "out gl_PerVertex { \n"
6718 " vec4 gl_Position;\n"
6719 "};\n"
6720 "void main(){\n"
6721 " gl_Position = vec4(1);\n"
6722 "}\n";
6723 char const *fsSource =
6724 "#version 450\n"
6725 "\n"
6726 "layout(location=0) out vec4 x;\n"
6727 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6728 "void main(){\n"
6729 " x = vec4(bar.y);\n"
6730 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006731 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6732 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6733 VkPipelineObj pipe(m_device);
6734 pipe.AddShader(&vs);
6735 pipe.AddShader(&fs);
6736 pipe.AddColorAttachment();
6737 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6738
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006739 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6740 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6741 VkRect2D scissor = {{0, 0}, {16, 16}};
6742 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006744 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006745 // This update should succeed, but offset size of 512 will overstep buffer
6746 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006747 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6748 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006749 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006750 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006751
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006752 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006753 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006754
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006755 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6758}
6759
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006760TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006761 TEST_DESCRIPTION(
6762 "Attempt to update a descriptor with a non-sparse buffer "
6763 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006764 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006766 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006769
Tony Barbour1fa09702017-03-16 12:09:08 -06006770 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006771 ASSERT_NO_FATAL_FAILURE(InitViewport());
6772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6773
6774 VkDescriptorPoolSize ds_type_count = {};
6775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6776 ds_type_count.descriptorCount = 1;
6777
6778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6780 ds_pool_ci.pNext = NULL;
6781 ds_pool_ci.maxSets = 1;
6782 ds_pool_ci.poolSizeCount = 1;
6783 ds_pool_ci.pPoolSizes = &ds_type_count;
6784
6785 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006786 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006787 ASSERT_VK_SUCCESS(err);
6788
6789 VkDescriptorSetLayoutBinding dsl_binding = {};
6790 dsl_binding.binding = 0;
6791 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6792 dsl_binding.descriptorCount = 1;
6793 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6794 dsl_binding.pImmutableSamplers = NULL;
6795
6796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6797 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6798 ds_layout_ci.pNext = NULL;
6799 ds_layout_ci.bindingCount = 1;
6800 ds_layout_ci.pBindings = &dsl_binding;
6801 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006802 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006803 ASSERT_VK_SUCCESS(err);
6804
6805 VkDescriptorSet descriptorSet;
6806 VkDescriptorSetAllocateInfo alloc_info = {};
6807 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6808 alloc_info.descriptorSetCount = 1;
6809 alloc_info.descriptorPool = ds_pool;
6810 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006811 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006812 ASSERT_VK_SUCCESS(err);
6813
6814 // Create a buffer to update the descriptor with
6815 uint32_t qfi = 0;
6816 VkBufferCreateInfo buffCI = {};
6817 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6818 buffCI.size = 1024;
6819 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6820 buffCI.queueFamilyIndexCount = 1;
6821 buffCI.pQueueFamilyIndices = &qfi;
6822
6823 VkBuffer dyub;
6824 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6825 ASSERT_VK_SUCCESS(err);
6826
6827 // Attempt to update descriptor without binding memory to it
6828 VkDescriptorBufferInfo buffInfo = {};
6829 buffInfo.buffer = dyub;
6830 buffInfo.offset = 0;
6831 buffInfo.range = 1024;
6832
6833 VkWriteDescriptorSet descriptor_write;
6834 memset(&descriptor_write, 0, sizeof(descriptor_write));
6835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6836 descriptor_write.dstSet = descriptorSet;
6837 descriptor_write.dstBinding = 0;
6838 descriptor_write.descriptorCount = 1;
6839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6840 descriptor_write.pBufferInfo = &buffInfo;
6841
6842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6843 m_errorMonitor->VerifyFound();
6844
6845 vkDestroyBuffer(m_device->device(), dyub, NULL);
6846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6847 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6848}
6849
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006850TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006851 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006852 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006853 ASSERT_NO_FATAL_FAILURE(InitViewport());
6854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6855
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006856 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006857 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6860 pipeline_layout_ci.pushConstantRangeCount = 1;
6861 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6862
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006863 //
6864 // Check for invalid push constant ranges in pipeline layouts.
6865 //
6866 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006867 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006868 char const *msg;
6869 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006870
Karl Schultzc81037d2016-05-12 08:11:23 -06006871 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6872 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6873 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6874 "vkCreatePipelineLayout() call has push constants index 0 with "
6875 "size 0."},
6876 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6877 "vkCreatePipelineLayout() call has push constants index 0 with "
6878 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006879 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006880 "vkCreatePipelineLayout() call has push constants index 0 with "
6881 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006882 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006883 "vkCreatePipelineLayout() call has push constants index 0 with "
6884 "size 0."},
6885 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6886 "vkCreatePipelineLayout() call has push constants index 0 with "
6887 "offset 1. Offset must"},
6888 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6889 "vkCreatePipelineLayout() call has push constants index 0 "
6890 "with offset "},
6891 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6892 "vkCreatePipelineLayout() call has push constants "
6893 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006894 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006895 "vkCreatePipelineLayout() call has push constants index 0 "
6896 "with offset "},
6897 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6898 "vkCreatePipelineLayout() call has push "
6899 "constants index 0 with offset "},
6900 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6901 "vkCreatePipelineLayout() call has push "
6902 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006903 }};
6904
6905 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006906 for (const auto &iter : range_tests) {
6907 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6909 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006910 m_errorMonitor->VerifyFound();
6911 if (VK_SUCCESS == err) {
6912 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6913 }
6914 }
6915
6916 // Check for invalid stage flag
6917 pc_range.offset = 0;
6918 pc_range.size = 16;
6919 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006920 m_errorMonitor->SetDesiredFailureMsg(
6921 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6922 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006924 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006925 if (VK_SUCCESS == err) {
6926 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6927 }
6928
Karl Schultzc59b72d2017-02-24 15:45:05 -07006929 // Check for duplicate stage flags in a list of push constant ranges.
6930 // A shader can only have one push constant block and that block is mapped
6931 // to the push constant range that has that shader's stage flag set.
6932 // The shader's stage flag can only appear once in all the ranges, so the
6933 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006934 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006935 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006936 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006937 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006938 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006939 // Overlapping ranges are OK, but a stage flag can appear only once.
6940 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6941 {
6942 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6943 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6944 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6945 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006946 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006947 {
6948 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6949 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6950 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6951 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6952 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6953 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6954 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6955 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6956 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6957 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6958 }},
6959 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6960 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6961 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6962 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6963 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6964 {
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6966 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6967 }},
6968 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6969 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6970 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6971 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6972 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6973 {
6974 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6975 }},
6976 },
6977 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006978
Karl Schultzc59b72d2017-02-24 15:45:05 -07006979 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006980 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006981 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006983 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006984 m_errorMonitor->VerifyFound();
6985 if (VK_SUCCESS == err) {
6986 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6987 }
6988 }
6989
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006990 //
6991 // CmdPushConstants tests
6992 //
6993
Karl Schultzc59b72d2017-02-24 15:45:05 -07006994 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006995 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07006996 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006997 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006998 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006999 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007000 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007001 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007002
7003 const uint8_t dummy_values[100] = {};
7004
7005 m_commandBuffer->BeginCommandBuffer();
7006 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007007
7008 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007009 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007011 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007012 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007013
Karl Schultzc59b72d2017-02-24 15:45:05 -07007014 m_errorMonitor->ExpectSuccess();
7015 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7016 m_errorMonitor->VerifyNotFound();
7017 m_errorMonitor->ExpectSuccess();
7018 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7019 m_errorMonitor->VerifyNotFound();
7020 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7021 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7022 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7023 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7024 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7025 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7026 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007027 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007028 for (const auto &iter : cmd_range_tests) {
7029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7030 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7031 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007032 m_errorMonitor->VerifyFound();
7033 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007034
Tony Barbour552f6c02016-12-21 14:34:07 -07007035 m_commandBuffer->EndRenderPass();
7036 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007037 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038}
7039
Karl Schultz6addd812016-02-02 17:17:23 -07007040TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007041 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007042 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007043
Tony Barbour1fa09702017-03-16 12:09:08 -06007044 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007045 ASSERT_NO_FATAL_FAILURE(InitViewport());
7046 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7047
7048 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7049 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007050 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7051 ds_type_count[0].descriptorCount = 10;
7052 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7053 ds_type_count[1].descriptorCount = 2;
7054 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7055 ds_type_count[2].descriptorCount = 2;
7056 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7057 ds_type_count[3].descriptorCount = 5;
7058 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7059 // type
7060 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7061 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7062 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007063
7064 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007065 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7066 ds_pool_ci.pNext = NULL;
7067 ds_pool_ci.maxSets = 5;
7068 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7069 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007070
7071 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007072 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007073 ASSERT_VK_SUCCESS(err);
7074
7075 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7076 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007077 dsl_binding[0].binding = 0;
7078 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7079 dsl_binding[0].descriptorCount = 5;
7080 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7081 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007082
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007083 // Create layout identical to set0 layout but w/ different stageFlags
7084 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007085 dsl_fs_stage_only.binding = 0;
7086 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7087 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007088 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7089 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007090 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007091 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007092 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7093 ds_layout_ci.pNext = NULL;
7094 ds_layout_ci.bindingCount = 1;
7095 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007096 static const uint32_t NUM_LAYOUTS = 4;
7097 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007098 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007099 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7100 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007102 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007103 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007104 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007105 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007106 dsl_binding[0].binding = 0;
7107 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007108 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007109 dsl_binding[1].binding = 1;
7110 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7111 dsl_binding[1].descriptorCount = 2;
7112 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7113 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007114 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007115 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007116 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007117 ASSERT_VK_SUCCESS(err);
7118 dsl_binding[0].binding = 0;
7119 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007120 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007121 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007123 ASSERT_VK_SUCCESS(err);
7124 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007125 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007127 ASSERT_VK_SUCCESS(err);
7128
7129 static const uint32_t NUM_SETS = 4;
7130 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7131 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007133 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007134 alloc_info.descriptorPool = ds_pool;
7135 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007137 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007138 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007139 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007140 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007141 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007142 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007143
7144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7146 pipeline_layout_ci.pNext = NULL;
7147 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7148 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007149
7150 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007151 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007152 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007153 // Create pipelineLayout with only one setLayout
7154 pipeline_layout_ci.setLayoutCount = 1;
7155 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007156 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007157 ASSERT_VK_SUCCESS(err);
7158 // Create pipelineLayout with 2 descriptor setLayout at index 0
7159 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7160 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007161 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007162 ASSERT_VK_SUCCESS(err);
7163 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7164 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7165 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007166 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007167 ASSERT_VK_SUCCESS(err);
7168 // Create pipelineLayout with UB type, but stageFlags for FS only
7169 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7170 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007171 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007172 ASSERT_VK_SUCCESS(err);
7173 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7174 VkDescriptorSetLayout pl_bad_s0[2] = {};
7175 pl_bad_s0[0] = ds_layout_fs_only;
7176 pl_bad_s0[1] = ds_layout[1];
7177 pipeline_layout_ci.setLayoutCount = 2;
7178 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7179 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007181 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007182
Tobin Ehlis88452832015-12-03 09:40:56 -07007183 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007184 char const *vsSource =
7185 "#version 450\n"
7186 "\n"
7187 "out gl_PerVertex {\n"
7188 " vec4 gl_Position;\n"
7189 "};\n"
7190 "void main(){\n"
7191 " gl_Position = vec4(1);\n"
7192 "}\n";
7193 char const *fsSource =
7194 "#version 450\n"
7195 "\n"
7196 "layout(location=0) out vec4 x;\n"
7197 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7198 "void main(){\n"
7199 " x = vec4(bar.y);\n"
7200 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007201 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7202 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007203 VkPipelineObj pipe(m_device);
7204 pipe.AddShader(&vs);
7205 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007206 pipe.AddColorAttachment();
7207 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007208
Tony Barbour552f6c02016-12-21 14:34:07 -07007209 m_commandBuffer->BeginCommandBuffer();
7210 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007211
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007212 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007213 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7214 // of PSO
7215 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7216 // cmd_pipeline.c
7217 // due to the fact that cmd_alloc_dset_data() has not been called in
7218 // cmd_bind_graphics_pipeline()
7219 // TODO : Want to cause various binding incompatibility issues here to test
7220 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // First cause various verify_layout_compatibility() fails
7222 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007223 // verify_set_layout_compatibility fail cases:
7224 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007226 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7227 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007228 m_errorMonitor->VerifyFound();
7229
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007230 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7232 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7233 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007234 m_errorMonitor->VerifyFound();
7235
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007236 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007237 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7238 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7240 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7241 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007242 m_errorMonitor->VerifyFound();
7243
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007244 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7245 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7247 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7248 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007249 m_errorMonitor->VerifyFound();
7250
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007251 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7252 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7254 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7255 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7256 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007257 m_errorMonitor->VerifyFound();
7258
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007259 // Cause INFO messages due to disturbing previously bound Sets
7260 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007261 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7262 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7265 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7266 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007267 m_errorMonitor->VerifyFound();
7268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007269 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7270 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007271 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7273 " newly bound as set #0 so set #1 and "
7274 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007275 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7276 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007277 m_errorMonitor->VerifyFound();
7278
Tobin Ehlis10fad692016-07-07 12:00:36 -06007279 // Now that we're done actively using the pipelineLayout that gfx pipeline
7280 // was created with, we should be able to delete it. Do that now to verify
7281 // that validation obeys pipelineLayout lifetime
7282 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7283
Tobin Ehlis88452832015-12-03 09:40:56 -07007284 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007285 // 1. Error due to not binding required set (we actually use same code as
7286 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007287 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7288 &descriptorSet[0], 0, NULL);
7289 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7290 &descriptorSet[1], 0, NULL);
7291 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 -07007292
7293 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7294 VkRect2D scissor = {{0, 0}, {16, 16}};
7295 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7296 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7297
Tobin Ehlis88452832015-12-03 09:40:56 -07007298 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007299 m_errorMonitor->VerifyFound();
7300
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007301 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007302 // 2. Error due to bound set not being compatible with PSO's
7303 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007304 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7305 &descriptorSet[0], 0, NULL);
7306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007307 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007308 m_errorMonitor->VerifyFound();
7309
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007310 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007311 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7313 }
7314 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007315 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7316 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7317}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318
Karl Schultz6addd812016-02-02 17:17:23 -07007319TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7321 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007322
Tony Barbour1fa09702017-03-16 12:09:08 -06007323 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007324 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007325 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007326 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007328 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007329}
7330
Karl Schultz6addd812016-02-02 17:17:23 -07007331TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7332 VkResult err;
7333 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007334
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007336
Tony Barbour1fa09702017-03-16 12:09:08 -06007337 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007338
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007339 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007340 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007341 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007342 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007343 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007344 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007345
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007346 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007347 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007348
7349 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007350 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007351 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7352
7353 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007354 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007355 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007356 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 -07007357 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007358
7359 // The error should be caught by validation of the BeginCommandBuffer call
7360 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7361
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007362 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007363 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007364}
7365
Karl Schultz6addd812016-02-02 17:17:23 -07007366TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007367 // Cause error due to Begin while recording CB
7368 // Then cause 2 errors for attempting to reset CB w/o having
7369 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7370 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007372
Tony Barbour1fa09702017-03-16 12:09:08 -06007373 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007374
7375 // Calls AllocateCommandBuffers
7376 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7377
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007378 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007379 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007380 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7381 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007382 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7383 cmd_buf_info.pNext = NULL;
7384 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007385 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007386
7387 // Begin CB to transition to recording state
7388 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7389 // Can't re-begin. This should trigger error
7390 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007391 m_errorMonitor->VerifyFound();
7392
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007394 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007395 // Reset attempt will trigger error due to incorrect CommandPool state
7396 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007397 m_errorMonitor->VerifyFound();
7398
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007400 // Transition CB to RECORDED state
7401 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7402 // Now attempting to Begin will implicitly reset, which triggers error
7403 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007404 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007405}
7406
Karl Schultz6addd812016-02-02 17:17:23 -07007407TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007408 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007409 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007410
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7412 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007413
Tony Barbour1fa09702017-03-16 12:09:08 -06007414 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007416
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007417 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007418 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7419 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007420
7421 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007422 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7423 ds_pool_ci.pNext = NULL;
7424 ds_pool_ci.maxSets = 1;
7425 ds_pool_ci.poolSizeCount = 1;
7426 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007427
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007428 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007429 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007430 ASSERT_VK_SUCCESS(err);
7431
Tony Barboureb254902015-07-15 12:50:33 -06007432 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007433 dsl_binding.binding = 0;
7434 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7435 dsl_binding.descriptorCount = 1;
7436 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7437 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007438
Tony Barboureb254902015-07-15 12:50:33 -06007439 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007440 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7441 ds_layout_ci.pNext = NULL;
7442 ds_layout_ci.bindingCount = 1;
7443 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007444
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007445 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007447 ASSERT_VK_SUCCESS(err);
7448
7449 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007450 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007451 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007452 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007453 alloc_info.descriptorPool = ds_pool;
7454 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007456 ASSERT_VK_SUCCESS(err);
7457
Tony Barboureb254902015-07-15 12:50:33 -06007458 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007459 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7460 pipeline_layout_ci.setLayoutCount = 1;
7461 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007462
7463 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007464 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007465 ASSERT_VK_SUCCESS(err);
7466
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007467 VkViewport vp = {}; // Just need dummy vp to point to
7468 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007469
7470 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007471 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7472 vp_state_ci.scissorCount = 1;
7473 vp_state_ci.pScissors = &sc;
7474 vp_state_ci.viewportCount = 1;
7475 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007476
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007477 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7478 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7479 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7480 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7481 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7482 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007483 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007484 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007485 rs_state_ci.lineWidth = 1.0f;
7486
7487 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7488 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7489 vi_ci.pNext = nullptr;
7490 vi_ci.vertexBindingDescriptionCount = 0;
7491 vi_ci.pVertexBindingDescriptions = nullptr;
7492 vi_ci.vertexAttributeDescriptionCount = 0;
7493 vi_ci.pVertexAttributeDescriptions = nullptr;
7494
7495 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7496 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7497 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7498
7499 VkPipelineShaderStageCreateInfo shaderStages[2];
7500 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7501
7502 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7503 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007504 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007505 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007506
Tony Barboureb254902015-07-15 12:50:33 -06007507 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007508 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7509 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007510 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007511 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7512 gp_ci.layout = pipeline_layout;
7513 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007514 gp_ci.pVertexInputState = &vi_ci;
7515 gp_ci.pInputAssemblyState = &ia_ci;
7516
7517 gp_ci.stageCount = 1;
7518 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007519
7520 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007521 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7522 pc_ci.initialDataSize = 0;
7523 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007524
7525 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007526 VkPipelineCache pipelineCache;
7527
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007528 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007529 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007531 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007532
Chia-I Wuf7458c52015-10-26 21:10:41 +08007533 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7534 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7535 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7536 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007537}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007538
Tobin Ehlis912df022015-09-17 08:46:18 -06007539/*// TODO : This test should be good, but needs Tess support in compiler to run
7540TEST_F(VkLayerTest, InvalidPatchControlPoints)
7541{
7542 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007543 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007544
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007546 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7547primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007548
Tony Barbour1fa09702017-03-16 12:09:08 -06007549 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007551
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007552 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007553 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007554 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007555
7556 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7557 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7558 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007559 ds_pool_ci.poolSizeCount = 1;
7560 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007561
7562 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007563 err = vkCreateDescriptorPool(m_device->device(),
7564VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007565 ASSERT_VK_SUCCESS(err);
7566
7567 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007568 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007569 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007570 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007571 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7572 dsl_binding.pImmutableSamplers = NULL;
7573
7574 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007575 ds_layout_ci.sType =
7576VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007577 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007578 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007579 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007580
7581 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007582 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7583&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007584 ASSERT_VK_SUCCESS(err);
7585
7586 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007587 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7588VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007589 ASSERT_VK_SUCCESS(err);
7590
7591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007592 pipeline_layout_ci.sType =
7593VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007594 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007595 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007596 pipeline_layout_ci.pSetLayouts = &ds_layout;
7597
7598 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007599 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7600&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007601 ASSERT_VK_SUCCESS(err);
7602
7603 VkPipelineShaderStageCreateInfo shaderStages[3];
7604 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7605
Karl Schultz6addd812016-02-02 17:17:23 -07007606 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7607this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007608 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007609 VkShaderObj
7610tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7611this);
7612 VkShaderObj
7613te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7614this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007615
Karl Schultz6addd812016-02-02 17:17:23 -07007616 shaderStages[0].sType =
7617VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007618 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007619 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007620 shaderStages[1].sType =
7621VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007622 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007623 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007624 shaderStages[2].sType =
7625VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007626 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007627 shaderStages[2].shader = te.handle();
7628
7629 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007630 iaCI.sType =
7631VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007632 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007633
7634 VkPipelineTessellationStateCreateInfo tsCI = {};
7635 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7636 tsCI.patchControlPoints = 0; // This will cause an error
7637
7638 VkGraphicsPipelineCreateInfo gp_ci = {};
7639 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7640 gp_ci.pNext = NULL;
7641 gp_ci.stageCount = 3;
7642 gp_ci.pStages = shaderStages;
7643 gp_ci.pVertexInputState = NULL;
7644 gp_ci.pInputAssemblyState = &iaCI;
7645 gp_ci.pTessellationState = &tsCI;
7646 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007647 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007648 gp_ci.pMultisampleState = NULL;
7649 gp_ci.pDepthStencilState = NULL;
7650 gp_ci.pColorBlendState = NULL;
7651 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7652 gp_ci.layout = pipeline_layout;
7653 gp_ci.renderPass = renderPass();
7654
7655 VkPipelineCacheCreateInfo pc_ci = {};
7656 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7657 pc_ci.pNext = NULL;
7658 pc_ci.initialSize = 0;
7659 pc_ci.initialData = 0;
7660 pc_ci.maxSize = 0;
7661
7662 VkPipeline pipeline;
7663 VkPipelineCache pipelineCache;
7664
Karl Schultz6addd812016-02-02 17:17:23 -07007665 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7666&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007667 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007668 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7669&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007670
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007671 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007672
Chia-I Wuf7458c52015-10-26 21:10:41 +08007673 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7674 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7675 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7676 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007677}
7678*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007679
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007680TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007681 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007682
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007683 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007684
Tony Barbour1fa09702017-03-16 12:09:08 -06007685 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007687
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007688 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007689 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7690 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691
7692 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007693 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7694 ds_pool_ci.maxSets = 1;
7695 ds_pool_ci.poolSizeCount = 1;
7696 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007697
7698 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007699 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007700 ASSERT_VK_SUCCESS(err);
7701
7702 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007703 dsl_binding.binding = 0;
7704 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7705 dsl_binding.descriptorCount = 1;
7706 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007707
7708 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007709 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7710 ds_layout_ci.bindingCount = 1;
7711 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007712
7713 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007715 ASSERT_VK_SUCCESS(err);
7716
7717 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007718 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007720 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007721 alloc_info.descriptorPool = ds_pool;
7722 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007724 ASSERT_VK_SUCCESS(err);
7725
7726 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007727 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7728 pipeline_layout_ci.setLayoutCount = 1;
7729 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007730
7731 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007732 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007733 ASSERT_VK_SUCCESS(err);
7734
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007735 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007736 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007737 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007738 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007739 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007740 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007741
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007742 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7743 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7744 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7745 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7746 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7747 rs_state_ci.depthClampEnable = VK_FALSE;
7748 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7749 rs_state_ci.depthBiasEnable = VK_FALSE;
7750
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007751 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7752 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7753 vi_ci.pNext = nullptr;
7754 vi_ci.vertexBindingDescriptionCount = 0;
7755 vi_ci.pVertexBindingDescriptions = nullptr;
7756 vi_ci.vertexAttributeDescriptionCount = 0;
7757 vi_ci.pVertexAttributeDescriptions = nullptr;
7758
7759 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7760 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7761 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7762
7763 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7764 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7765 pipe_ms_state_ci.pNext = NULL;
7766 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7767 pipe_ms_state_ci.sampleShadingEnable = 0;
7768 pipe_ms_state_ci.minSampleShading = 1.0;
7769 pipe_ms_state_ci.pSampleMask = NULL;
7770
Cody Northropeb3a6c12015-10-05 14:44:45 -06007771 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007772 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007774 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007775 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007776 shaderStages[0] = vs.GetStageCreateInfo();
7777 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007778
7779 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007780 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7781 gp_ci.stageCount = 2;
7782 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007783 gp_ci.pVertexInputState = &vi_ci;
7784 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007785 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007786 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007787 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007788 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7789 gp_ci.layout = pipeline_layout;
7790 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007791
7792 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007793 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007794
7795 VkPipeline pipeline;
7796 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007797 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007798 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007799
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007800 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007801 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007802
7803 // Check case where multiViewport is disabled and viewport count is not 1
7804 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7807 vp_state_ci.scissorCount = 0;
7808 vp_state_ci.viewportCount = 0;
7809 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7810 m_errorMonitor->VerifyFound();
7811 } else {
7812 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007813 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007814 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007815 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007816
7817 // Check is that viewportcount and scissorcount match
7818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7819 vp_state_ci.scissorCount = 1;
7820 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7821 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7822 m_errorMonitor->VerifyFound();
7823
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007824 // Check case where multiViewport is enabled and viewport count is greater than max
7825 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7828 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7829 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7830 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7831 m_errorMonitor->VerifyFound();
7832 }
7833 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007834
Chia-I Wuf7458c52015-10-26 21:10:41 +08007835 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7836 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7837 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7838 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007839}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007840
7841// 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
7842// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007843TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007844 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007845
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007846 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7847
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007849
Tony Barbour1fa09702017-03-16 12:09:08 -06007850 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007852
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007853 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007854 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7855 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007856
7857 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007858 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7859 ds_pool_ci.maxSets = 1;
7860 ds_pool_ci.poolSizeCount = 1;
7861 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007862
7863 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007864 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007865 ASSERT_VK_SUCCESS(err);
7866
7867 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007868 dsl_binding.binding = 0;
7869 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7870 dsl_binding.descriptorCount = 1;
7871 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007872
7873 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007874 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7875 ds_layout_ci.bindingCount = 1;
7876 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007877
7878 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007879 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007880 ASSERT_VK_SUCCESS(err);
7881
7882 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007883 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007884 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007885 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007886 alloc_info.descriptorPool = ds_pool;
7887 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007888 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007889 ASSERT_VK_SUCCESS(err);
7890
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007891 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7892 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7893 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7894
7895 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7896 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7897 vi_ci.pNext = nullptr;
7898 vi_ci.vertexBindingDescriptionCount = 0;
7899 vi_ci.pVertexBindingDescriptions = nullptr;
7900 vi_ci.vertexAttributeDescriptionCount = 0;
7901 vi_ci.pVertexAttributeDescriptions = nullptr;
7902
7903 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7904 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7905 pipe_ms_state_ci.pNext = NULL;
7906 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7907 pipe_ms_state_ci.sampleShadingEnable = 0;
7908 pipe_ms_state_ci.minSampleShading = 1.0;
7909 pipe_ms_state_ci.pSampleMask = NULL;
7910
Tobin Ehlise68360f2015-10-01 11:15:13 -06007911 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007912 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7913 pipeline_layout_ci.setLayoutCount = 1;
7914 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007915
7916 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007917 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007918 ASSERT_VK_SUCCESS(err);
7919
7920 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7921 // Set scissor as dynamic to avoid second error
7922 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007923 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7924 dyn_state_ci.dynamicStateCount = 1;
7925 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007926
Cody Northropeb3a6c12015-10-05 14:44:45 -06007927 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007928 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007929
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007930 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007931 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7932 // 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 +08007933 shaderStages[0] = vs.GetStageCreateInfo();
7934 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007935
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007936 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7937 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7938 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7939 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7940 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7941 rs_state_ci.depthClampEnable = VK_FALSE;
7942 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7943 rs_state_ci.depthBiasEnable = VK_FALSE;
7944
Tobin Ehlise68360f2015-10-01 11:15:13 -06007945 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007946 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7947 gp_ci.stageCount = 2;
7948 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007949 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007950 // Not setting VP state w/o dynamic vp state should cause validation error
7951 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007952 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007953 gp_ci.pVertexInputState = &vi_ci;
7954 gp_ci.pInputAssemblyState = &ia_ci;
7955 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7957 gp_ci.layout = pipeline_layout;
7958 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007959
7960 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007961 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007962
7963 VkPipeline pipeline;
7964 VkPipelineCache pipelineCache;
7965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007966 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007967 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007968 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007970 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971
Chia-I Wuf7458c52015-10-26 21:10:41 +08007972 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7973 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007976}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007977
7978// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7979// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007980TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7981 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007982
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007984
Tony Barbour1fa09702017-03-16 12:09:08 -06007985 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007986
7987 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007988 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007989 return;
7990 }
7991
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007993
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007994 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007995 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7996 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007997
7998 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007999 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8000 ds_pool_ci.maxSets = 1;
8001 ds_pool_ci.poolSizeCount = 1;
8002 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008003
8004 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008005 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008006 ASSERT_VK_SUCCESS(err);
8007
8008 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 dsl_binding.binding = 0;
8010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8011 dsl_binding.descriptorCount = 1;
8012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008013
8014 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8016 ds_layout_ci.bindingCount = 1;
8017 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008018
8019 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008020 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008021 ASSERT_VK_SUCCESS(err);
8022
8023 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008024 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008025 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008026 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008027 alloc_info.descriptorPool = ds_pool;
8028 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008029 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008030 ASSERT_VK_SUCCESS(err);
8031
8032 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008033 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8034 pipeline_layout_ci.setLayoutCount = 1;
8035 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036
8037 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008038 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008039 ASSERT_VK_SUCCESS(err);
8040
8041 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008042 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8043 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008044 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008045 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008046 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008047
8048 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8049 // Set scissor as dynamic to avoid that error
8050 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008051 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8052 dyn_state_ci.dynamicStateCount = 1;
8053 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008054
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008055 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8056 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8057 pipe_ms_state_ci.pNext = NULL;
8058 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8059 pipe_ms_state_ci.sampleShadingEnable = 0;
8060 pipe_ms_state_ci.minSampleShading = 1.0;
8061 pipe_ms_state_ci.pSampleMask = NULL;
8062
Cody Northropeb3a6c12015-10-05 14:44:45 -06008063 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008064 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008065
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008066 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008067 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8068 // 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 +08008069 shaderStages[0] = vs.GetStageCreateInfo();
8070 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008071
Cody Northropf6622dc2015-10-06 10:33:21 -06008072 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8073 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8074 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008075 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008076 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008077 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008078 vi_ci.pVertexAttributeDescriptions = nullptr;
8079
8080 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8081 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8082 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008084 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008085 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008086 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008087 rs_ci.pNext = nullptr;
8088
Mark Youngc89c6312016-03-31 16:03:20 -06008089 VkPipelineColorBlendAttachmentState att = {};
8090 att.blendEnable = VK_FALSE;
8091 att.colorWriteMask = 0xf;
8092
Cody Northropf6622dc2015-10-06 10:33:21 -06008093 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8094 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8095 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008096 cb_ci.attachmentCount = 1;
8097 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008098
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008100 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8101 gp_ci.stageCount = 2;
8102 gp_ci.pStages = shaderStages;
8103 gp_ci.pVertexInputState = &vi_ci;
8104 gp_ci.pInputAssemblyState = &ia_ci;
8105 gp_ci.pViewportState = &vp_state_ci;
8106 gp_ci.pRasterizationState = &rs_ci;
8107 gp_ci.pColorBlendState = &cb_ci;
8108 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008109 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008110 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8111 gp_ci.layout = pipeline_layout;
8112 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008113
8114 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008115 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008116
8117 VkPipeline pipeline;
8118 VkPipelineCache pipelineCache;
8119
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008120 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008121 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008122 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008123
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008124 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008125
Tobin Ehlisd332f282015-10-02 11:00:56 -06008126 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008127 // First need to successfully create the PSO from above by setting
8128 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008129 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 -07008130
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008131 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008132 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008134 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008135 m_commandBuffer->BeginCommandBuffer();
8136 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008137 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008138 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008139 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008140 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008141 Draw(1, 0, 0, 0);
8142
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008143 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008144
8145 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8146 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8147 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008149 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008150}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008151
8152// 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 -07008153// viewportCount
8154TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8155 VkResult err;
8156
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008158
Tony Barbour1fa09702017-03-16 12:09:08 -06008159 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008160
8161 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008162 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008163 return;
8164 }
8165
Karl Schultz6addd812016-02-02 17:17:23 -07008166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8167
8168 VkDescriptorPoolSize ds_type_count = {};
8169 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8170 ds_type_count.descriptorCount = 1;
8171
8172 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8173 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8174 ds_pool_ci.maxSets = 1;
8175 ds_pool_ci.poolSizeCount = 1;
8176 ds_pool_ci.pPoolSizes = &ds_type_count;
8177
8178 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008179 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008180 ASSERT_VK_SUCCESS(err);
8181
8182 VkDescriptorSetLayoutBinding dsl_binding = {};
8183 dsl_binding.binding = 0;
8184 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8185 dsl_binding.descriptorCount = 1;
8186 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8187
8188 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8189 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8190 ds_layout_ci.bindingCount = 1;
8191 ds_layout_ci.pBindings = &dsl_binding;
8192
8193 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008194 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008195 ASSERT_VK_SUCCESS(err);
8196
8197 VkDescriptorSet descriptorSet;
8198 VkDescriptorSetAllocateInfo alloc_info = {};
8199 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8200 alloc_info.descriptorSetCount = 1;
8201 alloc_info.descriptorPool = ds_pool;
8202 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008203 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008204 ASSERT_VK_SUCCESS(err);
8205
8206 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8207 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8208 pipeline_layout_ci.setLayoutCount = 1;
8209 pipeline_layout_ci.pSetLayouts = &ds_layout;
8210
8211 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008213 ASSERT_VK_SUCCESS(err);
8214
8215 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8216 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8217 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008218 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008220 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008221
8222 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8223 // Set scissor as dynamic to avoid that error
8224 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8225 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8226 dyn_state_ci.dynamicStateCount = 1;
8227 dyn_state_ci.pDynamicStates = &vp_state;
8228
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008229 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8230 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8231 pipe_ms_state_ci.pNext = NULL;
8232 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8233 pipe_ms_state_ci.sampleShadingEnable = 0;
8234 pipe_ms_state_ci.minSampleShading = 1.0;
8235 pipe_ms_state_ci.pSampleMask = NULL;
8236
Karl Schultz6addd812016-02-02 17:17:23 -07008237 VkPipelineShaderStageCreateInfo shaderStages[2];
8238 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8239
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008240 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008241 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8242 // 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 -07008243 shaderStages[0] = vs.GetStageCreateInfo();
8244 shaderStages[1] = fs.GetStageCreateInfo();
8245
8246 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8247 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8248 vi_ci.pNext = nullptr;
8249 vi_ci.vertexBindingDescriptionCount = 0;
8250 vi_ci.pVertexBindingDescriptions = nullptr;
8251 vi_ci.vertexAttributeDescriptionCount = 0;
8252 vi_ci.pVertexAttributeDescriptions = nullptr;
8253
8254 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8255 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8256 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8257
8258 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8259 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008260 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008261 rs_ci.pNext = nullptr;
8262
Mark Youngc89c6312016-03-31 16:03:20 -06008263 VkPipelineColorBlendAttachmentState att = {};
8264 att.blendEnable = VK_FALSE;
8265 att.colorWriteMask = 0xf;
8266
Karl Schultz6addd812016-02-02 17:17:23 -07008267 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8268 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8269 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008270 cb_ci.attachmentCount = 1;
8271 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008272
8273 VkGraphicsPipelineCreateInfo gp_ci = {};
8274 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8275 gp_ci.stageCount = 2;
8276 gp_ci.pStages = shaderStages;
8277 gp_ci.pVertexInputState = &vi_ci;
8278 gp_ci.pInputAssemblyState = &ia_ci;
8279 gp_ci.pViewportState = &vp_state_ci;
8280 gp_ci.pRasterizationState = &rs_ci;
8281 gp_ci.pColorBlendState = &cb_ci;
8282 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008283 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008284 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8285 gp_ci.layout = pipeline_layout;
8286 gp_ci.renderPass = renderPass();
8287
8288 VkPipelineCacheCreateInfo pc_ci = {};
8289 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8290
8291 VkPipeline pipeline;
8292 VkPipelineCache pipelineCache;
8293
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008294 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008295 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008296 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008297
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008298 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008299
8300 // Now hit second fail case where we set scissor w/ different count than PSO
8301 // First need to successfully create the PSO from above by setting
8302 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8304 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008305
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008306 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008307 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008308 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008309 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008310 m_commandBuffer->BeginCommandBuffer();
8311 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008312 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008313 VkViewport viewports[1] = {};
8314 viewports[0].width = 8;
8315 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008316 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008317 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008318 Draw(1, 0, 0, 0);
8319
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008320 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321
Chia-I Wuf7458c52015-10-26 21:10:41 +08008322 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8323 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8324 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8325 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008326 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008327}
8328
Mark Young7394fdd2016-03-31 14:56:43 -06008329TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8330 VkResult err;
8331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008333
Tony Barbour1fa09702017-03-16 12:09:08 -06008334 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8336
8337 VkDescriptorPoolSize ds_type_count = {};
8338 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8339 ds_type_count.descriptorCount = 1;
8340
8341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8343 ds_pool_ci.maxSets = 1;
8344 ds_pool_ci.poolSizeCount = 1;
8345 ds_pool_ci.pPoolSizes = &ds_type_count;
8346
8347 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008348 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008349 ASSERT_VK_SUCCESS(err);
8350
8351 VkDescriptorSetLayoutBinding dsl_binding = {};
8352 dsl_binding.binding = 0;
8353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8354 dsl_binding.descriptorCount = 1;
8355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8356
8357 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8358 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8359 ds_layout_ci.bindingCount = 1;
8360 ds_layout_ci.pBindings = &dsl_binding;
8361
8362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008364 ASSERT_VK_SUCCESS(err);
8365
8366 VkDescriptorSet descriptorSet;
8367 VkDescriptorSetAllocateInfo alloc_info = {};
8368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8369 alloc_info.descriptorSetCount = 1;
8370 alloc_info.descriptorPool = ds_pool;
8371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008373 ASSERT_VK_SUCCESS(err);
8374
8375 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8376 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8377 pipeline_layout_ci.setLayoutCount = 1;
8378 pipeline_layout_ci.pSetLayouts = &ds_layout;
8379
8380 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008381 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008382 ASSERT_VK_SUCCESS(err);
8383
8384 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8385 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8386 vp_state_ci.scissorCount = 1;
8387 vp_state_ci.pScissors = NULL;
8388 vp_state_ci.viewportCount = 1;
8389 vp_state_ci.pViewports = NULL;
8390
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008391 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008392 // Set scissor as dynamic to avoid that error
8393 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8394 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8395 dyn_state_ci.dynamicStateCount = 2;
8396 dyn_state_ci.pDynamicStates = dynamic_states;
8397
8398 VkPipelineShaderStageCreateInfo shaderStages[2];
8399 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8400
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008401 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8402 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008403 this); // TODO - We shouldn't need a fragment shader
8404 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008405 shaderStages[0] = vs.GetStageCreateInfo();
8406 shaderStages[1] = fs.GetStageCreateInfo();
8407
8408 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8409 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8410 vi_ci.pNext = nullptr;
8411 vi_ci.vertexBindingDescriptionCount = 0;
8412 vi_ci.pVertexBindingDescriptions = nullptr;
8413 vi_ci.vertexAttributeDescriptionCount = 0;
8414 vi_ci.pVertexAttributeDescriptions = nullptr;
8415
8416 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8417 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8418 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8419
8420 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8421 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8422 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008423 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008424
Mark Young47107952016-05-02 15:59:55 -06008425 // Check too low (line width of -1.0f).
8426 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008427
8428 VkPipelineColorBlendAttachmentState att = {};
8429 att.blendEnable = VK_FALSE;
8430 att.colorWriteMask = 0xf;
8431
8432 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8433 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8434 cb_ci.pNext = nullptr;
8435 cb_ci.attachmentCount = 1;
8436 cb_ci.pAttachments = &att;
8437
8438 VkGraphicsPipelineCreateInfo gp_ci = {};
8439 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8440 gp_ci.stageCount = 2;
8441 gp_ci.pStages = shaderStages;
8442 gp_ci.pVertexInputState = &vi_ci;
8443 gp_ci.pInputAssemblyState = &ia_ci;
8444 gp_ci.pViewportState = &vp_state_ci;
8445 gp_ci.pRasterizationState = &rs_ci;
8446 gp_ci.pColorBlendState = &cb_ci;
8447 gp_ci.pDynamicState = &dyn_state_ci;
8448 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8449 gp_ci.layout = pipeline_layout;
8450 gp_ci.renderPass = renderPass();
8451
8452 VkPipelineCacheCreateInfo pc_ci = {};
8453 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8454
8455 VkPipeline pipeline;
8456 VkPipelineCache pipelineCache;
8457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008458 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008459 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008460 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008461
8462 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008463 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008464
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008466
8467 // Check too high (line width of 65536.0f).
8468 rs_ci.lineWidth = 65536.0f;
8469
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008470 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008471 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008472 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008473
8474 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008475 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008476
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008478
8479 dyn_state_ci.dynamicStateCount = 3;
8480
8481 rs_ci.lineWidth = 1.0f;
8482
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008483 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008484 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008485 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008486 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008487 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008488
8489 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008490 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008491 m_errorMonitor->VerifyFound();
8492
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008494
8495 // Check too high with dynamic setting.
8496 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8497 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008498 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008499
8500 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8501 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8502 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8503 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008504 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008505}
8506
Karl Schultz6addd812016-02-02 17:17:23 -07008507TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008508 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008510 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008511
Tony Barbour1fa09702017-03-16 12:09:08 -06008512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008514
Tony Barbour552f6c02016-12-21 14:34:07 -07008515 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008516 // Don't care about RenderPass handle b/c error should be flagged before
8517 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008520 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008521}
8522
Karl Schultz6addd812016-02-02 17:17:23 -07008523TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008524 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008527
Tony Barbour1fa09702017-03-16 12:09:08 -06008528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008530
Tony Barbour552f6c02016-12-21 14:34:07 -07008531 m_commandBuffer->BeginCommandBuffer();
8532 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008533 // Just create a dummy Renderpass that's non-NULL so we can get to the
8534 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008535 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008537 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008538}
8539
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008540TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008541 TEST_DESCRIPTION(
8542 "Begin a renderPass where clearValueCount is less than"
8543 "the number of renderPass attachments that use loadOp"
8544 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008545
Tony Barbour1fa09702017-03-16 12:09:08 -06008546 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8548
8549 // Create a renderPass with a single attachment that uses loadOp CLEAR
8550 VkAttachmentReference attach = {};
8551 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8552 VkSubpassDescription subpass = {};
8553 subpass.inputAttachmentCount = 1;
8554 subpass.pInputAttachments = &attach;
8555 VkRenderPassCreateInfo rpci = {};
8556 rpci.subpassCount = 1;
8557 rpci.pSubpasses = &subpass;
8558 rpci.attachmentCount = 1;
8559 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008560 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008561 // Set loadOp to CLEAR
8562 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8563 rpci.pAttachments = &attach_desc;
8564 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8565 VkRenderPass rp;
8566 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8567
8568 VkCommandBufferInheritanceInfo hinfo = {};
8569 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8570 hinfo.renderPass = VK_NULL_HANDLE;
8571 hinfo.subpass = 0;
8572 hinfo.framebuffer = VK_NULL_HANDLE;
8573 hinfo.occlusionQueryEnable = VK_FALSE;
8574 hinfo.queryFlags = 0;
8575 hinfo.pipelineStatistics = 0;
8576 VkCommandBufferBeginInfo info = {};
8577 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8578 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8579 info.pInheritanceInfo = &hinfo;
8580
8581 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8582 VkRenderPassBeginInfo rp_begin = {};
8583 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8584 rp_begin.pNext = NULL;
8585 rp_begin.renderPass = renderPass();
8586 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008587 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008588
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008590
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008591 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008592
8593 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008594
8595 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008596}
8597
Slawomir Cygan0808f392016-11-28 17:53:23 +01008598TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008599 TEST_DESCRIPTION(
8600 "Begin a renderPass where clearValueCount is greater than"
8601 "the number of renderPass attachments that use loadOp"
8602 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008603
Tony Barbour1fa09702017-03-16 12:09:08 -06008604 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8606
8607 // Create a renderPass with a single attachment that uses loadOp CLEAR
8608 VkAttachmentReference attach = {};
8609 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8610 VkSubpassDescription subpass = {};
8611 subpass.inputAttachmentCount = 1;
8612 subpass.pInputAttachments = &attach;
8613 VkRenderPassCreateInfo rpci = {};
8614 rpci.subpassCount = 1;
8615 rpci.pSubpasses = &subpass;
8616 rpci.attachmentCount = 1;
8617 VkAttachmentDescription attach_desc = {};
8618 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8619 // Set loadOp to CLEAR
8620 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8621 rpci.pAttachments = &attach_desc;
8622 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8623 VkRenderPass rp;
8624 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8625
8626 VkCommandBufferBeginInfo info = {};
8627 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8628 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8629
8630 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8631 VkRenderPassBeginInfo rp_begin = {};
8632 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8633 rp_begin.pNext = NULL;
8634 rp_begin.renderPass = renderPass();
8635 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008636 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008637
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8639 " has a clearValueCount of"
8640 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008641
8642 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8643
8644 m_errorMonitor->VerifyFound();
8645
8646 vkDestroyRenderPass(m_device->device(), rp, NULL);
8647}
8648
Cody Northrop3bb4d962016-05-09 16:15:57 -06008649TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008650 TEST_DESCRIPTION("End a command buffer with an active render pass");
8651
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8653 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008654
Tony Barbour1fa09702017-03-16 12:09:08 -06008655 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8657
Tony Barbour552f6c02016-12-21 14:34:07 -07008658 m_commandBuffer->BeginCommandBuffer();
8659 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8660 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008661
8662 m_errorMonitor->VerifyFound();
8663
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008664 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8665 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008666}
8667
Karl Schultz6addd812016-02-02 17:17:23 -07008668TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008669 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8671 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008672
Tony Barbour1fa09702017-03-16 12:09:08 -06008673 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008675
Tony Barbour552f6c02016-12-21 14:34:07 -07008676 m_commandBuffer->BeginCommandBuffer();
8677 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008678
8679 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008680 vk_testing::Buffer dstBuffer;
8681 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008682
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008683 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008684
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008685 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008686}
8687
Karl Schultz6addd812016-02-02 17:17:23 -07008688TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008689 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8691 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008692
Tony Barbour1fa09702017-03-16 12:09:08 -06008693 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008694 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008695
Tony Barbour552f6c02016-12-21 14:34:07 -07008696 m_commandBuffer->BeginCommandBuffer();
8697 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008698
8699 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008700 vk_testing::Buffer dstBuffer;
8701 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008702
Karl Schultz6addd812016-02-02 17:17:23 -07008703 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008704 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8705 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8706 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008707
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008708 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008709}
8710
Karl Schultz6addd812016-02-02 17:17:23 -07008711TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008712 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8714 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008715
Tony Barbour1fa09702017-03-16 12:09:08 -06008716 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008717 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008718
Tony Barbour552f6c02016-12-21 14:34:07 -07008719 m_commandBuffer->BeginCommandBuffer();
8720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008721
Michael Lentine0a369f62016-02-03 16:51:46 -06008722 VkClearColorValue clear_color;
8723 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008724 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8725 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8726 const int32_t tex_width = 32;
8727 const int32_t tex_height = 32;
8728 VkImageCreateInfo image_create_info = {};
8729 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8730 image_create_info.pNext = NULL;
8731 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8732 image_create_info.format = tex_format;
8733 image_create_info.extent.width = tex_width;
8734 image_create_info.extent.height = tex_height;
8735 image_create_info.extent.depth = 1;
8736 image_create_info.mipLevels = 1;
8737 image_create_info.arrayLayers = 1;
8738 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8739 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008740 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008741
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008742 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008745 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008746
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008747 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008748
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008749 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008750}
8751
Karl Schultz6addd812016-02-02 17:17:23 -07008752TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008753 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8755 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008756
Tony Barbour1fa09702017-03-16 12:09:08 -06008757 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008759
Tony Barbourf887b162017-03-09 10:06:46 -07008760 auto depth_format = find_depth_stencil_format(m_device);
8761 if (!depth_format) {
8762 printf(" No Depth + Stencil format found. Skipped.\n");
8763 return;
8764 }
8765
Tony Barbour552f6c02016-12-21 14:34:07 -07008766 m_commandBuffer->BeginCommandBuffer();
8767 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008768
8769 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008770 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008771 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8772 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008773 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008774 image_create_info.extent.width = 64;
8775 image_create_info.extent.height = 64;
8776 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8777 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008778
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008779 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008780 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008781
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008782 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008783
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008784 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8785 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008786
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008787 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008788}
8789
Karl Schultz6addd812016-02-02 17:17:23 -07008790TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008791 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008792 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8795 "vkCmdClearAttachments(): This call "
8796 "must be issued inside an active "
8797 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008798
Tony Barbour1fa09702017-03-16 12:09:08 -06008799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008801
8802 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008803 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008804 ASSERT_VK_SUCCESS(err);
8805
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008806 VkClearAttachment color_attachment;
8807 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8808 color_attachment.clearValue.color.float32[0] = 0;
8809 color_attachment.clearValue.color.float32[1] = 0;
8810 color_attachment.clearValue.color.float32[2] = 0;
8811 color_attachment.clearValue.color.float32[3] = 0;
8812 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008813 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008814 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008815
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008816 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008817}
8818
Chris Forbes3b97e932016-09-07 11:29:24 +12008819TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008820 TEST_DESCRIPTION(
8821 "Test that an error is produced when CmdNextSubpass is "
8822 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008823
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8825 "vkCmdNextSubpass(): Attempted to advance "
8826 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008827
Tony Barbour1fa09702017-03-16 12:09:08 -06008828 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8830
Tony Barbour552f6c02016-12-21 14:34:07 -07008831 m_commandBuffer->BeginCommandBuffer();
8832 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008833
8834 // error here.
8835 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8836 m_errorMonitor->VerifyFound();
8837
Tony Barbour552f6c02016-12-21 14:34:07 -07008838 m_commandBuffer->EndRenderPass();
8839 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008840}
8841
Chris Forbes6d624702016-09-07 13:57:05 +12008842TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008843 TEST_DESCRIPTION(
8844 "Test that an error is produced when CmdEndRenderPass is "
8845 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008846
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8848 "vkCmdEndRenderPass(): Called before reaching "
8849 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008850
Tony Barbour1fa09702017-03-16 12:09:08 -06008851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008852 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8853 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008855 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008856
8857 VkRenderPass rp;
8858 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8859 ASSERT_VK_SUCCESS(err);
8860
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008861 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008862
8863 VkFramebuffer fb;
8864 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8865 ASSERT_VK_SUCCESS(err);
8866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008867 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008868
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008869 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 +12008870
8871 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8872
8873 // Error here.
8874 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8875 m_errorMonitor->VerifyFound();
8876
8877 // Clean up.
8878 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8879 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8880}
8881
Karl Schultz9e66a292016-04-21 15:57:51 -06008882TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8883 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8885 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008886
Tony Barbour1fa09702017-03-16 12:09:08 -06008887 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008888 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008889
8890 VkBufferMemoryBarrier buf_barrier = {};
8891 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8892 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8893 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8894 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8895 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8896 buf_barrier.buffer = VK_NULL_HANDLE;
8897 buf_barrier.offset = 0;
8898 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008899 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8900 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008901
8902 m_errorMonitor->VerifyFound();
8903}
8904
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008905TEST_F(VkLayerTest, InvalidBarriers) {
8906 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8907
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008909
Tony Barbour1fa09702017-03-16 12:09:08 -06008910 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07008911 auto depth_format = find_depth_stencil_format(m_device);
8912 if (!depth_format) {
8913 printf(" No Depth + Stencil format found. Skipped.\n");
8914 return;
8915 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8917
8918 VkMemoryBarrier mem_barrier = {};
8919 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8920 mem_barrier.pNext = NULL;
8921 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8922 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008923 m_commandBuffer->BeginCommandBuffer();
8924 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008925 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008926 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008927 &mem_barrier, 0, nullptr, 0, nullptr);
8928 m_errorMonitor->VerifyFound();
8929
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008931 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008932 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 -06008933 ASSERT_TRUE(image.initialized());
8934 VkImageMemoryBarrier img_barrier = {};
8935 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8936 img_barrier.pNext = NULL;
8937 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8938 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8939 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8940 // New layout can't be UNDEFINED
8941 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8942 img_barrier.image = image.handle();
8943 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8944 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8945 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8946 img_barrier.subresourceRange.baseArrayLayer = 0;
8947 img_barrier.subresourceRange.baseMipLevel = 0;
8948 img_barrier.subresourceRange.layerCount = 1;
8949 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008950 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8951 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008952 m_errorMonitor->VerifyFound();
8953 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8954
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8956 "Subresource must have the sum of the "
8957 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008958 // baseArrayLayer + layerCount must be <= image's arrayLayers
8959 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8961 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008962 m_errorMonitor->VerifyFound();
8963 img_barrier.subresourceRange.baseArrayLayer = 0;
8964
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008966 // baseMipLevel + levelCount must be <= image's mipLevels
8967 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008968 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8969 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008970 m_errorMonitor->VerifyFound();
8971 img_barrier.subresourceRange.baseMipLevel = 0;
8972
Mike Weiblen7053aa32017-01-25 15:21:10 -07008973 // levelCount must be non-zero.
8974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8975 img_barrier.subresourceRange.levelCount = 0;
8976 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8977 nullptr, 0, nullptr, 1, &img_barrier);
8978 m_errorMonitor->VerifyFound();
8979 img_barrier.subresourceRange.levelCount = 1;
8980
8981 // layerCount must be non-zero.
8982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8983 img_barrier.subresourceRange.layerCount = 0;
8984 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8985 nullptr, 0, nullptr, 1, &img_barrier);
8986 m_errorMonitor->VerifyFound();
8987 img_barrier.subresourceRange.layerCount = 1;
8988
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008989 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 -06008990 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008991 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8992 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008993 VkBufferMemoryBarrier buf_barrier = {};
8994 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8995 buf_barrier.pNext = NULL;
8996 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8997 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8998 buf_barrier.buffer = buffer.handle();
8999 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9000 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9001 buf_barrier.offset = 0;
9002 buf_barrier.size = VK_WHOLE_SIZE;
9003 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009004 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9005 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009006 m_errorMonitor->VerifyFound();
9007 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9008
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009010 buf_barrier.offset = 257;
9011 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009012 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9013 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009014 m_errorMonitor->VerifyFound();
9015 buf_barrier.offset = 0;
9016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009018 buf_barrier.size = 257;
9019 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009020 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9021 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009022 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009024 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009025 m_errorMonitor->SetDesiredFailureMsg(
9026 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009027 "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 -06009028 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009029 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009030 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009031 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9032 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009033 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009034
9035 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009036 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009037 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9038 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009039 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009040
9041 // Having anything other than DEPTH or STENCIL is an error
9042 m_errorMonitor->SetDesiredFailureMsg(
9043 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9044 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9045 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9046 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9047 nullptr, 0, nullptr, 1, &img_barrier);
9048 m_errorMonitor->VerifyFound();
9049
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009050 // Now test depth-only
9051 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009052 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9053 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009054 VkDepthStencilObj d_image(m_device);
9055 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9056 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009057 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009058 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009059 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009060
9061 // DEPTH bit must be set
9062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9063 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009064 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009065 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9066 0, nullptr, 0, nullptr, 1, &img_barrier);
9067 m_errorMonitor->VerifyFound();
9068
9069 // No bits other than DEPTH may be set
9070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9071 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9072 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009073 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9074 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009075 m_errorMonitor->VerifyFound();
9076 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009077
9078 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009079 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9080 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009081 VkDepthStencilObj s_image(m_device);
9082 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9083 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009084 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009085 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009086 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009087 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9089 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009090 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009091 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9092 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009093 m_errorMonitor->VerifyFound();
9094 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009095
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009096 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009097 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009098 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 -06009099 ASSERT_TRUE(c_image.initialized());
9100 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9101 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9102 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009103
9104 // COLOR bit must be set
9105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9106 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009107 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009108 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9109 nullptr, 0, nullptr, 1, &img_barrier);
9110 m_errorMonitor->VerifyFound();
9111
9112 // No bits other than COLOR may be set
9113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9114 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9115 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009116 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9117 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009118 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009119
Mike Weiblene6e01172017-03-07 22:18:40 -07009120 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9121 {
9122 VkImageObj img_color(m_device);
9123 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9124 ASSERT_TRUE(img_color.initialized());
9125
9126 VkImageObj img_ds(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -06009127 img_ds.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009128 ASSERT_TRUE(img_ds.initialized());
9129
9130 VkImageObj img_xfer_src(m_device);
9131 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9132 ASSERT_TRUE(img_xfer_src.initialized());
9133
9134 VkImageObj img_xfer_dst(m_device);
9135 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9136 ASSERT_TRUE(img_xfer_dst.initialized());
9137
9138 VkImageObj img_sampled(m_device);
9139 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9140 ASSERT_TRUE(img_sampled.initialized());
9141
9142 VkImageObj img_input(m_device);
9143 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9144 ASSERT_TRUE(img_input.initialized());
9145
9146 const struct {
9147 VkImageObj &image_obj;
9148 VkImageLayout bad_layout;
9149 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9150 } bad_buffer_layouts[] = {
9151 // clang-format off
9152 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9153 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9154 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9155 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9156 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9157 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9158 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9159 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9160 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9161 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9162 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9163 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9164 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9165 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9166 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9167 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9168 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9169 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9170 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9171 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9172 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9173 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9174 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9175 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9176 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9177 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9178 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9179 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9180 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9181 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9182 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9183 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9184 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9185 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9186 // clang-format on
9187 };
9188 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9189
9190 for (uint32_t i = 0; i < layout_count; ++i) {
9191 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9192 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9193 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9194 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9195 : VK_IMAGE_ASPECT_COLOR_BIT;
9196
9197 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9198 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9200 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9201 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9202 m_errorMonitor->VerifyFound();
9203
9204 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9205 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9207 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9208 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9209 m_errorMonitor->VerifyFound();
9210 }
9211
9212 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9213 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9214 }
9215
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009216 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9217
9218 // Create command pool with incompatible queueflags
9219 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009220 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009221 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009222 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009223 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009224 }
9225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9226
9227 VkCommandPool command_pool;
9228 VkCommandPoolCreateInfo pool_create_info{};
9229 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9230 pool_create_info.queueFamilyIndex = queue_family_index;
9231 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9232 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9233
9234 // Allocate a command buffer
9235 VkCommandBuffer bad_command_buffer;
9236 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9237 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9238 command_buffer_allocate_info.commandPool = command_pool;
9239 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9240 command_buffer_allocate_info.commandBufferCount = 1;
9241 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9242
9243 VkCommandBufferBeginInfo cbbi = {};
9244 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9245 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9246 buf_barrier.offset = 0;
9247 buf_barrier.size = VK_WHOLE_SIZE;
9248 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9249 &buf_barrier, 0, nullptr);
9250 m_errorMonitor->VerifyFound();
9251
9252 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9253 vkEndCommandBuffer(bad_command_buffer);
9254 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009255 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009256 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009257 }
9258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9259 VkEvent event;
9260 VkEventCreateInfo event_create_info{};
9261 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9262 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9263 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9264 nullptr, 0, nullptr);
9265 m_errorMonitor->VerifyFound();
9266
9267 vkEndCommandBuffer(bad_command_buffer);
9268 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009269}
9270
Tony Barbour18ba25c2016-09-29 13:42:40 -06009271TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9272 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9273
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009275 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009276 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009277 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9278 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009279 ASSERT_TRUE(image.initialized());
9280
9281 VkImageMemoryBarrier barrier = {};
9282 VkImageSubresourceRange range;
9283 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9284 barrier.srcAccessMask = 0;
9285 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9286 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9287 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9288 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9289 barrier.image = image.handle();
9290 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9291 range.baseMipLevel = 0;
9292 range.levelCount = 1;
9293 range.baseArrayLayer = 0;
9294 range.layerCount = 1;
9295 barrier.subresourceRange = range;
9296 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9297 cmdbuf.BeginCommandBuffer();
9298 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9299 &barrier);
9300 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9301 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9302 barrier.srcAccessMask = 0;
9303 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9304 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9305 &barrier);
9306
9307 m_errorMonitor->VerifyFound();
9308}
9309
Karl Schultz6addd812016-02-02 17:17:23 -07009310TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009311 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009312 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009314
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009315 uint32_t const indices[] = {0};
9316 VkBufferCreateInfo buf_info = {};
9317 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9318 buf_info.size = 1024;
9319 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9320 buf_info.queueFamilyIndexCount = 1;
9321 buf_info.pQueueFamilyIndices = indices;
9322
9323 VkBuffer buffer;
9324 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9325 ASSERT_VK_SUCCESS(err);
9326
9327 VkMemoryRequirements requirements;
9328 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9329
9330 VkMemoryAllocateInfo alloc_info{};
9331 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9332 alloc_info.pNext = NULL;
9333 alloc_info.memoryTypeIndex = 0;
9334 alloc_info.allocationSize = requirements.size;
9335 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9336 ASSERT_TRUE(pass);
9337
9338 VkDeviceMemory memory;
9339 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9340 ASSERT_VK_SUCCESS(err);
9341
9342 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009343 ASSERT_VK_SUCCESS(err);
9344
Tony Barbour552f6c02016-12-21 14:34:07 -07009345 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009346 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009347
Karl Schultz6addd812016-02-02 17:17:23 -07009348 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9349 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009350 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9352 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009353 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009354
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009355 vkFreeMemory(m_device->device(), memory, NULL);
9356 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009357}
9358
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009359TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9360 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009361 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009362 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9363 VkBufferCreateInfo buffCI = {};
9364 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9365 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009366 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009367 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009368 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009369 uint32_t qfi[2];
9370 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009371 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009372
9373 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009374 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009375
9376 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9378 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9379 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009380 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009381 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009382
9383 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009384 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9386
9387 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9388 buffCI.queueFamilyIndexCount = 2;
9389 qfi[0] = 1;
9390 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009391 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009392 VkDeviceMemory mem;
9393 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009394 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009395
9396 VkMemoryAllocateInfo alloc_info = {};
9397 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9398 alloc_info.allocationSize = 1024;
9399 bool pass = false;
9400 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9401 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009402 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009403 return;
9404 }
9405 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009406 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009407
9408 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009409 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009410 m_commandBuffer->end();
9411 QueueCommandBuffer(false);
9412 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009413 vkDestroyBuffer(m_device->device(), ib2, NULL);
9414 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009415 }
9416
Tony Barbourdf4c0042016-06-01 15:55:43 -06009417 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009418}
9419
Karl Schultz6addd812016-02-02 17:17:23 -07009420TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009421 TEST_DESCRIPTION(
9422 "Attempt vkCmdExecuteCommands with a primary command buffer"
9423 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009424
Tony Barbour1fa09702017-03-16 12:09:08 -06009425 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009427
Chris Forbesf29a84f2016-10-06 18:39:28 +13009428 // An empty primary command buffer
9429 VkCommandBufferObj cb(m_device, m_commandPool);
9430 cb.BeginCommandBuffer();
9431 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009432
Chris Forbesf29a84f2016-10-06 18:39:28 +13009433 m_commandBuffer->BeginCommandBuffer();
9434 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9435 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009436
Chris Forbesf29a84f2016-10-06 18:39:28 +13009437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9438 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009439 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009440
9441 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009442}
9443
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009444TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009445 TEST_DESCRIPTION(
9446 "Attempt to update descriptor sets for images and buffers "
9447 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009448 VkResult err;
9449
Tony Barbour1fa09702017-03-16 12:09:08 -06009450 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009451 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9452 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9453 ds_type_count[i].type = VkDescriptorType(i);
9454 ds_type_count[i].descriptorCount = 1;
9455 }
9456 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9457 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9458 ds_pool_ci.pNext = NULL;
9459 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9460 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9461 ds_pool_ci.pPoolSizes = ds_type_count;
9462
9463 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009464 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009465 ASSERT_VK_SUCCESS(err);
9466
9467 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009468 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009469 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9470 dsl_binding[i].binding = 0;
9471 dsl_binding[i].descriptorType = VkDescriptorType(i);
9472 dsl_binding[i].descriptorCount = 1;
9473 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9474 dsl_binding[i].pImmutableSamplers = NULL;
9475 }
9476
9477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9479 ds_layout_ci.pNext = NULL;
9480 ds_layout_ci.bindingCount = 1;
9481 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9482 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9483 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009485 ASSERT_VK_SUCCESS(err);
9486 }
9487 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9488 VkDescriptorSetAllocateInfo alloc_info = {};
9489 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9490 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9491 alloc_info.descriptorPool = ds_pool;
9492 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009493 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009494 ASSERT_VK_SUCCESS(err);
9495
9496 // Create a buffer & bufferView to be used for invalid updates
9497 VkBufferCreateInfo buff_ci = {};
9498 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009499 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009500 buff_ci.size = 256;
9501 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009502 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009503 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9504 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009505
9506 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9507 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9508 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9509 ASSERT_VK_SUCCESS(err);
9510
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009511 VkMemoryRequirements mem_reqs;
9512 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9513 VkMemoryAllocateInfo mem_alloc_info = {};
9514 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9515 mem_alloc_info.pNext = NULL;
9516 mem_alloc_info.memoryTypeIndex = 0;
9517 mem_alloc_info.allocationSize = mem_reqs.size;
9518 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9519 if (!pass) {
9520 vkDestroyBuffer(m_device->device(), buffer, NULL);
9521 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9522 return;
9523 }
9524 VkDeviceMemory mem;
9525 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9526 ASSERT_VK_SUCCESS(err);
9527 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9528 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009529
9530 VkBufferViewCreateInfo buff_view_ci = {};
9531 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9532 buff_view_ci.buffer = buffer;
9533 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9534 buff_view_ci.range = VK_WHOLE_SIZE;
9535 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009536 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009537 ASSERT_VK_SUCCESS(err);
9538
Tony Barbour415497c2017-01-24 10:06:09 -07009539 // Now get resources / view for storage_texel_buffer
9540 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9541 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9542 if (!pass) {
9543 vkDestroyBuffer(m_device->device(), buffer, NULL);
9544 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9545 vkFreeMemory(m_device->device(), mem, NULL);
9546 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9548 return;
9549 }
9550 VkDeviceMemory storage_texel_buffer_mem;
9551 VkBufferView storage_texel_buffer_view;
9552 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9553 ASSERT_VK_SUCCESS(err);
9554 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9555 ASSERT_VK_SUCCESS(err);
9556 buff_view_ci.buffer = storage_texel_buffer;
9557 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9558 ASSERT_VK_SUCCESS(err);
9559
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009560 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009561 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009562 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009563 image_ci.format = VK_FORMAT_UNDEFINED;
9564 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9565 VkFormat format = static_cast<VkFormat>(f);
9566 VkFormatProperties fProps = m_device->format_properties(format);
9567 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9568 image_ci.format = format;
9569 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9570 break;
9571 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9572 image_ci.format = format;
9573 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9574 break;
9575 }
9576 }
9577 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9578 return;
9579 }
9580
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009581 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9582 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009583 image_ci.extent.width = 64;
9584 image_ci.extent.height = 64;
9585 image_ci.extent.depth = 1;
9586 image_ci.mipLevels = 1;
9587 image_ci.arrayLayers = 1;
9588 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009589 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009590 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009591 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9592 VkImage image;
9593 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9594 ASSERT_VK_SUCCESS(err);
9595 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009596 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009597
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009598 VkMemoryAllocateInfo mem_alloc = {};
9599 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9600 mem_alloc.pNext = NULL;
9601 mem_alloc.allocationSize = 0;
9602 mem_alloc.memoryTypeIndex = 0;
9603 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9604 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009605 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009606 ASSERT_TRUE(pass);
9607 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9608 ASSERT_VK_SUCCESS(err);
9609 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9610 ASSERT_VK_SUCCESS(err);
9611 // Now create view for image
9612 VkImageViewCreateInfo image_view_ci = {};
9613 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9614 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009615 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009616 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9617 image_view_ci.subresourceRange.layerCount = 1;
9618 image_view_ci.subresourceRange.baseArrayLayer = 0;
9619 image_view_ci.subresourceRange.levelCount = 1;
9620 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9621 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009622 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009623 ASSERT_VK_SUCCESS(err);
9624
9625 VkDescriptorBufferInfo buff_info = {};
9626 buff_info.buffer = buffer;
9627 VkDescriptorImageInfo img_info = {};
9628 img_info.imageView = image_view;
9629 VkWriteDescriptorSet descriptor_write = {};
9630 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9631 descriptor_write.dstBinding = 0;
9632 descriptor_write.descriptorCount = 1;
9633 descriptor_write.pTexelBufferView = &buff_view;
9634 descriptor_write.pBufferInfo = &buff_info;
9635 descriptor_write.pImageInfo = &img_info;
9636
9637 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009638 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009639 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9640 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9641 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9642 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9643 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9644 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9645 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9646 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9647 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9648 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9649 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009650 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009651 // Start loop at 1 as SAMPLER desc type has no usage bit error
9652 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009653 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9654 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9655 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9656 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009657 descriptor_write.descriptorType = VkDescriptorType(i);
9658 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009660
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009661 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009662
9663 m_errorMonitor->VerifyFound();
9664 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009665 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9666 descriptor_write.pTexelBufferView = &buff_view;
9667 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009668 }
Tony Barbour415497c2017-01-24 10:06:09 -07009669
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009670 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9671 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009672 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009673 vkDestroyImageView(m_device->device(), image_view, NULL);
9674 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009675 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009676 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009677 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009678 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009679 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009680 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9681}
9682
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009683TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009684 TEST_DESCRIPTION(
9685 "Attempt to update buffer descriptor set that has incorrect "
9686 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009687 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009688 "2. range value of 0\n"
9689 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009690 VkResult err;
9691
Tony Barbour1fa09702017-03-16 12:09:08 -06009692 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009693 VkDescriptorPoolSize ds_type_count = {};
9694 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9695 ds_type_count.descriptorCount = 1;
9696
9697 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9698 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9699 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009700 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009701 ds_pool_ci.maxSets = 1;
9702 ds_pool_ci.poolSizeCount = 1;
9703 ds_pool_ci.pPoolSizes = &ds_type_count;
9704
9705 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009706 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009707 ASSERT_VK_SUCCESS(err);
9708
9709 // Create layout with single uniform buffer descriptor
9710 VkDescriptorSetLayoutBinding dsl_binding = {};
9711 dsl_binding.binding = 0;
9712 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9713 dsl_binding.descriptorCount = 1;
9714 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9715 dsl_binding.pImmutableSamplers = NULL;
9716
9717 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9718 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9719 ds_layout_ci.pNext = NULL;
9720 ds_layout_ci.bindingCount = 1;
9721 ds_layout_ci.pBindings = &dsl_binding;
9722 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009724 ASSERT_VK_SUCCESS(err);
9725
9726 VkDescriptorSet descriptor_set = {};
9727 VkDescriptorSetAllocateInfo alloc_info = {};
9728 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9729 alloc_info.descriptorSetCount = 1;
9730 alloc_info.descriptorPool = ds_pool;
9731 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009732 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009733 ASSERT_VK_SUCCESS(err);
9734
9735 // Create a buffer to be used for invalid updates
9736 VkBufferCreateInfo buff_ci = {};
9737 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9738 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009739 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009740 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9741 VkBuffer buffer;
9742 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9743 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009744
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009745 // Have to bind memory to buffer before descriptor update
9746 VkMemoryAllocateInfo mem_alloc = {};
9747 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9748 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009749 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009750 mem_alloc.memoryTypeIndex = 0;
9751
9752 VkMemoryRequirements mem_reqs;
9753 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009754 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009755 if (!pass) {
9756 vkDestroyBuffer(m_device->device(), buffer, NULL);
9757 return;
9758 }
9759
9760 VkDeviceMemory mem;
9761 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9762 ASSERT_VK_SUCCESS(err);
9763 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9764 ASSERT_VK_SUCCESS(err);
9765
9766 VkDescriptorBufferInfo buff_info = {};
9767 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009768 // Cause error due to offset out of range
9769 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009770 buff_info.range = VK_WHOLE_SIZE;
9771 VkWriteDescriptorSet descriptor_write = {};
9772 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9773 descriptor_write.dstBinding = 0;
9774 descriptor_write.descriptorCount = 1;
9775 descriptor_write.pTexelBufferView = nullptr;
9776 descriptor_write.pBufferInfo = &buff_info;
9777 descriptor_write.pImageInfo = nullptr;
9778
9779 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9780 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009782
9783 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9784
9785 m_errorMonitor->VerifyFound();
9786 // Now cause error due to range of 0
9787 buff_info.offset = 0;
9788 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009790
9791 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9792
9793 m_errorMonitor->VerifyFound();
9794 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009795 buff_info.offset = 0;
9796 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009798
9799 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9800
9801 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009802 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009803 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9804 vkDestroyBuffer(m_device->device(), buffer, NULL);
9805 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9806 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9807}
9808
Tobin Ehlis845887e2017-02-02 19:01:44 -07009809TEST_F(VkLayerTest, DSBufferLimitErrors) {
9810 TEST_DESCRIPTION(
9811 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9812 "Test cases include:\n"
9813 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9814 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9815 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9816 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9817 VkResult err;
9818
Tony Barbour1fa09702017-03-16 12:09:08 -06009819 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009820 VkDescriptorPoolSize ds_type_count[2] = {};
9821 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9822 ds_type_count[0].descriptorCount = 1;
9823 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9824 ds_type_count[1].descriptorCount = 1;
9825
9826 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9827 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9828 ds_pool_ci.pNext = NULL;
9829 ds_pool_ci.maxSets = 1;
9830 ds_pool_ci.poolSizeCount = 2;
9831 ds_pool_ci.pPoolSizes = ds_type_count;
9832
9833 VkDescriptorPool ds_pool;
9834 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9835 ASSERT_VK_SUCCESS(err);
9836
9837 // Create layout with single uniform buffer & single storage buffer descriptor
9838 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9839 dsl_binding[0].binding = 0;
9840 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9841 dsl_binding[0].descriptorCount = 1;
9842 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9843 dsl_binding[0].pImmutableSamplers = NULL;
9844 dsl_binding[1].binding = 1;
9845 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9846 dsl_binding[1].descriptorCount = 1;
9847 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9848 dsl_binding[1].pImmutableSamplers = NULL;
9849
9850 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9851 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9852 ds_layout_ci.pNext = NULL;
9853 ds_layout_ci.bindingCount = 2;
9854 ds_layout_ci.pBindings = dsl_binding;
9855 VkDescriptorSetLayout ds_layout;
9856 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9857 ASSERT_VK_SUCCESS(err);
9858
9859 VkDescriptorSet descriptor_set = {};
9860 VkDescriptorSetAllocateInfo alloc_info = {};
9861 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9862 alloc_info.descriptorSetCount = 1;
9863 alloc_info.descriptorPool = ds_pool;
9864 alloc_info.pSetLayouts = &ds_layout;
9865 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9866 ASSERT_VK_SUCCESS(err);
9867
9868 // Create a buffer to be used for invalid updates
9869 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9870 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9871 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9872 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9873 VkBufferCreateInfo ub_ci = {};
9874 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9875 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9876 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9877 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9878 VkBuffer uniform_buffer;
9879 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9880 ASSERT_VK_SUCCESS(err);
9881 VkBufferCreateInfo sb_ci = {};
9882 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9883 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9884 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9885 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9886 VkBuffer storage_buffer;
9887 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9888 ASSERT_VK_SUCCESS(err);
9889 // Have to bind memory to buffer before descriptor update
9890 VkMemoryAllocateInfo mem_alloc = {};
9891 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9892 mem_alloc.pNext = NULL;
9893 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9894 mem_alloc.memoryTypeIndex = 0;
9895
Cort Stratton77a0d592017-02-17 13:14:13 -08009896 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9897 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9898 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9899 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9900 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009901 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009902 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009903 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009904 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9905 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009906 return;
9907 }
9908
9909 VkDeviceMemory mem;
9910 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009911 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009912 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009913 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9914 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9915 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9916 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9917 return;
9918 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009919 ASSERT_VK_SUCCESS(err);
9920 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9921 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009922 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009923 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9924 ASSERT_VK_SUCCESS(err);
9925
9926 VkDescriptorBufferInfo buff_info = {};
9927 buff_info.buffer = uniform_buffer;
9928 buff_info.range = ub_ci.size; // This will exceed limit
9929 VkWriteDescriptorSet descriptor_write = {};
9930 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9931 descriptor_write.dstBinding = 0;
9932 descriptor_write.descriptorCount = 1;
9933 descriptor_write.pTexelBufferView = nullptr;
9934 descriptor_write.pBufferInfo = &buff_info;
9935 descriptor_write.pImageInfo = nullptr;
9936
9937 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9938 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009939 if (max_ub_range != UINT32_MAX) {
9940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9941 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9942 m_errorMonitor->VerifyFound();
9943 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009944 // Reduce size of range to acceptable limit & cause offset error
9945 buff_info.range = max_ub_range;
9946 buff_info.offset = min_ub_align - 1;
9947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9948 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9949 m_errorMonitor->VerifyFound();
9950
9951 // Now break storage updates
9952 buff_info.buffer = storage_buffer;
9953 buff_info.range = sb_ci.size; // This will exceed limit
9954 buff_info.offset = 0; // Reset offset for this update
9955
9956 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9957 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009958 if (max_ub_range != UINT32_MAX) {
9959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9960 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9961 m_errorMonitor->VerifyFound();
9962 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009963
9964 // Reduce size of range to acceptable limit & cause offset error
9965 buff_info.range = max_sb_range;
9966 buff_info.offset = min_sb_align - 1;
9967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9968 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9969 m_errorMonitor->VerifyFound();
9970
9971 vkFreeMemory(m_device->device(), mem, NULL);
9972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9973 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9974 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9976}
9977
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009978TEST_F(VkLayerTest, DSAspectBitsErrors) {
9979 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9980 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009981 TEST_DESCRIPTION(
9982 "Attempt to update descriptor sets for images "
9983 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009984 VkResult err;
9985
Tony Barbour1fa09702017-03-16 12:09:08 -06009986 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07009987 auto depth_format = find_depth_stencil_format(m_device);
9988 if (!depth_format) {
9989 printf(" No Depth + Stencil format found. Skipped.\n");
9990 return;
9991 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009992 VkDescriptorPoolSize ds_type_count = {};
9993 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9994 ds_type_count.descriptorCount = 1;
9995
9996 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9997 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9998 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -07009999 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010000 ds_pool_ci.maxSets = 5;
10001 ds_pool_ci.poolSizeCount = 1;
10002 ds_pool_ci.pPoolSizes = &ds_type_count;
10003
10004 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010005 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010006 ASSERT_VK_SUCCESS(err);
10007
10008 VkDescriptorSetLayoutBinding dsl_binding = {};
10009 dsl_binding.binding = 0;
10010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10011 dsl_binding.descriptorCount = 1;
10012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10013 dsl_binding.pImmutableSamplers = NULL;
10014
10015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10017 ds_layout_ci.pNext = NULL;
10018 ds_layout_ci.bindingCount = 1;
10019 ds_layout_ci.pBindings = &dsl_binding;
10020 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010021 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010022 ASSERT_VK_SUCCESS(err);
10023
10024 VkDescriptorSet descriptor_set = {};
10025 VkDescriptorSetAllocateInfo alloc_info = {};
10026 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10027 alloc_info.descriptorSetCount = 1;
10028 alloc_info.descriptorPool = ds_pool;
10029 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010030 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010031 ASSERT_VK_SUCCESS(err);
10032
10033 // Create an image to be used for invalid updates
10034 VkImageCreateInfo image_ci = {};
10035 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10036 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010037 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010038 image_ci.extent.width = 64;
10039 image_ci.extent.height = 64;
10040 image_ci.extent.depth = 1;
10041 image_ci.mipLevels = 1;
10042 image_ci.arrayLayers = 1;
10043 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010044 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010045 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10046 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10047 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10048 VkImage image;
10049 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10050 ASSERT_VK_SUCCESS(err);
10051 // Bind memory to image
10052 VkMemoryRequirements mem_reqs;
10053 VkDeviceMemory image_mem;
10054 bool pass;
10055 VkMemoryAllocateInfo mem_alloc = {};
10056 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10057 mem_alloc.pNext = NULL;
10058 mem_alloc.allocationSize = 0;
10059 mem_alloc.memoryTypeIndex = 0;
10060 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10061 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010062 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010063 ASSERT_TRUE(pass);
10064 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10065 ASSERT_VK_SUCCESS(err);
10066 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10067 ASSERT_VK_SUCCESS(err);
10068 // Now create view for image
10069 VkImageViewCreateInfo image_view_ci = {};
10070 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10071 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010072 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010073 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10074 image_view_ci.subresourceRange.layerCount = 1;
10075 image_view_ci.subresourceRange.baseArrayLayer = 0;
10076 image_view_ci.subresourceRange.levelCount = 1;
10077 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010078 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010079
10080 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010081 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010082 ASSERT_VK_SUCCESS(err);
10083
10084 VkDescriptorImageInfo img_info = {};
10085 img_info.imageView = image_view;
10086 VkWriteDescriptorSet descriptor_write = {};
10087 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10088 descriptor_write.dstBinding = 0;
10089 descriptor_write.descriptorCount = 1;
10090 descriptor_write.pTexelBufferView = NULL;
10091 descriptor_write.pBufferInfo = NULL;
10092 descriptor_write.pImageInfo = &img_info;
10093 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10094 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010095 const char *error_msg =
10096 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10097 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010099
10100 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10101
10102 m_errorMonitor->VerifyFound();
10103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10104 vkDestroyImage(m_device->device(), image, NULL);
10105 vkFreeMemory(m_device->device(), image_mem, NULL);
10106 vkDestroyImageView(m_device->device(), image_view, NULL);
10107 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10108 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10109}
10110
Karl Schultz6addd812016-02-02 17:17:23 -070010111TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010112 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010113 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010114
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10116 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10117 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010118
Tony Barbour1fa09702017-03-16 12:09:08 -060010119 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010120 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010121 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010122 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10123 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010124
10125 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010126 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10127 ds_pool_ci.pNext = NULL;
10128 ds_pool_ci.maxSets = 1;
10129 ds_pool_ci.poolSizeCount = 1;
10130 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010131
Tobin Ehlis3b780662015-05-28 12:11:26 -060010132 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010133 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010134 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010135 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010136 dsl_binding.binding = 0;
10137 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10138 dsl_binding.descriptorCount = 1;
10139 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10140 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010141
Tony Barboureb254902015-07-15 12:50:33 -060010142 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010143 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10144 ds_layout_ci.pNext = NULL;
10145 ds_layout_ci.bindingCount = 1;
10146 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010147
Tobin Ehlis3b780662015-05-28 12:11:26 -060010148 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010149 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010150 ASSERT_VK_SUCCESS(err);
10151
10152 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010153 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010154 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010155 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010156 alloc_info.descriptorPool = ds_pool;
10157 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010158 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010159 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010160
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010161 VkSamplerCreateInfo sampler_ci = {};
10162 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10163 sampler_ci.pNext = NULL;
10164 sampler_ci.magFilter = VK_FILTER_NEAREST;
10165 sampler_ci.minFilter = VK_FILTER_NEAREST;
10166 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10167 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10168 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10169 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10170 sampler_ci.mipLodBias = 1.0;
10171 sampler_ci.anisotropyEnable = VK_FALSE;
10172 sampler_ci.maxAnisotropy = 1;
10173 sampler_ci.compareEnable = VK_FALSE;
10174 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10175 sampler_ci.minLod = 1.0;
10176 sampler_ci.maxLod = 1.0;
10177 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10178 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10179 VkSampler sampler;
10180 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10181 ASSERT_VK_SUCCESS(err);
10182
10183 VkDescriptorImageInfo info = {};
10184 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010185
10186 VkWriteDescriptorSet descriptor_write;
10187 memset(&descriptor_write, 0, sizeof(descriptor_write));
10188 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010189 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010190 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010191 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010192 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010193 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010194
10195 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10196
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010197 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010198
Chia-I Wuf7458c52015-10-26 21:10:41 +080010199 vkDestroySampler(m_device->device(), sampler, NULL);
10200 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10201 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010202}
10203
Karl Schultz6addd812016-02-02 17:17:23 -070010204TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010205 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010206 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010207
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010209
Tony Barbour1fa09702017-03-16 12:09:08 -060010210 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010211 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010212 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010213 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10214 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010215
10216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10218 ds_pool_ci.pNext = NULL;
10219 ds_pool_ci.maxSets = 1;
10220 ds_pool_ci.poolSizeCount = 1;
10221 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010222
Tobin Ehlis3b780662015-05-28 12:11:26 -060010223 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010224 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010225 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010226
Tony Barboureb254902015-07-15 12:50:33 -060010227 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010228 dsl_binding.binding = 0;
10229 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10230 dsl_binding.descriptorCount = 1;
10231 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10232 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010233
10234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10236 ds_layout_ci.pNext = NULL;
10237 ds_layout_ci.bindingCount = 1;
10238 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010239
Tobin Ehlis3b780662015-05-28 12:11:26 -060010240 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010242 ASSERT_VK_SUCCESS(err);
10243
10244 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010245 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010247 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010248 alloc_info.descriptorPool = ds_pool;
10249 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010251 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010252
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010253 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10254
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010255 // Correctly update descriptor to avoid "NOT_UPDATED" error
10256 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010257 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010258 buff_info.offset = 0;
10259 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010260
10261 VkWriteDescriptorSet descriptor_write;
10262 memset(&descriptor_write, 0, sizeof(descriptor_write));
10263 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010264 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010265 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010266 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010267 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10268 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010269
10270 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10271
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010272 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010273
Chia-I Wuf7458c52015-10-26 21:10:41 +080010274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010276}
10277
Karl Schultz6addd812016-02-02 17:17:23 -070010278TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010279 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010280 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010281
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010283
Tony Barbour1fa09702017-03-16 12:09:08 -060010284 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010285 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010286 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010287 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10288 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010289
10290 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010291 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10292 ds_pool_ci.pNext = NULL;
10293 ds_pool_ci.maxSets = 1;
10294 ds_pool_ci.poolSizeCount = 1;
10295 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010296
Tobin Ehlis3b780662015-05-28 12:11:26 -060010297 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010298 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010299 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010300
Tony Barboureb254902015-07-15 12:50:33 -060010301 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010302 dsl_binding.binding = 0;
10303 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10304 dsl_binding.descriptorCount = 1;
10305 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10306 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010307
10308 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010309 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10310 ds_layout_ci.pNext = NULL;
10311 ds_layout_ci.bindingCount = 1;
10312 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010313 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010315 ASSERT_VK_SUCCESS(err);
10316
10317 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010318 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010319 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010320 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010321 alloc_info.descriptorPool = ds_pool;
10322 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010323 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010324 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010325
Tony Barboureb254902015-07-15 12:50:33 -060010326 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010327 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10328 sampler_ci.pNext = NULL;
10329 sampler_ci.magFilter = VK_FILTER_NEAREST;
10330 sampler_ci.minFilter = VK_FILTER_NEAREST;
10331 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10332 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10333 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10334 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10335 sampler_ci.mipLodBias = 1.0;
10336 sampler_ci.anisotropyEnable = VK_FALSE;
10337 sampler_ci.maxAnisotropy = 1;
10338 sampler_ci.compareEnable = VK_FALSE;
10339 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10340 sampler_ci.minLod = 1.0;
10341 sampler_ci.maxLod = 1.0;
10342 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10343 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010344
Tobin Ehlis3b780662015-05-28 12:11:26 -060010345 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010346 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010347 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010348
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010349 VkDescriptorImageInfo info = {};
10350 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010351
10352 VkWriteDescriptorSet descriptor_write;
10353 memset(&descriptor_write, 0, sizeof(descriptor_write));
10354 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010355 descriptor_write.dstSet = descriptorSet;
10356 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010357 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010358 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010359 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010360 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010361
10362 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10363
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010364 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010365
Chia-I Wuf7458c52015-10-26 21:10:41 +080010366 vkDestroySampler(m_device->device(), sampler, NULL);
10367 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10368 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010369}
10370
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010371TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10372 // Create layout w/ empty binding and attempt to update it
10373 VkResult err;
10374
Tony Barbour1fa09702017-03-16 12:09:08 -060010375 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010376
10377 VkDescriptorPoolSize ds_type_count = {};
10378 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10379 ds_type_count.descriptorCount = 1;
10380
10381 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10382 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10383 ds_pool_ci.pNext = NULL;
10384 ds_pool_ci.maxSets = 1;
10385 ds_pool_ci.poolSizeCount = 1;
10386 ds_pool_ci.pPoolSizes = &ds_type_count;
10387
10388 VkDescriptorPool ds_pool;
10389 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10390 ASSERT_VK_SUCCESS(err);
10391
10392 VkDescriptorSetLayoutBinding dsl_binding = {};
10393 dsl_binding.binding = 0;
10394 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10395 dsl_binding.descriptorCount = 0;
10396 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10397 dsl_binding.pImmutableSamplers = NULL;
10398
10399 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10400 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10401 ds_layout_ci.pNext = NULL;
10402 ds_layout_ci.bindingCount = 1;
10403 ds_layout_ci.pBindings = &dsl_binding;
10404 VkDescriptorSetLayout ds_layout;
10405 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10406 ASSERT_VK_SUCCESS(err);
10407
10408 VkDescriptorSet descriptor_set;
10409 VkDescriptorSetAllocateInfo alloc_info = {};
10410 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10411 alloc_info.descriptorSetCount = 1;
10412 alloc_info.descriptorPool = ds_pool;
10413 alloc_info.pSetLayouts = &ds_layout;
10414 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10415 ASSERT_VK_SUCCESS(err);
10416
10417 VkSamplerCreateInfo sampler_ci = {};
10418 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10419 sampler_ci.magFilter = VK_FILTER_NEAREST;
10420 sampler_ci.minFilter = VK_FILTER_NEAREST;
10421 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10422 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10423 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10424 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10425 sampler_ci.mipLodBias = 1.0;
10426 sampler_ci.maxAnisotropy = 1;
10427 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10428 sampler_ci.minLod = 1.0;
10429 sampler_ci.maxLod = 1.0;
10430 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10431
10432 VkSampler sampler;
10433 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10434 ASSERT_VK_SUCCESS(err);
10435
10436 VkDescriptorImageInfo info = {};
10437 info.sampler = sampler;
10438
10439 VkWriteDescriptorSet descriptor_write;
10440 memset(&descriptor_write, 0, sizeof(descriptor_write));
10441 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10442 descriptor_write.dstSet = descriptor_set;
10443 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010444 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010445 // This is the wrong type, but empty binding error will be flagged first
10446 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10447 descriptor_write.pImageInfo = &info;
10448
10449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10450 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10451 m_errorMonitor->VerifyFound();
10452
10453 vkDestroySampler(m_device->device(), sampler, NULL);
10454 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10455 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10456}
10457
Karl Schultz6addd812016-02-02 17:17:23 -070010458TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10459 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10460 // types
10461 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010462
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010463 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 -060010464
Tony Barbour1fa09702017-03-16 12:09:08 -060010465 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010466
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010467 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010468 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10469 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010470
10471 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010472 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10473 ds_pool_ci.pNext = NULL;
10474 ds_pool_ci.maxSets = 1;
10475 ds_pool_ci.poolSizeCount = 1;
10476 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010477
Tobin Ehlis3b780662015-05-28 12:11:26 -060010478 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010479 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010480 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010481 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010482 dsl_binding.binding = 0;
10483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10484 dsl_binding.descriptorCount = 1;
10485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10486 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010487
Tony Barboureb254902015-07-15 12:50:33 -060010488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010489 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10490 ds_layout_ci.pNext = NULL;
10491 ds_layout_ci.bindingCount = 1;
10492 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010493
Tobin Ehlis3b780662015-05-28 12:11:26 -060010494 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010496 ASSERT_VK_SUCCESS(err);
10497
10498 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010499 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010500 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010501 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010502 alloc_info.descriptorPool = ds_pool;
10503 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010504 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010505 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010506
Tony Barboureb254902015-07-15 12:50:33 -060010507 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010508 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10509 sampler_ci.pNext = NULL;
10510 sampler_ci.magFilter = VK_FILTER_NEAREST;
10511 sampler_ci.minFilter = VK_FILTER_NEAREST;
10512 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10513 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10514 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10515 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10516 sampler_ci.mipLodBias = 1.0;
10517 sampler_ci.anisotropyEnable = VK_FALSE;
10518 sampler_ci.maxAnisotropy = 1;
10519 sampler_ci.compareEnable = VK_FALSE;
10520 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10521 sampler_ci.minLod = 1.0;
10522 sampler_ci.maxLod = 1.0;
10523 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10524 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010525 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010526 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010527 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010528
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010529 VkDescriptorImageInfo info = {};
10530 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010531
10532 VkWriteDescriptorSet descriptor_write;
10533 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010534 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010535 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010536 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010537 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010538 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010539 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010540
10541 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10542
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010543 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010544
Chia-I Wuf7458c52015-10-26 21:10:41 +080010545 vkDestroySampler(m_device->device(), sampler, NULL);
10546 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010548}
10549
Karl Schultz6addd812016-02-02 17:17:23 -070010550TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010551 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010552 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010553
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010555
Tony Barbour1fa09702017-03-16 12:09:08 -060010556 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010557 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10558 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010559 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010560 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10561 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010562
10563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10565 ds_pool_ci.pNext = NULL;
10566 ds_pool_ci.maxSets = 1;
10567 ds_pool_ci.poolSizeCount = 1;
10568 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010569
10570 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010571 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010572 ASSERT_VK_SUCCESS(err);
10573
10574 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010575 dsl_binding.binding = 0;
10576 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10577 dsl_binding.descriptorCount = 1;
10578 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10579 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010580
10581 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010582 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10583 ds_layout_ci.pNext = NULL;
10584 ds_layout_ci.bindingCount = 1;
10585 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010586 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010587 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010588 ASSERT_VK_SUCCESS(err);
10589
10590 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010591 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010593 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010594 alloc_info.descriptorPool = ds_pool;
10595 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010597 ASSERT_VK_SUCCESS(err);
10598
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010599 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010600
10601 VkDescriptorImageInfo descriptor_info;
10602 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10603 descriptor_info.sampler = sampler;
10604
10605 VkWriteDescriptorSet descriptor_write;
10606 memset(&descriptor_write, 0, sizeof(descriptor_write));
10607 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010608 descriptor_write.dstSet = descriptorSet;
10609 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010610 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010611 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10612 descriptor_write.pImageInfo = &descriptor_info;
10613
10614 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10615
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010616 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010617
Chia-I Wuf7458c52015-10-26 21:10:41 +080010618 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10619 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010620}
10621
Karl Schultz6addd812016-02-02 17:17:23 -070010622TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10623 // Create a single combined Image/Sampler descriptor and send it an invalid
10624 // imageView
10625 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010626
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010628
Tony Barbour1fa09702017-03-16 12:09:08 -060010629 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010630 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010631 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10632 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010633
10634 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010635 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10636 ds_pool_ci.pNext = NULL;
10637 ds_pool_ci.maxSets = 1;
10638 ds_pool_ci.poolSizeCount = 1;
10639 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010640
10641 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010642 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010643 ASSERT_VK_SUCCESS(err);
10644
10645 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010646 dsl_binding.binding = 0;
10647 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10648 dsl_binding.descriptorCount = 1;
10649 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10650 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010651
10652 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010653 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10654 ds_layout_ci.pNext = NULL;
10655 ds_layout_ci.bindingCount = 1;
10656 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010657 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010658 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010659 ASSERT_VK_SUCCESS(err);
10660
10661 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010662 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010663 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010664 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010665 alloc_info.descriptorPool = ds_pool;
10666 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010667 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010668 ASSERT_VK_SUCCESS(err);
10669
10670 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010671 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10672 sampler_ci.pNext = NULL;
10673 sampler_ci.magFilter = VK_FILTER_NEAREST;
10674 sampler_ci.minFilter = VK_FILTER_NEAREST;
10675 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10676 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10677 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10678 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10679 sampler_ci.mipLodBias = 1.0;
10680 sampler_ci.anisotropyEnable = VK_FALSE;
10681 sampler_ci.maxAnisotropy = 1;
10682 sampler_ci.compareEnable = VK_FALSE;
10683 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10684 sampler_ci.minLod = 1.0;
10685 sampler_ci.maxLod = 1.0;
10686 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10687 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010688
10689 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010690 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010691 ASSERT_VK_SUCCESS(err);
10692
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010693 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010694
10695 VkDescriptorImageInfo descriptor_info;
10696 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10697 descriptor_info.sampler = sampler;
10698 descriptor_info.imageView = view;
10699
10700 VkWriteDescriptorSet descriptor_write;
10701 memset(&descriptor_write, 0, sizeof(descriptor_write));
10702 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010703 descriptor_write.dstSet = descriptorSet;
10704 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010705 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010706 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10707 descriptor_write.pImageInfo = &descriptor_info;
10708
10709 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10710
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010711 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010712
Chia-I Wuf7458c52015-10-26 21:10:41 +080010713 vkDestroySampler(m_device->device(), sampler, NULL);
10714 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10715 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010716}
10717
Karl Schultz6addd812016-02-02 17:17:23 -070010718TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10719 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10720 // into the other
10721 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010722
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10724 " binding #1 with type "
10725 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10726 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010727
Tony Barbour1fa09702017-03-16 12:09:08 -060010728 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010729 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010730 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010731 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10732 ds_type_count[0].descriptorCount = 1;
10733 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10734 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010735
10736 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010737 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10738 ds_pool_ci.pNext = NULL;
10739 ds_pool_ci.maxSets = 1;
10740 ds_pool_ci.poolSizeCount = 2;
10741 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010742
10743 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010744 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010745 ASSERT_VK_SUCCESS(err);
10746 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010747 dsl_binding[0].binding = 0;
10748 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10749 dsl_binding[0].descriptorCount = 1;
10750 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10751 dsl_binding[0].pImmutableSamplers = NULL;
10752 dsl_binding[1].binding = 1;
10753 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10754 dsl_binding[1].descriptorCount = 1;
10755 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10756 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010757
10758 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010759 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10760 ds_layout_ci.pNext = NULL;
10761 ds_layout_ci.bindingCount = 2;
10762 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010763
10764 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010765 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010766 ASSERT_VK_SUCCESS(err);
10767
10768 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010769 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010770 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010771 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010772 alloc_info.descriptorPool = ds_pool;
10773 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010774 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010775 ASSERT_VK_SUCCESS(err);
10776
10777 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010778 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10779 sampler_ci.pNext = NULL;
10780 sampler_ci.magFilter = VK_FILTER_NEAREST;
10781 sampler_ci.minFilter = VK_FILTER_NEAREST;
10782 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10783 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10784 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10785 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10786 sampler_ci.mipLodBias = 1.0;
10787 sampler_ci.anisotropyEnable = VK_FALSE;
10788 sampler_ci.maxAnisotropy = 1;
10789 sampler_ci.compareEnable = VK_FALSE;
10790 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10791 sampler_ci.minLod = 1.0;
10792 sampler_ci.maxLod = 1.0;
10793 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10794 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010795
10796 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010797 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010798 ASSERT_VK_SUCCESS(err);
10799
10800 VkDescriptorImageInfo info = {};
10801 info.sampler = sampler;
10802
10803 VkWriteDescriptorSet descriptor_write;
10804 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10805 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010806 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010807 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010808 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010809 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10810 descriptor_write.pImageInfo = &info;
10811 // This write update should succeed
10812 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10813 // Now perform a copy update that fails due to type mismatch
10814 VkCopyDescriptorSet copy_ds_update;
10815 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10816 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10817 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010818 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010819 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010820 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10821 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010822 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10823
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010824 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010825 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010826 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 -060010827 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10828 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10829 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010830 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010831 copy_ds_update.dstSet = descriptorSet;
10832 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010833 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010834 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10835
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010836 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010837
Tobin Ehlis04356f92015-10-27 16:35:27 -060010838 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10840 " binding#1 with offset index of 1 plus "
10841 "update array offset of 0 and update of "
10842 "5 descriptors oversteps total number "
10843 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010844
Tobin Ehlis04356f92015-10-27 16:35:27 -060010845 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10846 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10847 copy_ds_update.srcSet = descriptorSet;
10848 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010849 copy_ds_update.dstSet = descriptorSet;
10850 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010851 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010852 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10853
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010854 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010855
Chia-I Wuf7458c52015-10-26 21:10:41 +080010856 vkDestroySampler(m_device->device(), sampler, NULL);
10857 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10858 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010859}
10860
Karl Schultz6addd812016-02-02 17:17:23 -070010861TEST_F(VkLayerTest, NumSamplesMismatch) {
10862 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10863 // sampleCount
10864 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010867
Tony Barbour1fa09702017-03-16 12:09:08 -060010868 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010870 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010871 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010872 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010873
10874 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010875 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10876 ds_pool_ci.pNext = NULL;
10877 ds_pool_ci.maxSets = 1;
10878 ds_pool_ci.poolSizeCount = 1;
10879 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010880
Tobin Ehlis3b780662015-05-28 12:11:26 -060010881 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010882 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010883 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010884
Tony Barboureb254902015-07-15 12:50:33 -060010885 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010886 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010887 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010888 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010889 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10890 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010891
Tony Barboureb254902015-07-15 12:50:33 -060010892 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10893 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10894 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010895 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010896 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010897
Tobin Ehlis3b780662015-05-28 12:11:26 -060010898 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010899 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010900 ASSERT_VK_SUCCESS(err);
10901
10902 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010903 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010904 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010905 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010906 alloc_info.descriptorPool = ds_pool;
10907 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010908 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010909 ASSERT_VK_SUCCESS(err);
10910
Tony Barboureb254902015-07-15 12:50:33 -060010911 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010912 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010913 pipe_ms_state_ci.pNext = NULL;
10914 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10915 pipe_ms_state_ci.sampleShadingEnable = 0;
10916 pipe_ms_state_ci.minSampleShading = 1.0;
10917 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010918
Tony Barboureb254902015-07-15 12:50:33 -060010919 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010920 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10921 pipeline_layout_ci.pNext = NULL;
10922 pipeline_layout_ci.setLayoutCount = 1;
10923 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010924
10925 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010926 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010927 ASSERT_VK_SUCCESS(err);
10928
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010929 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010930 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 -060010931 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010932 VkPipelineObj pipe(m_device);
10933 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010934 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010935 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010936 pipe.SetMSAA(&pipe_ms_state_ci);
10937 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010938
Tony Barbour552f6c02016-12-21 14:34:07 -070010939 m_commandBuffer->BeginCommandBuffer();
10940 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010941 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010942
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010943 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10944 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10945 VkRect2D scissor = {{0, 0}, {16, 16}};
10946 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10947
Mark Young29927482016-05-04 14:38:51 -060010948 // Render triangle (the error should trigger on the attempt to draw).
10949 Draw(3, 1, 0, 0);
10950
10951 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010952 m_commandBuffer->EndRenderPass();
10953 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010954
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010955 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010956
Chia-I Wuf7458c52015-10-26 21:10:41 +080010957 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10958 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10959 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010960}
Mark Young29927482016-05-04 14:38:51 -060010961
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010962TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010963 TEST_DESCRIPTION(
10964 "Hit RenderPass incompatible cases. "
10965 "Initial case is drawing with an active renderpass that's "
10966 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010967 VkResult err;
10968
Tony Barbour1fa09702017-03-16 12:09:08 -060010969 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10971
10972 VkDescriptorSetLayoutBinding dsl_binding = {};
10973 dsl_binding.binding = 0;
10974 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10975 dsl_binding.descriptorCount = 1;
10976 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10977 dsl_binding.pImmutableSamplers = NULL;
10978
10979 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10980 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10981 ds_layout_ci.pNext = NULL;
10982 ds_layout_ci.bindingCount = 1;
10983 ds_layout_ci.pBindings = &dsl_binding;
10984
10985 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010986 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010987 ASSERT_VK_SUCCESS(err);
10988
10989 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10990 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10991 pipeline_layout_ci.pNext = NULL;
10992 pipeline_layout_ci.setLayoutCount = 1;
10993 pipeline_layout_ci.pSetLayouts = &ds_layout;
10994
10995 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010996 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010997 ASSERT_VK_SUCCESS(err);
10998
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010999 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011000 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 -060011001 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011002 // Create a renderpass that will be incompatible with default renderpass
11003 VkAttachmentReference attach = {};
11004 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11005 VkAttachmentReference color_att = {};
11006 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11007 VkSubpassDescription subpass = {};
11008 subpass.inputAttachmentCount = 1;
11009 subpass.pInputAttachments = &attach;
11010 subpass.colorAttachmentCount = 1;
11011 subpass.pColorAttachments = &color_att;
11012 VkRenderPassCreateInfo rpci = {};
11013 rpci.subpassCount = 1;
11014 rpci.pSubpasses = &subpass;
11015 rpci.attachmentCount = 1;
11016 VkAttachmentDescription attach_desc = {};
11017 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011018 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11019 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011020 rpci.pAttachments = &attach_desc;
11021 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11022 VkRenderPass rp;
11023 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11024 VkPipelineObj pipe(m_device);
11025 pipe.AddShader(&vs);
11026 pipe.AddShader(&fs);
11027 pipe.AddColorAttachment();
11028 VkViewport view_port = {};
11029 m_viewports.push_back(view_port);
11030 pipe.SetViewport(m_viewports);
11031 VkRect2D rect = {};
11032 m_scissors.push_back(rect);
11033 pipe.SetScissor(m_scissors);
11034 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11035
11036 VkCommandBufferInheritanceInfo cbii = {};
11037 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11038 cbii.renderPass = rp;
11039 cbii.subpass = 0;
11040 VkCommandBufferBeginInfo cbbi = {};
11041 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11042 cbbi.pInheritanceInfo = &cbii;
11043 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11044 VkRenderPassBeginInfo rpbi = {};
11045 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11046 rpbi.framebuffer = m_framebuffer;
11047 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011048 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11049 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011050
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011052 // Render triangle (the error should trigger on the attempt to draw).
11053 Draw(3, 1, 0, 0);
11054
11055 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011056 m_commandBuffer->EndRenderPass();
11057 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011058
11059 m_errorMonitor->VerifyFound();
11060
11061 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11062 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11063 vkDestroyRenderPass(m_device->device(), rp, NULL);
11064}
11065
Mark Youngc89c6312016-03-31 16:03:20 -060011066TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11067 // Create Pipeline where the number of blend attachments doesn't match the
11068 // number of color attachments. In this case, we don't add any color
11069 // blend attachments even though we have a color attachment.
11070 VkResult err;
11071
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011073
Tony Barbour1fa09702017-03-16 12:09:08 -060011074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11076 VkDescriptorPoolSize ds_type_count = {};
11077 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11078 ds_type_count.descriptorCount = 1;
11079
11080 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11081 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11082 ds_pool_ci.pNext = NULL;
11083 ds_pool_ci.maxSets = 1;
11084 ds_pool_ci.poolSizeCount = 1;
11085 ds_pool_ci.pPoolSizes = &ds_type_count;
11086
11087 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011088 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011089 ASSERT_VK_SUCCESS(err);
11090
11091 VkDescriptorSetLayoutBinding dsl_binding = {};
11092 dsl_binding.binding = 0;
11093 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11094 dsl_binding.descriptorCount = 1;
11095 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11096 dsl_binding.pImmutableSamplers = NULL;
11097
11098 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11099 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11100 ds_layout_ci.pNext = NULL;
11101 ds_layout_ci.bindingCount = 1;
11102 ds_layout_ci.pBindings = &dsl_binding;
11103
11104 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011105 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011106 ASSERT_VK_SUCCESS(err);
11107
11108 VkDescriptorSet descriptorSet;
11109 VkDescriptorSetAllocateInfo alloc_info = {};
11110 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11111 alloc_info.descriptorSetCount = 1;
11112 alloc_info.descriptorPool = ds_pool;
11113 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011114 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011115 ASSERT_VK_SUCCESS(err);
11116
11117 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011119 pipe_ms_state_ci.pNext = NULL;
11120 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11121 pipe_ms_state_ci.sampleShadingEnable = 0;
11122 pipe_ms_state_ci.minSampleShading = 1.0;
11123 pipe_ms_state_ci.pSampleMask = NULL;
11124
11125 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11126 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11127 pipeline_layout_ci.pNext = NULL;
11128 pipeline_layout_ci.setLayoutCount = 1;
11129 pipeline_layout_ci.pSetLayouts = &ds_layout;
11130
11131 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011132 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011133 ASSERT_VK_SUCCESS(err);
11134
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011136 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 -060011137 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011138 VkPipelineObj pipe(m_device);
11139 pipe.AddShader(&vs);
11140 pipe.AddShader(&fs);
11141 pipe.SetMSAA(&pipe_ms_state_ci);
11142 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011143 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011144
11145 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11146 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11147 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11148}
Mark Young29927482016-05-04 14:38:51 -060011149
Mark Muellerd4914412016-06-13 17:52:06 -060011150TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011151 TEST_DESCRIPTION(
11152 "Points to a wrong colorAttachment index in a VkClearAttachment "
11153 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011154 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011156
11157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11158 m_errorMonitor->VerifyFound();
11159}
11160
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011161TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011162 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11163 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011164
Tony Barbour1fa09702017-03-16 12:09:08 -060011165 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011167
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011168 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011169 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11170 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011171
11172 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011173 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11174 ds_pool_ci.pNext = NULL;
11175 ds_pool_ci.maxSets = 1;
11176 ds_pool_ci.poolSizeCount = 1;
11177 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011178
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011179 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011180 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011181 ASSERT_VK_SUCCESS(err);
11182
Tony Barboureb254902015-07-15 12:50:33 -060011183 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011184 dsl_binding.binding = 0;
11185 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11186 dsl_binding.descriptorCount = 1;
11187 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11188 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011189
Tony Barboureb254902015-07-15 12:50:33 -060011190 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011191 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11192 ds_layout_ci.pNext = NULL;
11193 ds_layout_ci.bindingCount = 1;
11194 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011195
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011196 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011197 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011198 ASSERT_VK_SUCCESS(err);
11199
11200 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011201 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011202 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011203 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011204 alloc_info.descriptorPool = ds_pool;
11205 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011206 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011207 ASSERT_VK_SUCCESS(err);
11208
Tony Barboureb254902015-07-15 12:50:33 -060011209 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011210 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011211 pipe_ms_state_ci.pNext = NULL;
11212 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11213 pipe_ms_state_ci.sampleShadingEnable = 0;
11214 pipe_ms_state_ci.minSampleShading = 1.0;
11215 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011216
Tony Barboureb254902015-07-15 12:50:33 -060011217 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011218 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11219 pipeline_layout_ci.pNext = NULL;
11220 pipeline_layout_ci.setLayoutCount = 1;
11221 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011222
11223 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011224 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011225 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011226
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011228 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011229 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011231
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011232 VkPipelineObj pipe(m_device);
11233 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011234 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011235 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011236 pipe.SetMSAA(&pipe_ms_state_ci);
11237 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011238
Tony Barbour552f6c02016-12-21 14:34:07 -070011239 m_commandBuffer->BeginCommandBuffer();
11240 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011241
Karl Schultz6addd812016-02-02 17:17:23 -070011242 // Main thing we care about for this test is that the VkImage obj we're
11243 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011244 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011245 VkClearAttachment color_attachment;
11246 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11247 color_attachment.clearValue.color.float32[0] = 1.0;
11248 color_attachment.clearValue.color.float32[1] = 1.0;
11249 color_attachment.clearValue.color.float32[2] = 1.0;
11250 color_attachment.clearValue.color.float32[3] = 1.0;
11251 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011252 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011253
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011254 // Call for full-sized FB Color attachment prior to issuing a Draw
11255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011256 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011257 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011258 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011259
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011260 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11261 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11263 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11264 m_errorMonitor->VerifyFound();
11265
11266 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11267 clear_rect.layerCount = 2;
11268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11269 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011270 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011271
Chia-I Wuf7458c52015-10-26 21:10:41 +080011272 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11273 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11274 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011275}
11276
Karl Schultz6addd812016-02-02 17:17:23 -070011277TEST_F(VkLayerTest, VtxBufferBadIndex) {
11278 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011279
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11281 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011282
Tony Barbour1fa09702017-03-16 12:09:08 -060011283 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011284 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011286
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011287 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011288 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11289 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011290
11291 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011292 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11293 ds_pool_ci.pNext = NULL;
11294 ds_pool_ci.maxSets = 1;
11295 ds_pool_ci.poolSizeCount = 1;
11296 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011297
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011298 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011299 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011300 ASSERT_VK_SUCCESS(err);
11301
Tony Barboureb254902015-07-15 12:50:33 -060011302 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011303 dsl_binding.binding = 0;
11304 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11305 dsl_binding.descriptorCount = 1;
11306 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11307 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011308
Tony Barboureb254902015-07-15 12:50:33 -060011309 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011310 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11311 ds_layout_ci.pNext = NULL;
11312 ds_layout_ci.bindingCount = 1;
11313 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011314
Tobin Ehlis502480b2015-06-24 15:53:07 -060011315 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011316 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011317 ASSERT_VK_SUCCESS(err);
11318
11319 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011320 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011321 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011322 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011323 alloc_info.descriptorPool = ds_pool;
11324 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011325 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011326 ASSERT_VK_SUCCESS(err);
11327
Tony Barboureb254902015-07-15 12:50:33 -060011328 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011329 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011330 pipe_ms_state_ci.pNext = NULL;
11331 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11332 pipe_ms_state_ci.sampleShadingEnable = 0;
11333 pipe_ms_state_ci.minSampleShading = 1.0;
11334 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011335
Tony Barboureb254902015-07-15 12:50:33 -060011336 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011337 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11338 pipeline_layout_ci.pNext = NULL;
11339 pipeline_layout_ci.setLayoutCount = 1;
11340 pipeline_layout_ci.pSetLayouts = &ds_layout;
11341 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011342
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011343 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011344 ASSERT_VK_SUCCESS(err);
11345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011346 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011347 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 -060011348 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011349 VkPipelineObj pipe(m_device);
11350 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011351 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011352 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011353 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011354 pipe.SetViewport(m_viewports);
11355 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011356 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011357
Tony Barbour552f6c02016-12-21 14:34:07 -070011358 m_commandBuffer->BeginCommandBuffer();
11359 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011360 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011361 // Don't care about actual data, just need to get to draw to flag error
11362 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011363 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011364 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011365 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011366
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011367 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011368
Chia-I Wuf7458c52015-10-26 21:10:41 +080011369 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11370 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11371 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011372}
Mark Muellerdfe37552016-07-07 14:47:42 -060011373
Mark Mueller2ee294f2016-08-04 12:59:48 -060011374TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011375 TEST_DESCRIPTION(
11376 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11377 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011378 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011379
Mark Mueller880fce52016-08-17 15:23:23 -060011380 // The following test fails with recent NVidia drivers.
11381 // By the time core_validation is reached, the NVidia
11382 // driver has sanitized the invalid condition and core_validation
11383 // is not introduced to the failure condition. This is not the case
11384 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011385 // uint32_t count = static_cast<uint32_t>(~0);
11386 // VkPhysicalDevice physical_device;
11387 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11388 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011389
Mark Mueller2ee294f2016-08-04 12:59:48 -060011390 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011391 VkDeviceQueueCreateInfo queue_create_info = {};
11392 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11393 queue_create_info.queueCount = 1;
11394 queue_create_info.pQueuePriorities = &queue_priority;
11395 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11396
11397 VkPhysicalDeviceFeatures features = m_device->phy().features();
11398 VkDevice testDevice;
11399 VkDeviceCreateInfo device_create_info = {};
11400 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11401 device_create_info.queueCreateInfoCount = 1;
11402 device_create_info.pQueueCreateInfos = &queue_create_info;
11403 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011404
11405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11406 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011407 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11408 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11409 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011410 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11411 m_errorMonitor->VerifyFound();
11412
11413 queue_create_info.queueFamilyIndex = 1;
11414
11415 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11416 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11417 for (unsigned i = 0; i < feature_count; i++) {
11418 if (VK_FALSE == feature_array[i]) {
11419 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011420 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11422 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011423 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11424 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11425 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11427 "You requested features that are unavailable on this device. You should first "
11428 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011429 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11430 m_errorMonitor->VerifyFound();
11431 break;
11432 }
11433 }
11434}
11435
Tobin Ehlis16edf082016-11-21 12:33:49 -070011436TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11437 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11438
Tony Barbour1fa09702017-03-16 12:09:08 -060011439 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011440
11441 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11442 std::vector<VkDeviceQueueCreateInfo> queue_info;
11443 queue_info.reserve(queue_props.size());
11444 std::vector<std::vector<float>> queue_priorities;
11445 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11446 VkDeviceQueueCreateInfo qi{};
11447 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11448 qi.queueFamilyIndex = i;
11449 qi.queueCount = queue_props[i].queueCount;
11450 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11451 qi.pQueuePriorities = queue_priorities[i].data();
11452 queue_info.push_back(qi);
11453 }
11454
11455 std::vector<const char *> device_extension_names;
11456
11457 VkDevice local_device;
11458 VkDeviceCreateInfo device_create_info = {};
11459 auto features = m_device->phy().features();
11460 // Intentionally disable pipeline stats
11461 features.pipelineStatisticsQuery = VK_FALSE;
11462 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11463 device_create_info.pNext = NULL;
11464 device_create_info.queueCreateInfoCount = queue_info.size();
11465 device_create_info.pQueueCreateInfos = queue_info.data();
11466 device_create_info.enabledLayerCount = 0;
11467 device_create_info.ppEnabledLayerNames = NULL;
11468 device_create_info.pEnabledFeatures = &features;
11469 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11470 ASSERT_VK_SUCCESS(err);
11471
11472 VkQueryPoolCreateInfo qpci{};
11473 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11474 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11475 qpci.queryCount = 1;
11476 VkQueryPool query_pool;
11477
11478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11479 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11480 m_errorMonitor->VerifyFound();
11481
11482 vkDestroyDevice(local_device, nullptr);
11483}
11484
Mark Mueller2ee294f2016-08-04 12:59:48 -060011485TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011486 TEST_DESCRIPTION(
11487 "Use an invalid queue index in a vkCmdWaitEvents call."
11488 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011489
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011490 const char *invalid_queue_index =
11491 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11492 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11493 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011494
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011495 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011498
Tony Barbour1fa09702017-03-16 12:09:08 -060011499 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011500
11501 VkEvent event;
11502 VkEventCreateInfo event_create_info{};
11503 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11504 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11505
Mark Mueller2ee294f2016-08-04 12:59:48 -060011506 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011507 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011508
Tony Barbour552f6c02016-12-21 14:34:07 -070011509 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011510
11511 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011512 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 -060011513 ASSERT_TRUE(image.initialized());
11514 VkImageMemoryBarrier img_barrier = {};
11515 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11516 img_barrier.pNext = NULL;
11517 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11518 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11519 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11520 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11521 img_barrier.image = image.handle();
11522 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011523
11524 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11525 // that layer validation catches the case when it is not.
11526 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011527 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11528 img_barrier.subresourceRange.baseArrayLayer = 0;
11529 img_barrier.subresourceRange.baseMipLevel = 0;
11530 img_barrier.subresourceRange.layerCount = 1;
11531 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011532 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11533 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011534 m_errorMonitor->VerifyFound();
11535
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011537
11538 VkQueryPool query_pool;
11539 VkQueryPoolCreateInfo query_pool_create_info = {};
11540 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11541 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11542 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011543 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011544
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011545 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011546 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11547
11548 vkEndCommandBuffer(m_commandBuffer->handle());
11549 m_errorMonitor->VerifyFound();
11550
11551 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11552 vkDestroyEvent(m_device->device(), event, nullptr);
11553}
11554
Mark Muellerdfe37552016-07-07 14:47:42 -060011555TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011556 TEST_DESCRIPTION(
11557 "Submit a command buffer using deleted vertex buffer, "
11558 "delete a buffer twice, use an invalid offset for each "
11559 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011560
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011561 const char *deleted_buffer_in_command_buffer =
11562 "Cannot submit cmd buffer "
11563 "using deleted buffer ";
11564 const char *invalid_offset_message =
11565 "vkBindBufferMemory(): "
11566 "memoryOffset is 0x";
11567 const char *invalid_storage_buffer_offset_message =
11568 "vkBindBufferMemory(): "
11569 "storage memoryOffset "
11570 "is 0x";
11571 const char *invalid_texel_buffer_offset_message =
11572 "vkBindBufferMemory(): "
11573 "texel memoryOffset "
11574 "is 0x";
11575 const char *invalid_uniform_buffer_offset_message =
11576 "vkBindBufferMemory(): "
11577 "uniform memoryOffset "
11578 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011579
Tony Barbour1fa09702017-03-16 12:09:08 -060011580 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011581 ASSERT_NO_FATAL_FAILURE(InitViewport());
11582 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11583
11584 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011585 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011586 pipe_ms_state_ci.pNext = NULL;
11587 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11588 pipe_ms_state_ci.sampleShadingEnable = 0;
11589 pipe_ms_state_ci.minSampleShading = 1.0;
11590 pipe_ms_state_ci.pSampleMask = nullptr;
11591
11592 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11593 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11594 VkPipelineLayout pipeline_layout;
11595
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011596 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011597 ASSERT_VK_SUCCESS(err);
11598
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011599 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11600 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011601 VkPipelineObj pipe(m_device);
11602 pipe.AddShader(&vs);
11603 pipe.AddShader(&fs);
11604 pipe.AddColorAttachment();
11605 pipe.SetMSAA(&pipe_ms_state_ci);
11606 pipe.SetViewport(m_viewports);
11607 pipe.SetScissor(m_scissors);
11608 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11609
Tony Barbour552f6c02016-12-21 14:34:07 -070011610 m_commandBuffer->BeginCommandBuffer();
11611 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011612 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011613
11614 {
11615 // Create and bind a vertex buffer in a reduced scope, which will cause
11616 // it to be deleted upon leaving this scope
11617 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011618 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011619 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11620 draw_verticies.AddVertexInputToPipe(pipe);
11621 }
11622
11623 Draw(1, 0, 0, 0);
11624
Tony Barbour552f6c02016-12-21 14:34:07 -070011625 m_commandBuffer->EndRenderPass();
11626 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011627
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011629 QueueCommandBuffer(false);
11630 m_errorMonitor->VerifyFound();
11631
11632 {
11633 // Create and bind a vertex buffer in a reduced scope, and delete it
11634 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011635 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011637 buffer_test.TestDoubleDestroy();
11638 }
11639 m_errorMonitor->VerifyFound();
11640
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011641 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011642 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011643 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011645 m_errorMonitor->SetUnexpectedError(
11646 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11647 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011648 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11649 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011650 m_errorMonitor->VerifyFound();
11651 }
11652
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011653 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11654 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011655 // Create and bind a memory buffer with an invalid offset again,
11656 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011658 m_errorMonitor->SetUnexpectedError(
11659 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11660 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011661 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11662 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011663 m_errorMonitor->VerifyFound();
11664 }
11665
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011666 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011667 // Create and bind a memory buffer with an invalid offset again, but
11668 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011670 m_errorMonitor->SetUnexpectedError(
11671 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11672 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011673 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11674 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011675 m_errorMonitor->VerifyFound();
11676 }
11677
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011678 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011679 // Create and bind a memory buffer with an invalid offset again, but
11680 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011682 m_errorMonitor->SetUnexpectedError(
11683 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11684 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011685 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11686 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011687 m_errorMonitor->VerifyFound();
11688 }
11689
11690 {
11691 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011693 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11694 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011695 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11696 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011697 m_errorMonitor->VerifyFound();
11698 }
11699
11700 {
11701 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011703 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11704 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011705 }
11706 m_errorMonitor->VerifyFound();
11707
11708 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11709}
11710
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011711// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11712TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011713 TEST_DESCRIPTION(
11714 "Hit all possible validation checks associated with the "
11715 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11716 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011717 // 3 in ValidateCmdBufImageLayouts
11718 // * -1 Attempt to submit cmd buf w/ deleted image
11719 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11720 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011721
Tony Barbour1fa09702017-03-16 12:09:08 -060011722 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070011723 auto depth_format = find_depth_stencil_format(m_device);
11724 if (!depth_format) {
11725 printf(" No Depth + Stencil format found. Skipped.\n");
11726 return;
11727 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011728 // Create src & dst images to use for copy operations
11729 VkImage src_image;
11730 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011731 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011732
11733 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11734 const int32_t tex_width = 32;
11735 const int32_t tex_height = 32;
11736
11737 VkImageCreateInfo image_create_info = {};
11738 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11739 image_create_info.pNext = NULL;
11740 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11741 image_create_info.format = tex_format;
11742 image_create_info.extent.width = tex_width;
11743 image_create_info.extent.height = tex_height;
11744 image_create_info.extent.depth = 1;
11745 image_create_info.mipLevels = 1;
11746 image_create_info.arrayLayers = 4;
11747 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11748 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11749 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011750 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011751 image_create_info.flags = 0;
11752
11753 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11754 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011755 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011756 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11757 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011758 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11759 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11760 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11761 ASSERT_VK_SUCCESS(err);
11762
11763 // Allocate memory
11764 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011765 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011766 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011767 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11768 mem_alloc.pNext = NULL;
11769 mem_alloc.allocationSize = 0;
11770 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011771
11772 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011773 mem_alloc.allocationSize = img_mem_reqs.size;
11774 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011775 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011776 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011777 ASSERT_VK_SUCCESS(err);
11778
11779 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011780 mem_alloc.allocationSize = img_mem_reqs.size;
11781 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011782 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011783 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011784 ASSERT_VK_SUCCESS(err);
11785
11786 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011787 mem_alloc.allocationSize = img_mem_reqs.size;
11788 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011789 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011790 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011791 ASSERT_VK_SUCCESS(err);
11792
11793 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11794 ASSERT_VK_SUCCESS(err);
11795 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11796 ASSERT_VK_SUCCESS(err);
11797 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11798 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011799
Tony Barbour552f6c02016-12-21 14:34:07 -070011800 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011801 VkImageCopy copy_region;
11802 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11803 copy_region.srcSubresource.mipLevel = 0;
11804 copy_region.srcSubresource.baseArrayLayer = 0;
11805 copy_region.srcSubresource.layerCount = 1;
11806 copy_region.srcOffset.x = 0;
11807 copy_region.srcOffset.y = 0;
11808 copy_region.srcOffset.z = 0;
11809 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11810 copy_region.dstSubresource.mipLevel = 0;
11811 copy_region.dstSubresource.baseArrayLayer = 0;
11812 copy_region.dstSubresource.layerCount = 1;
11813 copy_region.dstOffset.x = 0;
11814 copy_region.dstOffset.y = 0;
11815 copy_region.dstOffset.z = 0;
11816 copy_region.extent.width = 1;
11817 copy_region.extent.height = 1;
11818 copy_region.extent.depth = 1;
11819
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11821 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11822 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011823
Cort530cf382016-12-08 09:59:47 -080011824 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 -060011825 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011826 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11827 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011828 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11829 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011830 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 -060011831 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011833 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11834 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011835 m_errorMonitor->SetUnexpectedError(
11836 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011837 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 -060011838 m_errorMonitor->VerifyFound();
11839 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011841 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011842 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011843 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011844 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011845 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 -060011846 m_errorMonitor->VerifyFound();
11847 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11849 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11850 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011851 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 -060011852 m_errorMonitor->VerifyFound();
11853 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011855 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011856 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011857 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011858 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011859 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 -060011860 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011862 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11863 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011864 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011865 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011866 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 -060011867 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011868
Cort3b021012016-12-07 12:00:57 -080011869 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11870 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11871 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11872 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11873 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11874 transfer_dst_image_barrier[0].srcAccessMask = 0;
11875 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11876 transfer_dst_image_barrier[0].image = dst_image;
11877 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11878 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11879 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11880 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11881 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11882 transfer_dst_image_barrier[0].image = depth_image;
11883 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11884 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11885 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11886
11887 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011888 VkClearColorValue color_clear_value = {};
11889 VkImageSubresourceRange clear_range;
11890 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11891 clear_range.baseMipLevel = 0;
11892 clear_range.baseArrayLayer = 0;
11893 clear_range.layerCount = 1;
11894 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011895
Cort3b021012016-12-07 12:00:57 -080011896 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11897 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011900 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011901 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011902 // Fail due to provided layout not matching actual current layout for color clear.
11903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011904 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011905 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011906
Cort530cf382016-12-08 09:59:47 -080011907 VkClearDepthStencilValue depth_clear_value = {};
11908 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011909
11910 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11911 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011914 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011915 m_errorMonitor->VerifyFound();
11916 // Fail due to provided layout not matching actual current layout for depth clear.
11917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011918 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011919 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011920
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011921 // Now cause error due to bad image layout transition in PipelineBarrier
11922 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011923 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011924 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011925 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011926 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011927 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11928 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011929 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011931 "you cannot transition the layout of aspect 1 from "
11932 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11933 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011935 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11936 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937 m_errorMonitor->VerifyFound();
11938
11939 // Finally some layout errors at RenderPass create time
11940 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11941 VkAttachmentReference attach = {};
11942 // perf warning for GENERAL layout w/ non-DS input attachment
11943 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11944 VkSubpassDescription subpass = {};
11945 subpass.inputAttachmentCount = 1;
11946 subpass.pInputAttachments = &attach;
11947 VkRenderPassCreateInfo rpci = {};
11948 rpci.subpassCount = 1;
11949 rpci.pSubpasses = &subpass;
11950 rpci.attachmentCount = 1;
11951 VkAttachmentDescription attach_desc = {};
11952 attach_desc.format = VK_FORMAT_UNDEFINED;
11953 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011954 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011955 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11957 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011958 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11959 m_errorMonitor->VerifyFound();
11960 // error w/ non-general layout
11961 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11962
11963 m_errorMonitor->SetDesiredFailureMsg(
11964 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11965 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11966 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11967 m_errorMonitor->VerifyFound();
11968 subpass.inputAttachmentCount = 0;
11969 subpass.colorAttachmentCount = 1;
11970 subpass.pColorAttachments = &attach;
11971 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11972 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11974 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011975 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11976 m_errorMonitor->VerifyFound();
11977 // error w/ non-color opt or GENERAL layout for color attachment
11978 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11979 m_errorMonitor->SetDesiredFailureMsg(
11980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11981 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11982 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11983 m_errorMonitor->VerifyFound();
11984 subpass.colorAttachmentCount = 0;
11985 subpass.pDepthStencilAttachment = &attach;
11986 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11987 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11989 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011990 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11991 m_errorMonitor->VerifyFound();
11992 // error w/ non-ds opt or GENERAL layout for color attachment
11993 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11995 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11996 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011997 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11998 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011999 // For this error we need a valid renderpass so create default one
12000 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12001 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012002 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012003 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12004 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12005 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12006 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12007 // Can't do a CLEAR load on READ_ONLY initialLayout
12008 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12009 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12010 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012012 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012013 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12014 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012015
Cort3b021012016-12-07 12:00:57 -080012016 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12017 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12018 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012019 vkDestroyImage(m_device->device(), src_image, NULL);
12020 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012021 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012022}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012023
Tobin Ehlise0936662016-10-11 08:10:51 -060012024TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12025 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12026 VkResult err;
12027
Tony Barbour1fa09702017-03-16 12:09:08 -060012028 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012029
12030 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12031 VkImageTiling tiling;
12032 VkFormatProperties format_properties;
12033 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12034 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12035 tiling = VK_IMAGE_TILING_LINEAR;
12036 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12037 tiling = VK_IMAGE_TILING_OPTIMAL;
12038 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012039 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012040 return;
12041 }
12042
12043 VkDescriptorPoolSize ds_type = {};
12044 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12045 ds_type.descriptorCount = 1;
12046
12047 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12048 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12049 ds_pool_ci.maxSets = 1;
12050 ds_pool_ci.poolSizeCount = 1;
12051 ds_pool_ci.pPoolSizes = &ds_type;
12052 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12053
12054 VkDescriptorPool ds_pool;
12055 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12056 ASSERT_VK_SUCCESS(err);
12057
12058 VkDescriptorSetLayoutBinding dsl_binding = {};
12059 dsl_binding.binding = 0;
12060 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12061 dsl_binding.descriptorCount = 1;
12062 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12063 dsl_binding.pImmutableSamplers = NULL;
12064
12065 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12066 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12067 ds_layout_ci.pNext = NULL;
12068 ds_layout_ci.bindingCount = 1;
12069 ds_layout_ci.pBindings = &dsl_binding;
12070
12071 VkDescriptorSetLayout ds_layout;
12072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12073 ASSERT_VK_SUCCESS(err);
12074
12075 VkDescriptorSetAllocateInfo alloc_info = {};
12076 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12077 alloc_info.descriptorSetCount = 1;
12078 alloc_info.descriptorPool = ds_pool;
12079 alloc_info.pSetLayouts = &ds_layout;
12080 VkDescriptorSet descriptor_set;
12081 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12082 ASSERT_VK_SUCCESS(err);
12083
12084 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12085 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12086 pipeline_layout_ci.pNext = NULL;
12087 pipeline_layout_ci.setLayoutCount = 1;
12088 pipeline_layout_ci.pSetLayouts = &ds_layout;
12089 VkPipelineLayout pipeline_layout;
12090 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12091 ASSERT_VK_SUCCESS(err);
12092
12093 VkImageObj image(m_device);
12094 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12095 ASSERT_TRUE(image.initialized());
12096 VkImageView view = image.targetView(tex_format);
12097
12098 VkDescriptorImageInfo image_info = {};
12099 image_info.imageView = view;
12100 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12101
12102 VkWriteDescriptorSet descriptor_write = {};
12103 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12104 descriptor_write.dstSet = descriptor_set;
12105 descriptor_write.dstBinding = 0;
12106 descriptor_write.descriptorCount = 1;
12107 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12108 descriptor_write.pImageInfo = &image_info;
12109
12110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12111 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12112 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12113 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12114 m_errorMonitor->VerifyFound();
12115
12116 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12117 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12118 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12119 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12120}
12121
Mark Mueller93b938f2016-08-18 10:27:40 -060012122TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012123 TEST_DESCRIPTION(
12124 "Use vkCmdExecuteCommands with invalid state "
12125 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012126
Tony Barbour1fa09702017-03-16 12:09:08 -060012127 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12129
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012130 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012131 const char *simultaneous_use_message2 =
12132 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12133 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012134
12135 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012136 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012137 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012138 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12139 command_buffer_allocate_info.commandBufferCount = 1;
12140
12141 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012142 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012143 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12144 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012145 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012146 command_buffer_inheritance_info.renderPass = m_renderPass;
12147 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012148
Mark Mueller93b938f2016-08-18 10:27:40 -060012149 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012150 command_buffer_begin_info.flags =
12151 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012152 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12153
12154 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12155 vkEndCommandBuffer(secondary_command_buffer);
12156
Mark Mueller93b938f2016-08-18 10:27:40 -060012157 VkSubmitInfo submit_info = {};
12158 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12159 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012160 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012161
Mark Mueller4042b652016-09-05 22:52:21 -060012162 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012163 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12165 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012166 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012167 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012168 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12169 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012170
Dave Houltonfbf52152017-01-06 12:55:29 -070012171 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012172 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012173 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012174
Mark Mueller4042b652016-09-05 22:52:21 -060012175 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012176 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12177 m_errorMonitor->SetUnexpectedError(
12178 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12179 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012180 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012181 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012182
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12184 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012185 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012186 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12187 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012188
12189 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012190
12191 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012192}
12193
Tony Barbour626994c2017-02-08 15:29:37 -070012194TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12195 TEST_DESCRIPTION(
12196 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12197 "errors");
12198 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12199 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 -060012200 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012201
12202 VkCommandBuffer cmd_bufs[2];
12203 VkCommandBufferAllocateInfo alloc_info;
12204 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12205 alloc_info.pNext = NULL;
12206 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012207 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012208 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12209 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12210
12211 VkCommandBufferBeginInfo cb_binfo;
12212 cb_binfo.pNext = NULL;
12213 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12214 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12215 cb_binfo.flags = 0;
12216 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12217 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12218 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12219 vkEndCommandBuffer(cmd_bufs[0]);
12220 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12221
12222 VkSubmitInfo submit_info = {};
12223 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12224 submit_info.commandBufferCount = 2;
12225 submit_info.pCommandBuffers = duplicates;
12226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12227 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12228 m_errorMonitor->VerifyFound();
12229 vkQueueWaitIdle(m_device->m_queue);
12230
12231 // Set one time use and now look for one time submit
12232 duplicates[0] = duplicates[1] = cmd_bufs[1];
12233 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12234 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12235 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12236 vkEndCommandBuffer(cmd_bufs[1]);
12237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12238 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12239 m_errorMonitor->VerifyFound();
12240 vkQueueWaitIdle(m_device->m_queue);
12241}
12242
Tobin Ehlisb093da82017-01-19 12:05:27 -070012243TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012244 TEST_DESCRIPTION(
12245 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12246 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012247
Tony Barbour1fa09702017-03-16 12:09:08 -060012248 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12250
12251 std::vector<const char *> device_extension_names;
12252 auto features = m_device->phy().features();
12253 // Make sure gs & ts are disabled
12254 features.geometryShader = false;
12255 features.tessellationShader = false;
12256 // The sacrificial device object
12257 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12258
12259 VkCommandPoolCreateInfo pool_create_info{};
12260 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12261 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12262
12263 VkCommandPool command_pool;
12264 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12265
12266 VkCommandBufferAllocateInfo cmd = {};
12267 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12268 cmd.pNext = NULL;
12269 cmd.commandPool = command_pool;
12270 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12271 cmd.commandBufferCount = 1;
12272
12273 VkCommandBuffer cmd_buffer;
12274 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12275 ASSERT_VK_SUCCESS(err);
12276
12277 VkEvent event;
12278 VkEventCreateInfo evci = {};
12279 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12280 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12281 ASSERT_VK_SUCCESS(result);
12282
12283 VkCommandBufferBeginInfo cbbi = {};
12284 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12285 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12287 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12288 m_errorMonitor->VerifyFound();
12289
12290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12291 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12292 m_errorMonitor->VerifyFound();
12293
12294 vkDestroyEvent(test_device.handle(), event, NULL);
12295 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12296}
12297
Mark Mueller917f6bc2016-08-30 10:57:19 -060012298TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012299 TEST_DESCRIPTION(
12300 "Use vkCmdExecuteCommands with invalid state "
12301 "in primary and secondary command buffers. "
12302 "Delete objects that are inuse. Call VkQueueSubmit "
12303 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012304
Tony Barbour1fa09702017-03-16 12:09:08 -060012305 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12307
Tony Barbour552f6c02016-12-21 14:34:07 -070012308 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012309
12310 VkEvent event;
12311 VkEventCreateInfo event_create_info = {};
12312 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12313 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012314 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012315
Tony Barbour552f6c02016-12-21 14:34:07 -070012316 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012317 vkDestroyEvent(m_device->device(), event, nullptr);
12318
12319 VkSubmitInfo submit_info = {};
12320 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12321 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012322 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012324 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12325 m_errorMonitor->VerifyFound();
12326
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012327 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012328 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12329
12330 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12331
Mark Mueller917f6bc2016-08-30 10:57:19 -060012332 VkSemaphoreCreateInfo semaphore_create_info = {};
12333 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12334 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012335 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012336 VkFenceCreateInfo fence_create_info = {};
12337 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12338 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012339 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012340
12341 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012342 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012343 descriptor_pool_type_count.descriptorCount = 1;
12344
12345 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12346 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12347 descriptor_pool_create_info.maxSets = 1;
12348 descriptor_pool_create_info.poolSizeCount = 1;
12349 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012350 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012351
12352 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012353 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012354
12355 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012356 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012357 descriptorset_layout_binding.descriptorCount = 1;
12358 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12359
12360 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012361 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012362 descriptorset_layout_create_info.bindingCount = 1;
12363 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12364
12365 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012366 ASSERT_VK_SUCCESS(
12367 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012368
12369 VkDescriptorSet descriptorset;
12370 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012371 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012372 descriptorset_allocate_info.descriptorSetCount = 1;
12373 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12374 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012375 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012376
Mark Mueller4042b652016-09-05 22:52:21 -060012377 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12378
12379 VkDescriptorBufferInfo buffer_info = {};
12380 buffer_info.buffer = buffer_test.GetBuffer();
12381 buffer_info.offset = 0;
12382 buffer_info.range = 1024;
12383
12384 VkWriteDescriptorSet write_descriptor_set = {};
12385 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12386 write_descriptor_set.dstSet = descriptorset;
12387 write_descriptor_set.descriptorCount = 1;
12388 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12389 write_descriptor_set.pBufferInfo = &buffer_info;
12390
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012391 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012392
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012393 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12394 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012395
12396 VkPipelineObj pipe(m_device);
12397 pipe.AddColorAttachment();
12398 pipe.AddShader(&vs);
12399 pipe.AddShader(&fs);
12400
12401 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012402 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012403 pipeline_layout_create_info.setLayoutCount = 1;
12404 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12405
12406 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012407 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012408
12409 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12410
Tony Barbour552f6c02016-12-21 14:34:07 -070012411 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012412 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012414 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12415 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12416 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012417
Tony Barbour552f6c02016-12-21 14:34:07 -070012418 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012419
Mark Mueller917f6bc2016-08-30 10:57:19 -060012420 submit_info.signalSemaphoreCount = 1;
12421 submit_info.pSignalSemaphores = &semaphore;
12422 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012423 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012424
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012426 vkDestroyEvent(m_device->device(), event, nullptr);
12427 m_errorMonitor->VerifyFound();
12428
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012430 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12431 m_errorMonitor->VerifyFound();
12432
Jeremy Hayes08369882017-02-02 10:31:06 -070012433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012434 vkDestroyFence(m_device->device(), fence, nullptr);
12435 m_errorMonitor->VerifyFound();
12436
Tobin Ehlis122207b2016-09-01 08:50:06 -070012437 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012438 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12439 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012440 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012441 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12442 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012443 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012444 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12445 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012446 vkDestroyEvent(m_device->device(), event, nullptr);
12447 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012448 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012449 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12450}
12451
Tobin Ehlis2adda372016-09-01 08:51:06 -070012452TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12453 TEST_DESCRIPTION("Delete in-use query pool.");
12454
Tony Barbour1fa09702017-03-16 12:09:08 -060012455 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12457
12458 VkQueryPool query_pool;
12459 VkQueryPoolCreateInfo query_pool_ci{};
12460 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12461 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12462 query_pool_ci.queryCount = 1;
12463 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012464 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012465 // Reset query pool to create binding with cmd buffer
12466 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12467
Tony Barbour552f6c02016-12-21 14:34:07 -070012468 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012469
12470 VkSubmitInfo submit_info = {};
12471 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12472 submit_info.commandBufferCount = 1;
12473 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12474 // Submit cmd buffer and then destroy query pool while in-flight
12475 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12476
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012478 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12479 m_errorMonitor->VerifyFound();
12480
12481 vkQueueWaitIdle(m_device->m_queue);
12482 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012483 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12484 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012485 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12486}
12487
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012488TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12489 TEST_DESCRIPTION("Delete in-use pipeline.");
12490
Tony Barbour1fa09702017-03-16 12:09:08 -060012491 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12493
12494 // Empty pipeline layout used for binding PSO
12495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12497 pipeline_layout_ci.setLayoutCount = 0;
12498 pipeline_layout_ci.pSetLayouts = NULL;
12499
12500 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012501 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012502 ASSERT_VK_SUCCESS(err);
12503
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012505 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012506 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12507 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012508 // Store pipeline handle so we can actually delete it before test finishes
12509 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012510 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012511 VkPipelineObj pipe(m_device);
12512 pipe.AddShader(&vs);
12513 pipe.AddShader(&fs);
12514 pipe.AddColorAttachment();
12515 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12516 delete_this_pipeline = pipe.handle();
12517
Tony Barbour552f6c02016-12-21 14:34:07 -070012518 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012519 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012520 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012521
Tony Barbour552f6c02016-12-21 14:34:07 -070012522 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012523
12524 VkSubmitInfo submit_info = {};
12525 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12526 submit_info.commandBufferCount = 1;
12527 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12528 // Submit cmd buffer and then pipeline destroyed while in-flight
12529 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012530 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012531 m_errorMonitor->VerifyFound();
12532 // Make sure queue finished and then actually delete pipeline
12533 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012534 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12535 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012536 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12537 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12538}
12539
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012540TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12541 TEST_DESCRIPTION("Delete in-use imageView.");
12542
Tony Barbour1fa09702017-03-16 12:09:08 -060012543 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12545
12546 VkDescriptorPoolSize ds_type_count;
12547 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12548 ds_type_count.descriptorCount = 1;
12549
12550 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12551 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12552 ds_pool_ci.maxSets = 1;
12553 ds_pool_ci.poolSizeCount = 1;
12554 ds_pool_ci.pPoolSizes = &ds_type_count;
12555
12556 VkDescriptorPool ds_pool;
12557 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12558 ASSERT_VK_SUCCESS(err);
12559
12560 VkSamplerCreateInfo sampler_ci = {};
12561 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12562 sampler_ci.pNext = NULL;
12563 sampler_ci.magFilter = VK_FILTER_NEAREST;
12564 sampler_ci.minFilter = VK_FILTER_NEAREST;
12565 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12566 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12567 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12568 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12569 sampler_ci.mipLodBias = 1.0;
12570 sampler_ci.anisotropyEnable = VK_FALSE;
12571 sampler_ci.maxAnisotropy = 1;
12572 sampler_ci.compareEnable = VK_FALSE;
12573 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12574 sampler_ci.minLod = 1.0;
12575 sampler_ci.maxLod = 1.0;
12576 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12577 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12578 VkSampler sampler;
12579
12580 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12581 ASSERT_VK_SUCCESS(err);
12582
12583 VkDescriptorSetLayoutBinding layout_binding;
12584 layout_binding.binding = 0;
12585 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12586 layout_binding.descriptorCount = 1;
12587 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12588 layout_binding.pImmutableSamplers = NULL;
12589
12590 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12591 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12592 ds_layout_ci.bindingCount = 1;
12593 ds_layout_ci.pBindings = &layout_binding;
12594 VkDescriptorSetLayout ds_layout;
12595 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12596 ASSERT_VK_SUCCESS(err);
12597
12598 VkDescriptorSetAllocateInfo alloc_info = {};
12599 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12600 alloc_info.descriptorSetCount = 1;
12601 alloc_info.descriptorPool = ds_pool;
12602 alloc_info.pSetLayouts = &ds_layout;
12603 VkDescriptorSet descriptor_set;
12604 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12605 ASSERT_VK_SUCCESS(err);
12606
12607 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12608 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12609 pipeline_layout_ci.pNext = NULL;
12610 pipeline_layout_ci.setLayoutCount = 1;
12611 pipeline_layout_ci.pSetLayouts = &ds_layout;
12612
12613 VkPipelineLayout pipeline_layout;
12614 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12615 ASSERT_VK_SUCCESS(err);
12616
12617 VkImageObj image(m_device);
12618 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12619 ASSERT_TRUE(image.initialized());
12620
12621 VkImageView view;
12622 VkImageViewCreateInfo ivci = {};
12623 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12624 ivci.image = image.handle();
12625 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12626 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12627 ivci.subresourceRange.layerCount = 1;
12628 ivci.subresourceRange.baseMipLevel = 0;
12629 ivci.subresourceRange.levelCount = 1;
12630 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12631
12632 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12633 ASSERT_VK_SUCCESS(err);
12634
12635 VkDescriptorImageInfo image_info{};
12636 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12637 image_info.imageView = view;
12638 image_info.sampler = sampler;
12639
12640 VkWriteDescriptorSet descriptor_write = {};
12641 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12642 descriptor_write.dstSet = descriptor_set;
12643 descriptor_write.dstBinding = 0;
12644 descriptor_write.descriptorCount = 1;
12645 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12646 descriptor_write.pImageInfo = &image_info;
12647
12648 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12649
12650 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012651 char const *vsSource =
12652 "#version 450\n"
12653 "\n"
12654 "out gl_PerVertex { \n"
12655 " vec4 gl_Position;\n"
12656 "};\n"
12657 "void main(){\n"
12658 " gl_Position = vec4(1);\n"
12659 "}\n";
12660 char const *fsSource =
12661 "#version 450\n"
12662 "\n"
12663 "layout(set=0, binding=0) uniform sampler2D s;\n"
12664 "layout(location=0) out vec4 x;\n"
12665 "void main(){\n"
12666 " x = texture(s, vec2(1));\n"
12667 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012668 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12669 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12670 VkPipelineObj pipe(m_device);
12671 pipe.AddShader(&vs);
12672 pipe.AddShader(&fs);
12673 pipe.AddColorAttachment();
12674 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12675
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012677
Tony Barbour552f6c02016-12-21 14:34:07 -070012678 m_commandBuffer->BeginCommandBuffer();
12679 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012680 // Bind pipeline to cmd buffer
12681 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12682 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12683 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012684
12685 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12686 VkRect2D scissor = {{0, 0}, {16, 16}};
12687 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12688 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12689
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012690 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012691 m_commandBuffer->EndRenderPass();
12692 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012693 // Submit cmd buffer then destroy sampler
12694 VkSubmitInfo submit_info = {};
12695 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12696 submit_info.commandBufferCount = 1;
12697 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12698 // Submit cmd buffer and then destroy imageView while in-flight
12699 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12700
12701 vkDestroyImageView(m_device->device(), view, nullptr);
12702 m_errorMonitor->VerifyFound();
12703 vkQueueWaitIdle(m_device->m_queue);
12704 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012705 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12706 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012707 vkDestroyImageView(m_device->device(), view, NULL);
12708 vkDestroySampler(m_device->device(), sampler, nullptr);
12709 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12710 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12711 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12712}
12713
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012714TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12715 TEST_DESCRIPTION("Delete in-use bufferView.");
12716
Tony Barbour1fa09702017-03-16 12:09:08 -060012717 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12719
12720 VkDescriptorPoolSize ds_type_count;
12721 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12722 ds_type_count.descriptorCount = 1;
12723
12724 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12725 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12726 ds_pool_ci.maxSets = 1;
12727 ds_pool_ci.poolSizeCount = 1;
12728 ds_pool_ci.pPoolSizes = &ds_type_count;
12729
12730 VkDescriptorPool ds_pool;
12731 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12732 ASSERT_VK_SUCCESS(err);
12733
12734 VkDescriptorSetLayoutBinding layout_binding;
12735 layout_binding.binding = 0;
12736 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12737 layout_binding.descriptorCount = 1;
12738 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12739 layout_binding.pImmutableSamplers = NULL;
12740
12741 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12742 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12743 ds_layout_ci.bindingCount = 1;
12744 ds_layout_ci.pBindings = &layout_binding;
12745 VkDescriptorSetLayout ds_layout;
12746 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12747 ASSERT_VK_SUCCESS(err);
12748
12749 VkDescriptorSetAllocateInfo alloc_info = {};
12750 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12751 alloc_info.descriptorSetCount = 1;
12752 alloc_info.descriptorPool = ds_pool;
12753 alloc_info.pSetLayouts = &ds_layout;
12754 VkDescriptorSet descriptor_set;
12755 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12756 ASSERT_VK_SUCCESS(err);
12757
12758 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12759 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12760 pipeline_layout_ci.pNext = NULL;
12761 pipeline_layout_ci.setLayoutCount = 1;
12762 pipeline_layout_ci.pSetLayouts = &ds_layout;
12763
12764 VkPipelineLayout pipeline_layout;
12765 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12766 ASSERT_VK_SUCCESS(err);
12767
12768 VkBuffer buffer;
12769 uint32_t queue_family_index = 0;
12770 VkBufferCreateInfo buffer_create_info = {};
12771 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12772 buffer_create_info.size = 1024;
12773 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12774 buffer_create_info.queueFamilyIndexCount = 1;
12775 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12776
12777 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12778 ASSERT_VK_SUCCESS(err);
12779
12780 VkMemoryRequirements memory_reqs;
12781 VkDeviceMemory buffer_memory;
12782
12783 VkMemoryAllocateInfo memory_info = {};
12784 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12785 memory_info.allocationSize = 0;
12786 memory_info.memoryTypeIndex = 0;
12787
12788 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12789 memory_info.allocationSize = memory_reqs.size;
12790 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12791 ASSERT_TRUE(pass);
12792
12793 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12794 ASSERT_VK_SUCCESS(err);
12795 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12796 ASSERT_VK_SUCCESS(err);
12797
12798 VkBufferView view;
12799 VkBufferViewCreateInfo bvci = {};
12800 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12801 bvci.buffer = buffer;
12802 bvci.format = VK_FORMAT_R8_UNORM;
12803 bvci.range = VK_WHOLE_SIZE;
12804
12805 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12806 ASSERT_VK_SUCCESS(err);
12807
12808 VkWriteDescriptorSet descriptor_write = {};
12809 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12810 descriptor_write.dstSet = descriptor_set;
12811 descriptor_write.dstBinding = 0;
12812 descriptor_write.descriptorCount = 1;
12813 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12814 descriptor_write.pTexelBufferView = &view;
12815
12816 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12817
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012818 char const *vsSource =
12819 "#version 450\n"
12820 "\n"
12821 "out gl_PerVertex { \n"
12822 " vec4 gl_Position;\n"
12823 "};\n"
12824 "void main(){\n"
12825 " gl_Position = vec4(1);\n"
12826 "}\n";
12827 char const *fsSource =
12828 "#version 450\n"
12829 "\n"
12830 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12831 "layout(location=0) out vec4 x;\n"
12832 "void main(){\n"
12833 " x = imageLoad(s, 0);\n"
12834 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012835 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12836 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12837 VkPipelineObj pipe(m_device);
12838 pipe.AddShader(&vs);
12839 pipe.AddShader(&fs);
12840 pipe.AddColorAttachment();
12841 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12842
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012844
Tony Barbour552f6c02016-12-21 14:34:07 -070012845 m_commandBuffer->BeginCommandBuffer();
12846 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012847 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12848 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12849 VkRect2D scissor = {{0, 0}, {16, 16}};
12850 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12851 // Bind pipeline to cmd buffer
12852 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12853 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12854 &descriptor_set, 0, nullptr);
12855 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012856 m_commandBuffer->EndRenderPass();
12857 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012858
12859 VkSubmitInfo submit_info = {};
12860 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12861 submit_info.commandBufferCount = 1;
12862 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12863 // Submit cmd buffer and then destroy bufferView while in-flight
12864 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12865
12866 vkDestroyBufferView(m_device->device(), view, nullptr);
12867 m_errorMonitor->VerifyFound();
12868 vkQueueWaitIdle(m_device->m_queue);
12869 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012870 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12871 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012872 vkDestroyBufferView(m_device->device(), view, NULL);
12873 vkDestroyBuffer(m_device->device(), buffer, NULL);
12874 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12875 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12876 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12877 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12878}
12879
Tobin Ehlis209532e2016-09-07 13:52:18 -060012880TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12881 TEST_DESCRIPTION("Delete in-use sampler.");
12882
Tony Barbour1fa09702017-03-16 12:09:08 -060012883 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12885
12886 VkDescriptorPoolSize ds_type_count;
12887 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12888 ds_type_count.descriptorCount = 1;
12889
12890 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12891 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12892 ds_pool_ci.maxSets = 1;
12893 ds_pool_ci.poolSizeCount = 1;
12894 ds_pool_ci.pPoolSizes = &ds_type_count;
12895
12896 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012897 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012898 ASSERT_VK_SUCCESS(err);
12899
12900 VkSamplerCreateInfo sampler_ci = {};
12901 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12902 sampler_ci.pNext = NULL;
12903 sampler_ci.magFilter = VK_FILTER_NEAREST;
12904 sampler_ci.minFilter = VK_FILTER_NEAREST;
12905 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12906 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12907 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12908 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12909 sampler_ci.mipLodBias = 1.0;
12910 sampler_ci.anisotropyEnable = VK_FALSE;
12911 sampler_ci.maxAnisotropy = 1;
12912 sampler_ci.compareEnable = VK_FALSE;
12913 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12914 sampler_ci.minLod = 1.0;
12915 sampler_ci.maxLod = 1.0;
12916 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12917 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12918 VkSampler sampler;
12919
12920 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12921 ASSERT_VK_SUCCESS(err);
12922
12923 VkDescriptorSetLayoutBinding layout_binding;
12924 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012925 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012926 layout_binding.descriptorCount = 1;
12927 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12928 layout_binding.pImmutableSamplers = NULL;
12929
12930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12932 ds_layout_ci.bindingCount = 1;
12933 ds_layout_ci.pBindings = &layout_binding;
12934 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012935 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012936 ASSERT_VK_SUCCESS(err);
12937
12938 VkDescriptorSetAllocateInfo alloc_info = {};
12939 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12940 alloc_info.descriptorSetCount = 1;
12941 alloc_info.descriptorPool = ds_pool;
12942 alloc_info.pSetLayouts = &ds_layout;
12943 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012944 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012945 ASSERT_VK_SUCCESS(err);
12946
12947 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12948 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12949 pipeline_layout_ci.pNext = NULL;
12950 pipeline_layout_ci.setLayoutCount = 1;
12951 pipeline_layout_ci.pSetLayouts = &ds_layout;
12952
12953 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012954 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012955 ASSERT_VK_SUCCESS(err);
12956
12957 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012958 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 -060012959 ASSERT_TRUE(image.initialized());
12960
12961 VkImageView view;
12962 VkImageViewCreateInfo ivci = {};
12963 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12964 ivci.image = image.handle();
12965 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12966 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12967 ivci.subresourceRange.layerCount = 1;
12968 ivci.subresourceRange.baseMipLevel = 0;
12969 ivci.subresourceRange.levelCount = 1;
12970 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12971
12972 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12973 ASSERT_VK_SUCCESS(err);
12974
12975 VkDescriptorImageInfo image_info{};
12976 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12977 image_info.imageView = view;
12978 image_info.sampler = sampler;
12979
12980 VkWriteDescriptorSet descriptor_write = {};
12981 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12982 descriptor_write.dstSet = descriptor_set;
12983 descriptor_write.dstBinding = 0;
12984 descriptor_write.descriptorCount = 1;
12985 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12986 descriptor_write.pImageInfo = &image_info;
12987
12988 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12989
12990 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012991 char const *vsSource =
12992 "#version 450\n"
12993 "\n"
12994 "out gl_PerVertex { \n"
12995 " vec4 gl_Position;\n"
12996 "};\n"
12997 "void main(){\n"
12998 " gl_Position = vec4(1);\n"
12999 "}\n";
13000 char const *fsSource =
13001 "#version 450\n"
13002 "\n"
13003 "layout(set=0, binding=0) uniform sampler2D s;\n"
13004 "layout(location=0) out vec4 x;\n"
13005 "void main(){\n"
13006 " x = texture(s, vec2(1));\n"
13007 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013008 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13009 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13010 VkPipelineObj pipe(m_device);
13011 pipe.AddShader(&vs);
13012 pipe.AddShader(&fs);
13013 pipe.AddColorAttachment();
13014 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13015
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013017
Tony Barbour552f6c02016-12-21 14:34:07 -070013018 m_commandBuffer->BeginCommandBuffer();
13019 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013020 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013021 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13022 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13023 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013024
13025 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13026 VkRect2D scissor = {{0, 0}, {16, 16}};
13027 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13028 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13029
Tobin Ehlis209532e2016-09-07 13:52:18 -060013030 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013031 m_commandBuffer->EndRenderPass();
13032 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013033 // Submit cmd buffer then destroy sampler
13034 VkSubmitInfo submit_info = {};
13035 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13036 submit_info.commandBufferCount = 1;
13037 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13038 // Submit cmd buffer and then destroy sampler while in-flight
13039 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13040
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013041 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013042 m_errorMonitor->VerifyFound();
13043 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013044
Tobin Ehlis209532e2016-09-07 13:52:18 -060013045 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013046 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13047 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013048 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013049 vkDestroyImageView(m_device->device(), view, NULL);
13050 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13051 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13052 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13053}
13054
Mark Mueller1cd9f412016-08-25 13:23:52 -060013055TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013056 TEST_DESCRIPTION(
13057 "Call VkQueueSubmit with a semaphore that is already "
13058 "signaled but not waited on by the queue. Wait on a "
13059 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013060
Tony Barbour1fa09702017-03-16 12:09:08 -060013061 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13063
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013064 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 -070013065 const char *invalid_fence_wait_message =
13066 " which has not been submitted on a Queue or during "
13067 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013068
Tony Barbour552f6c02016-12-21 14:34:07 -070013069 m_commandBuffer->BeginCommandBuffer();
13070 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013071
13072 VkSemaphoreCreateInfo semaphore_create_info = {};
13073 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13074 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013075 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013076 VkSubmitInfo submit_info = {};
13077 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13078 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013079 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013080 submit_info.signalSemaphoreCount = 1;
13081 submit_info.pSignalSemaphores = &semaphore;
13082 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013083 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013084 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013085 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013086 m_commandBuffer->BeginCommandBuffer();
13087 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013089 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13090 m_errorMonitor->VerifyFound();
13091
Mark Mueller1cd9f412016-08-25 13:23:52 -060013092 VkFenceCreateInfo fence_create_info = {};
13093 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13094 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013095 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013098 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13099 m_errorMonitor->VerifyFound();
13100
Mark Mueller4042b652016-09-05 22:52:21 -060013101 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013102 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013103 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13104}
13105
Tobin Ehlis4af23302016-07-19 10:50:30 -060013106TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013107 TEST_DESCRIPTION(
13108 "Bind a secondary command buffer with with a framebuffer "
13109 "that does not match the framebuffer for the active "
13110 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013111 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013112 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13113
13114 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013115 VkAttachmentDescription attachment = {0,
13116 VK_FORMAT_B8G8R8A8_UNORM,
13117 VK_SAMPLE_COUNT_1_BIT,
13118 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13119 VK_ATTACHMENT_STORE_OP_STORE,
13120 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13121 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13122 VK_IMAGE_LAYOUT_UNDEFINED,
13123 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013124
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013125 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013126
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013127 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013128
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013129 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013130
13131 VkRenderPass rp;
13132 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13133 ASSERT_VK_SUCCESS(err);
13134
13135 // A compatible framebuffer.
13136 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013137 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 -060013138 ASSERT_TRUE(image.initialized());
13139
13140 VkImageViewCreateInfo ivci = {
13141 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13142 nullptr,
13143 0,
13144 image.handle(),
13145 VK_IMAGE_VIEW_TYPE_2D,
13146 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013147 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13148 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013149 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13150 };
13151 VkImageView view;
13152 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13153 ASSERT_VK_SUCCESS(err);
13154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013155 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013156 VkFramebuffer fb;
13157 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13158 ASSERT_VK_SUCCESS(err);
13159
13160 VkCommandBufferAllocateInfo cbai = {};
13161 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013162 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013163 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13164 cbai.commandBufferCount = 1;
13165
13166 VkCommandBuffer sec_cb;
13167 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13168 ASSERT_VK_SUCCESS(err);
13169 VkCommandBufferBeginInfo cbbi = {};
13170 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013171 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013172 cbii.renderPass = renderPass();
13173 cbii.framebuffer = fb;
13174 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13175 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013176 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 -060013177 cbbi.pInheritanceInfo = &cbii;
13178 vkBeginCommandBuffer(sec_cb, &cbbi);
13179 vkEndCommandBuffer(sec_cb);
13180
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013181 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013182 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13183 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013184
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013186 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013187 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13188 m_errorMonitor->VerifyFound();
13189 // Cleanup
13190 vkDestroyImageView(m_device->device(), view, NULL);
13191 vkDestroyRenderPass(m_device->device(), rp, NULL);
13192 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13193}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013194
13195TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013196 TEST_DESCRIPTION(
13197 "If logicOp is available on the device, set it to an "
13198 "invalid value. If logicOp is not available, attempt to "
13199 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013200 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13202
13203 auto features = m_device->phy().features();
13204 // Set the expected error depending on whether or not logicOp available
13205 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13207 "If logic operations feature not "
13208 "enabled, logicOpEnable must be "
13209 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013210 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013212 }
13213 // Create a pipeline using logicOp
13214 VkResult err;
13215
13216 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13217 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13218
13219 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013220 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013221 ASSERT_VK_SUCCESS(err);
13222
13223 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13224 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13225 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013226 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013227 vp_state_ci.pViewports = &vp;
13228 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013229 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013230 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013231
13232 VkPipelineShaderStageCreateInfo shaderStages[2];
13233 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13234
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013235 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13236 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013237 shaderStages[0] = vs.GetStageCreateInfo();
13238 shaderStages[1] = fs.GetStageCreateInfo();
13239
13240 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13241 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13242
13243 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13244 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13245 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13246
13247 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13248 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013249 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013250
13251 VkPipelineColorBlendAttachmentState att = {};
13252 att.blendEnable = VK_FALSE;
13253 att.colorWriteMask = 0xf;
13254
13255 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13256 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13257 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13258 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013259 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013260 cb_ci.attachmentCount = 1;
13261 cb_ci.pAttachments = &att;
13262
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013263 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13264 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13265 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13266
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013267 VkGraphicsPipelineCreateInfo gp_ci = {};
13268 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13269 gp_ci.stageCount = 2;
13270 gp_ci.pStages = shaderStages;
13271 gp_ci.pVertexInputState = &vi_ci;
13272 gp_ci.pInputAssemblyState = &ia_ci;
13273 gp_ci.pViewportState = &vp_state_ci;
13274 gp_ci.pRasterizationState = &rs_ci;
13275 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013276 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013277 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13278 gp_ci.layout = pipeline_layout;
13279 gp_ci.renderPass = renderPass();
13280
13281 VkPipelineCacheCreateInfo pc_ci = {};
13282 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13283
13284 VkPipeline pipeline;
13285 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013286 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013287 ASSERT_VK_SUCCESS(err);
13288
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013289 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013290 m_errorMonitor->VerifyFound();
13291 if (VK_SUCCESS == err) {
13292 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13293 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013294 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13295 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13296}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013297
Mike Stroyanaccf7692015-05-12 16:00:45 -060013298#if GTEST_IS_THREADSAFE
13299struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013300 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013301 VkEvent event;
13302 bool bailout;
13303};
13304
Karl Schultz6addd812016-02-02 17:17:23 -070013305extern "C" void *AddToCommandBuffer(void *arg) {
13306 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013307
Mike Stroyana6d14942016-07-13 15:10:05 -060013308 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013309 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013310 if (data->bailout) {
13311 break;
13312 }
13313 }
13314 return NULL;
13315}
13316
Karl Schultz6addd812016-02-02 17:17:23 -070013317TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013318 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013319
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013321
Tony Barbour1fa09702017-03-16 12:09:08 -060013322 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013323 ASSERT_NO_FATAL_FAILURE(InitViewport());
13324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13325
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013326 // Calls AllocateCommandBuffers
13327 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013328
13329 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013330 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013331
13332 VkEventCreateInfo event_info;
13333 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013334 VkResult err;
13335
13336 memset(&event_info, 0, sizeof(event_info));
13337 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13338
Chia-I Wuf7458c52015-10-26 21:10:41 +080013339 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013340 ASSERT_VK_SUCCESS(err);
13341
Mike Stroyanaccf7692015-05-12 16:00:45 -060013342 err = vkResetEvent(device(), event);
13343 ASSERT_VK_SUCCESS(err);
13344
13345 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013346 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013347 data.event = event;
13348 data.bailout = false;
13349 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013350
13351 // First do some correct operations using multiple threads.
13352 // Add many entries to command buffer from another thread.
13353 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13354 // Make non-conflicting calls from this thread at the same time.
13355 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013356 uint32_t count;
13357 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013358 }
13359 test_platform_thread_join(thread, NULL);
13360
13361 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013362 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013363 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013364 // Add many entries to command buffer from this thread at the same time.
13365 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013366
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013367 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013368 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013369
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013370 m_errorMonitor->SetBailout(NULL);
13371
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013372 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013373
Chia-I Wuf7458c52015-10-26 21:10:41 +080013374 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013375}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013376#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013377
Karl Schultz6addd812016-02-02 17:17:23 -070013378TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013379 TEST_DESCRIPTION(
13380 "Test that an error is produced for a spirv module "
13381 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013382
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013384
Tony Barbour1fa09702017-03-16 12:09:08 -060013385 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13387
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013388 VkShaderModule module;
13389 VkShaderModuleCreateInfo moduleCreateInfo;
13390 struct icd_spv_header spv;
13391
13392 spv.magic = ICD_SPV_MAGIC;
13393 spv.version = ICD_SPV_VERSION;
13394 spv.gen_magic = 0;
13395
13396 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13397 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013398 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013399 moduleCreateInfo.codeSize = 4;
13400 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013401 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013402
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013403 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013404}
13405
Karl Schultz6addd812016-02-02 17:17:23 -070013406TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013407 TEST_DESCRIPTION(
13408 "Test that an error is produced for a spirv module "
13409 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013412
Tony Barbour1fa09702017-03-16 12:09:08 -060013413 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13415
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013416 VkShaderModule module;
13417 VkShaderModuleCreateInfo moduleCreateInfo;
13418 struct icd_spv_header spv;
13419
13420 spv.magic = ~ICD_SPV_MAGIC;
13421 spv.version = ICD_SPV_VERSION;
13422 spv.gen_magic = 0;
13423
13424 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13425 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013426 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013427 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13428 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013429 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013430
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013431 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013432}
13433
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013434#if 0
13435// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013436TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013438 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013439
Tony Barbour1fa09702017-03-16 12:09:08 -060013440 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013441 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13442
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013443 VkShaderModule module;
13444 VkShaderModuleCreateInfo moduleCreateInfo;
13445 struct icd_spv_header spv;
13446
13447 spv.magic = ICD_SPV_MAGIC;
13448 spv.version = ~ICD_SPV_VERSION;
13449 spv.gen_magic = 0;
13450
13451 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13452 moduleCreateInfo.pNext = NULL;
13453
Karl Schultz6addd812016-02-02 17:17:23 -070013454 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013455 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13456 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013457 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013458
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013459 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013460}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013461#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013462
Karl Schultz6addd812016-02-02 17:17:23 -070013463TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013464 TEST_DESCRIPTION(
13465 "Test that a warning is produced for a vertex output that "
13466 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013468
Tony Barbour1fa09702017-03-16 12:09:08 -060013469 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013471
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013472 char const *vsSource =
13473 "#version 450\n"
13474 "\n"
13475 "layout(location=0) out float x;\n"
13476 "out gl_PerVertex {\n"
13477 " vec4 gl_Position;\n"
13478 "};\n"
13479 "void main(){\n"
13480 " gl_Position = vec4(1);\n"
13481 " x = 0;\n"
13482 "}\n";
13483 char const *fsSource =
13484 "#version 450\n"
13485 "\n"
13486 "layout(location=0) out vec4 color;\n"
13487 "void main(){\n"
13488 " color = vec4(1);\n"
13489 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013490
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013491 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13492 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013493
13494 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013495 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013496 pipe.AddShader(&vs);
13497 pipe.AddShader(&fs);
13498
Chris Forbes9f7ff632015-05-25 11:13:08 +120013499 VkDescriptorSetObj descriptorSet(m_device);
13500 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013502
Tony Barbour5781e8f2015-08-04 16:23:11 -060013503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013504
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013505 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013506}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013507
Mark Mueller098c9cb2016-09-08 09:01:57 -060013508TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13509 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13510
Tony Barbour1fa09702017-03-16 12:09:08 -060013511 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13513
13514 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013515 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013516
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013517 char const *vsSource =
13518 "#version 450\n"
13519 "\n"
13520 "out gl_PerVertex {\n"
13521 " vec4 gl_Position;\n"
13522 "};\n"
13523 "void main(){\n"
13524 " gl_Position = vec4(1);\n"
13525 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013526
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013527 char const *fsSource =
13528 "#version 450\n"
13529 "\n"
13530 "layout (constant_id = 0) const float r = 0.0f;\n"
13531 "layout(location = 0) out vec4 uFragColor;\n"
13532 "void main(){\n"
13533 " uFragColor = vec4(r,1,0,1);\n"
13534 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013535
13536 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13537 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13538
13539 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13540 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13541
13542 VkPipelineLayout pipeline_layout;
13543 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13544
13545 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13546 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13547 vp_state_create_info.viewportCount = 1;
13548 VkViewport viewport = {};
13549 vp_state_create_info.pViewports = &viewport;
13550 vp_state_create_info.scissorCount = 1;
13551 VkRect2D scissors = {};
13552 vp_state_create_info.pScissors = &scissors;
13553
13554 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13555
13556 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13557 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13558 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13559 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13560
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013561 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013562
13563 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13564 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13565
13566 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13567 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13568 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13569
13570 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13571 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13572 rasterization_state_create_info.pNext = nullptr;
13573 rasterization_state_create_info.lineWidth = 1.0f;
13574 rasterization_state_create_info.rasterizerDiscardEnable = true;
13575
13576 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13577 color_blend_attachment_state.blendEnable = VK_FALSE;
13578 color_blend_attachment_state.colorWriteMask = 0xf;
13579
13580 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13581 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13582 color_blend_state_create_info.attachmentCount = 1;
13583 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13584
13585 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13586 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13587 graphicspipe_create_info.stageCount = 2;
13588 graphicspipe_create_info.pStages = shader_stage_create_info;
13589 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13590 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13591 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13592 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13593 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13594 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13595 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13596 graphicspipe_create_info.layout = pipeline_layout;
13597 graphicspipe_create_info.renderPass = renderPass();
13598
13599 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13600 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13601
13602 VkPipelineCache pipelineCache;
13603 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13604
13605 // This structure maps constant ids to data locations.
13606 const VkSpecializationMapEntry entry =
13607 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013608 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013609
13610 uint32_t data = 1;
13611
13612 // Set up the info describing spec map and data
13613 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013614 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013615 };
13616 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13617
13618 VkPipeline pipeline;
13619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13620 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13621 m_errorMonitor->VerifyFound();
13622
13623 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13624 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13625}
13626
13627TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13628 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13629
Tony Barbour1fa09702017-03-16 12:09:08 -060013630 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13632
13633 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13634
13635 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13636 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13637 descriptor_pool_type_count[0].descriptorCount = 1;
13638 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13639 descriptor_pool_type_count[1].descriptorCount = 1;
13640
13641 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13642 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13643 descriptor_pool_create_info.maxSets = 1;
13644 descriptor_pool_create_info.poolSizeCount = 2;
13645 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13646 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13647
13648 VkDescriptorPool descriptorset_pool;
13649 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13650
13651 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13652 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13653 descriptorset_layout_binding.descriptorCount = 1;
13654 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013655 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013656
13657 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13658 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13659 descriptorset_layout_create_info.bindingCount = 1;
13660 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13661
13662 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013663 ASSERT_VK_SUCCESS(
13664 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013665
13666 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13667 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13668 descriptorset_allocate_info.descriptorSetCount = 1;
13669 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13670 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13671 VkDescriptorSet descriptorset;
13672 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13673
13674 // Challenge core_validation with a non uniform buffer type.
13675 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013677 char const *vsSource =
13678 "#version 450\n"
13679 "\n"
13680 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13681 " mat4 mvp;\n"
13682 "} ubuf;\n"
13683 "out gl_PerVertex {\n"
13684 " vec4 gl_Position;\n"
13685 "};\n"
13686 "void main(){\n"
13687 " gl_Position = ubuf.mvp * vec4(1);\n"
13688 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013689
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013690 char const *fsSource =
13691 "#version 450\n"
13692 "\n"
13693 "layout(location = 0) out vec4 uFragColor;\n"
13694 "void main(){\n"
13695 " uFragColor = vec4(0,1,0,1);\n"
13696 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013697
13698 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13699 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13700
13701 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13702 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13703 pipeline_layout_create_info.setLayoutCount = 1;
13704 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13705
13706 VkPipelineLayout pipeline_layout;
13707 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13708
13709 VkPipelineObj pipe(m_device);
13710 pipe.AddColorAttachment();
13711 pipe.AddShader(&vs);
13712 pipe.AddShader(&fs);
13713
13714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13715 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13716 m_errorMonitor->VerifyFound();
13717
13718 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13719 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13720 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13721}
13722
13723TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13724 TEST_DESCRIPTION(
13725 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13726
Tony Barbour1fa09702017-03-16 12:09:08 -060013727 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13729
13730 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13731
13732 VkDescriptorPoolSize descriptor_pool_type_count = {};
13733 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13734 descriptor_pool_type_count.descriptorCount = 1;
13735
13736 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13737 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13738 descriptor_pool_create_info.maxSets = 1;
13739 descriptor_pool_create_info.poolSizeCount = 1;
13740 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13741 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13742
13743 VkDescriptorPool descriptorset_pool;
13744 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13745
13746 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13747 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13748 descriptorset_layout_binding.descriptorCount = 1;
13749 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13750 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013751 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013752
13753 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13754 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13755 descriptorset_layout_create_info.bindingCount = 1;
13756 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13757
13758 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013759 ASSERT_VK_SUCCESS(
13760 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013761
13762 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13763 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13764 descriptorset_allocate_info.descriptorSetCount = 1;
13765 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13766 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13767 VkDescriptorSet descriptorset;
13768 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13769
13770 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13771
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013772 char const *vsSource =
13773 "#version 450\n"
13774 "\n"
13775 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13776 " mat4 mvp;\n"
13777 "} ubuf;\n"
13778 "out gl_PerVertex {\n"
13779 " vec4 gl_Position;\n"
13780 "};\n"
13781 "void main(){\n"
13782 " gl_Position = ubuf.mvp * vec4(1);\n"
13783 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013784
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013785 char const *fsSource =
13786 "#version 450\n"
13787 "\n"
13788 "layout(location = 0) out vec4 uFragColor;\n"
13789 "void main(){\n"
13790 " uFragColor = vec4(0,1,0,1);\n"
13791 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013792
13793 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13794 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13795
13796 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13797 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13798 pipeline_layout_create_info.setLayoutCount = 1;
13799 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13800
13801 VkPipelineLayout pipeline_layout;
13802 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13803
13804 VkPipelineObj pipe(m_device);
13805 pipe.AddColorAttachment();
13806 pipe.AddShader(&vs);
13807 pipe.AddShader(&fs);
13808
13809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13810 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13811 m_errorMonitor->VerifyFound();
13812
13813 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13814 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13815 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13816}
13817
13818TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013819 TEST_DESCRIPTION(
13820 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13821 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013822
Tony Barbour1fa09702017-03-16 12:09:08 -060013823 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13825
13826 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013827 "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 -060013828
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013829 char const *vsSource =
13830 "#version 450\n"
13831 "\n"
13832 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13833 "out gl_PerVertex {\n"
13834 " vec4 gl_Position;\n"
13835 "};\n"
13836 "void main(){\n"
13837 " gl_Position = vec4(consts.x);\n"
13838 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013839
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013840 char const *fsSource =
13841 "#version 450\n"
13842 "\n"
13843 "layout(location = 0) out vec4 uFragColor;\n"
13844 "void main(){\n"
13845 " uFragColor = vec4(0,1,0,1);\n"
13846 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013847
13848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13850
13851 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13852 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13853
13854 // Set up a push constant range
13855 VkPushConstantRange push_constant_ranges = {};
13856 // Set to the wrong stage to challenge core_validation
13857 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13858 push_constant_ranges.size = 4;
13859
13860 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13861 pipeline_layout_create_info.pushConstantRangeCount = 1;
13862
13863 VkPipelineLayout pipeline_layout;
13864 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13865
13866 VkPipelineObj pipe(m_device);
13867 pipe.AddColorAttachment();
13868 pipe.AddShader(&vs);
13869 pipe.AddShader(&fs);
13870
13871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13872 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13873 m_errorMonitor->VerifyFound();
13874
13875 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13876}
13877
13878TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13879 TEST_DESCRIPTION(
13880 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13881
Tony Barbour1fa09702017-03-16 12:09:08 -060013882 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13884
13885 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013886 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013887
13888 // Some awkward steps are required to test with custom device features.
13889 std::vector<const char *> device_extension_names;
13890 auto features = m_device->phy().features();
13891 // Disable support for 64 bit floats
13892 features.shaderFloat64 = false;
13893 // The sacrificial device object
13894 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13895
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013896 char const *vsSource =
13897 "#version 450\n"
13898 "\n"
13899 "out gl_PerVertex {\n"
13900 " vec4 gl_Position;\n"
13901 "};\n"
13902 "void main(){\n"
13903 " gl_Position = vec4(1);\n"
13904 "}\n";
13905 char const *fsSource =
13906 "#version 450\n"
13907 "\n"
13908 "layout(location=0) out vec4 color;\n"
13909 "void main(){\n"
13910 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13911 " color = vec4(green);\n"
13912 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013913
13914 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13915 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13916
13917 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013918
13919 VkPipelineObj pipe(&test_device);
13920 pipe.AddColorAttachment();
13921 pipe.AddShader(&vs);
13922 pipe.AddShader(&fs);
13923
13924 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13925 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13926 VkPipelineLayout pipeline_layout;
13927 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13928
13929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13930 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13931 m_errorMonitor->VerifyFound();
13932
13933 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13934}
13935
13936TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13937 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13938
Tony Barbour1fa09702017-03-16 12:09:08 -060013939 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013940 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13941
Mark Lobodzinski95707332017-03-24 14:16:42 -060013942 // const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013943
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013944 char const *vsSource =
13945 "#version 450\n"
13946 "\n"
13947 "out gl_PerVertex {\n"
13948 " vec4 gl_Position;\n"
13949 "};\n"
13950 "layout(xfb_buffer = 1) out;"
13951 "void main(){\n"
13952 " gl_Position = vec4(1);\n"
13953 "}\n";
13954 char const *fsSource =
13955 "#version 450\n"
13956 "\n"
13957 "layout(location=0) out vec4 color;\n"
13958 "void main(){\n"
13959 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13960 " color = vec4(green);\n"
13961 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013962
13963 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13964 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13965
13966 VkPipelineObj pipe(m_device);
13967 pipe.AddColorAttachment();
13968 pipe.AddShader(&vs);
13969 pipe.AddShader(&fs);
13970
13971 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13972 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13973 VkPipelineLayout pipeline_layout;
13974 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13975
Mark Lobodzinski95707332017-03-24 14:16:42 -060013976 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13977 // pipe.CreateVKPipeline(pipeline_layout, renderPass());
13978 // m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013979
13980 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13981}
13982
Karl Schultz6addd812016-02-02 17:17:23 -070013983TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013984 TEST_DESCRIPTION(
13985 "Test that an error is produced for a fragment shader input "
13986 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013987
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013989
Tony Barbour1fa09702017-03-16 12:09:08 -060013990 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013992
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013993 char const *vsSource =
13994 "#version 450\n"
13995 "\n"
13996 "out gl_PerVertex {\n"
13997 " vec4 gl_Position;\n"
13998 "};\n"
13999 "void main(){\n"
14000 " gl_Position = vec4(1);\n"
14001 "}\n";
14002 char const *fsSource =
14003 "#version 450\n"
14004 "\n"
14005 "layout(location=0) in float x;\n"
14006 "layout(location=0) out vec4 color;\n"
14007 "void main(){\n"
14008 " color = vec4(x);\n"
14009 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014010
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014011 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14012 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014013
14014 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014015 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014016 pipe.AddShader(&vs);
14017 pipe.AddShader(&fs);
14018
Chris Forbes59cb88d2015-05-25 11:13:13 +120014019 VkDescriptorSetObj descriptorSet(m_device);
14020 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014021 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014022
Tony Barbour5781e8f2015-08-04 16:23:11 -060014023 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014024
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014025 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014026}
14027
Karl Schultz6addd812016-02-02 17:17:23 -070014028TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014029 TEST_DESCRIPTION(
14030 "Test that an error is produced for a fragment shader input "
14031 "within an interace block, which is not present in the outputs "
14032 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014034
Tony Barbour1fa09702017-03-16 12:09:08 -060014035 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14037
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014038 char const *vsSource =
14039 "#version 450\n"
14040 "\n"
14041 "out gl_PerVertex {\n"
14042 " vec4 gl_Position;\n"
14043 "};\n"
14044 "void main(){\n"
14045 " gl_Position = vec4(1);\n"
14046 "}\n";
14047 char const *fsSource =
14048 "#version 450\n"
14049 "\n"
14050 "in block { layout(location=0) float x; } ins;\n"
14051 "layout(location=0) out vec4 color;\n"
14052 "void main(){\n"
14053 " color = vec4(ins.x);\n"
14054 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014055
14056 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14057 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14058
14059 VkPipelineObj pipe(m_device);
14060 pipe.AddColorAttachment();
14061 pipe.AddShader(&vs);
14062 pipe.AddShader(&fs);
14063
14064 VkDescriptorSetObj descriptorSet(m_device);
14065 descriptorSet.AppendDummy();
14066 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14067
14068 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14069
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014070 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014071}
14072
Karl Schultz6addd812016-02-02 17:17:23 -070014073TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014074 TEST_DESCRIPTION(
14075 "Test that an error is produced for mismatched array sizes "
14076 "across the vertex->fragment shader interface");
14077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14078 "Type mismatch on location 0.0: 'ptr to "
14079 "output arr[2] of float32' vs 'ptr to "
14080 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014081
Tony Barbour1fa09702017-03-16 12:09:08 -060014082 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14084
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014085 char const *vsSource =
14086 "#version 450\n"
14087 "\n"
14088 "layout(location=0) out float x[2];\n"
14089 "out gl_PerVertex {\n"
14090 " vec4 gl_Position;\n"
14091 "};\n"
14092 "void main(){\n"
14093 " x[0] = 0; x[1] = 0;\n"
14094 " gl_Position = vec4(1);\n"
14095 "}\n";
14096 char const *fsSource =
14097 "#version 450\n"
14098 "\n"
14099 "layout(location=0) in float x[1];\n"
14100 "layout(location=0) out vec4 color;\n"
14101 "void main(){\n"
14102 " color = vec4(x[0]);\n"
14103 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014104
14105 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14106 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14107
14108 VkPipelineObj pipe(m_device);
14109 pipe.AddColorAttachment();
14110 pipe.AddShader(&vs);
14111 pipe.AddShader(&fs);
14112
14113 VkDescriptorSetObj descriptorSet(m_device);
14114 descriptorSet.AppendDummy();
14115 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14116
14117 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14118
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014119 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014120}
14121
Karl Schultz6addd812016-02-02 17:17:23 -070014122TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014123 TEST_DESCRIPTION(
14124 "Test that an error is produced for mismatched types across "
14125 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014127
Tony Barbour1fa09702017-03-16 12:09:08 -060014128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014129 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014130
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014131 char const *vsSource =
14132 "#version 450\n"
14133 "\n"
14134 "layout(location=0) out int x;\n"
14135 "out gl_PerVertex {\n"
14136 " vec4 gl_Position;\n"
14137 "};\n"
14138 "void main(){\n"
14139 " x = 0;\n"
14140 " gl_Position = vec4(1);\n"
14141 "}\n";
14142 char const *fsSource =
14143 "#version 450\n"
14144 "\n"
14145 "layout(location=0) in float x;\n" /* VS writes int */
14146 "layout(location=0) out vec4 color;\n"
14147 "void main(){\n"
14148 " color = vec4(x);\n"
14149 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014150
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014151 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14152 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014153
14154 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014155 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014156 pipe.AddShader(&vs);
14157 pipe.AddShader(&fs);
14158
Chris Forbesb56af562015-05-25 11:13:17 +120014159 VkDescriptorSetObj descriptorSet(m_device);
14160 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014161 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014162
Tony Barbour5781e8f2015-08-04 16:23:11 -060014163 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014164
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014165 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014166}
14167
Karl Schultz6addd812016-02-02 17:17:23 -070014168TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014169 TEST_DESCRIPTION(
14170 "Test that an error is produced for mismatched types across "
14171 "the vertex->fragment shader interface, when the variable is contained within "
14172 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014174
Tony Barbour1fa09702017-03-16 12:09:08 -060014175 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014176 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14177
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014178 char const *vsSource =
14179 "#version 450\n"
14180 "\n"
14181 "out block { layout(location=0) int x; } outs;\n"
14182 "out gl_PerVertex {\n"
14183 " vec4 gl_Position;\n"
14184 "};\n"
14185 "void main(){\n"
14186 " outs.x = 0;\n"
14187 " gl_Position = vec4(1);\n"
14188 "}\n";
14189 char const *fsSource =
14190 "#version 450\n"
14191 "\n"
14192 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14193 "layout(location=0) out vec4 color;\n"
14194 "void main(){\n"
14195 " color = vec4(ins.x);\n"
14196 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014197
14198 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14199 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14200
14201 VkPipelineObj pipe(m_device);
14202 pipe.AddColorAttachment();
14203 pipe.AddShader(&vs);
14204 pipe.AddShader(&fs);
14205
14206 VkDescriptorSetObj descriptorSet(m_device);
14207 descriptorSet.AppendDummy();
14208 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14209
14210 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14211
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014212 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014213}
14214
14215TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014216 TEST_DESCRIPTION(
14217 "Test that an error is produced for location mismatches across "
14218 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14219 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014220 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 +130014221
Tony Barbour1fa09702017-03-16 12:09:08 -060014222 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014223 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14224
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014225 char const *vsSource =
14226 "#version 450\n"
14227 "\n"
14228 "out block { layout(location=1) float x; } outs;\n"
14229 "out gl_PerVertex {\n"
14230 " vec4 gl_Position;\n"
14231 "};\n"
14232 "void main(){\n"
14233 " outs.x = 0;\n"
14234 " gl_Position = vec4(1);\n"
14235 "}\n";
14236 char const *fsSource =
14237 "#version 450\n"
14238 "\n"
14239 "in block { layout(location=0) float x; } ins;\n"
14240 "layout(location=0) out vec4 color;\n"
14241 "void main(){\n"
14242 " color = vec4(ins.x);\n"
14243 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014244
14245 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14246 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14247
14248 VkPipelineObj pipe(m_device);
14249 pipe.AddColorAttachment();
14250 pipe.AddShader(&vs);
14251 pipe.AddShader(&fs);
14252
14253 VkDescriptorSetObj descriptorSet(m_device);
14254 descriptorSet.AppendDummy();
14255 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14256
14257 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14258
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014259 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014260}
14261
14262TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014263 TEST_DESCRIPTION(
14264 "Test that an error is produced for component mismatches across the "
14265 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14266 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014267 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 +130014268
Tony Barbour1fa09702017-03-16 12:09:08 -060014269 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014270 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14271
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014272 char const *vsSource =
14273 "#version 450\n"
14274 "\n"
14275 "out block { layout(location=0, component=0) float x; } outs;\n"
14276 "out gl_PerVertex {\n"
14277 " vec4 gl_Position;\n"
14278 "};\n"
14279 "void main(){\n"
14280 " outs.x = 0;\n"
14281 " gl_Position = vec4(1);\n"
14282 "}\n";
14283 char const *fsSource =
14284 "#version 450\n"
14285 "\n"
14286 "in block { layout(location=0, component=1) float x; } ins;\n"
14287 "layout(location=0) out vec4 color;\n"
14288 "void main(){\n"
14289 " color = vec4(ins.x);\n"
14290 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014291
14292 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14293 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14294
14295 VkPipelineObj pipe(m_device);
14296 pipe.AddColorAttachment();
14297 pipe.AddShader(&vs);
14298 pipe.AddShader(&fs);
14299
14300 VkDescriptorSetObj descriptorSet(m_device);
14301 descriptorSet.AppendDummy();
14302 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14303
14304 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14305
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014306 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014307}
14308
Chris Forbes1f3b0152016-11-30 12:48:40 +130014309TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14310 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14311
Tony Barbour1fa09702017-03-16 12:09:08 -060014312 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014315 char const *vsSource =
14316 "#version 450\n"
14317 "layout(location=0) out mediump float x;\n"
14318 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14319 char const *fsSource =
14320 "#version 450\n"
14321 "layout(location=0) in highp float x;\n"
14322 "layout(location=0) out vec4 color;\n"
14323 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014324
14325 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14326 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14327
14328 VkPipelineObj pipe(m_device);
14329 pipe.AddColorAttachment();
14330 pipe.AddShader(&vs);
14331 pipe.AddShader(&fs);
14332
14333 VkDescriptorSetObj descriptorSet(m_device);
14334 descriptorSet.AppendDummy();
14335 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14336
14337 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14338
14339 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14340
14341 m_errorMonitor->VerifyFound();
14342}
14343
Chris Forbes870a39e2016-11-30 12:55:56 +130014344TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14345 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14346
Tony Barbour1fa09702017-03-16 12:09:08 -060014347 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014348 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14349
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014350 char const *vsSource =
14351 "#version 450\n"
14352 "out block { layout(location=0) mediump float x; };\n"
14353 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14354 char const *fsSource =
14355 "#version 450\n"
14356 "in block { layout(location=0) highp float x; };\n"
14357 "layout(location=0) out vec4 color;\n"
14358 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014359
14360 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14361 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14362
14363 VkPipelineObj pipe(m_device);
14364 pipe.AddColorAttachment();
14365 pipe.AddShader(&vs);
14366 pipe.AddShader(&fs);
14367
14368 VkDescriptorSetObj descriptorSet(m_device);
14369 descriptorSet.AppendDummy();
14370 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14371
14372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14373
14374 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14375
14376 m_errorMonitor->VerifyFound();
14377}
14378
Karl Schultz6addd812016-02-02 17:17:23 -070014379TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014380 TEST_DESCRIPTION(
14381 "Test that a warning is produced for a vertex attribute which is "
14382 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014384
Tony Barbour1fa09702017-03-16 12:09:08 -060014385 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014387
14388 VkVertexInputBindingDescription input_binding;
14389 memset(&input_binding, 0, sizeof(input_binding));
14390
14391 VkVertexInputAttributeDescription input_attrib;
14392 memset(&input_attrib, 0, sizeof(input_attrib));
14393 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14394
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014395 char const *vsSource =
14396 "#version 450\n"
14397 "\n"
14398 "out gl_PerVertex {\n"
14399 " vec4 gl_Position;\n"
14400 "};\n"
14401 "void main(){\n"
14402 " gl_Position = vec4(1);\n"
14403 "}\n";
14404 char const *fsSource =
14405 "#version 450\n"
14406 "\n"
14407 "layout(location=0) out vec4 color;\n"
14408 "void main(){\n"
14409 " color = vec4(1);\n"
14410 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014411
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014412 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14413 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014414
14415 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014416 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014417 pipe.AddShader(&vs);
14418 pipe.AddShader(&fs);
14419
14420 pipe.AddVertexInputBindings(&input_binding, 1);
14421 pipe.AddVertexInputAttribs(&input_attrib, 1);
14422
Chris Forbesde136e02015-05-25 11:13:28 +120014423 VkDescriptorSetObj descriptorSet(m_device);
14424 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014425 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014426
Tony Barbour5781e8f2015-08-04 16:23:11 -060014427 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014428
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014429 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014430}
14431
Karl Schultz6addd812016-02-02 17:17:23 -070014432TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014433 TEST_DESCRIPTION(
14434 "Test that a warning is produced for a location mismatch on "
14435 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014437
Tony Barbour1fa09702017-03-16 12:09:08 -060014438 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14440
14441 VkVertexInputBindingDescription input_binding;
14442 memset(&input_binding, 0, sizeof(input_binding));
14443
14444 VkVertexInputAttributeDescription input_attrib;
14445 memset(&input_attrib, 0, sizeof(input_attrib));
14446 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14447
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014448 char const *vsSource =
14449 "#version 450\n"
14450 "\n"
14451 "layout(location=1) in float x;\n"
14452 "out gl_PerVertex {\n"
14453 " vec4 gl_Position;\n"
14454 "};\n"
14455 "void main(){\n"
14456 " gl_Position = vec4(x);\n"
14457 "}\n";
14458 char const *fsSource =
14459 "#version 450\n"
14460 "\n"
14461 "layout(location=0) out vec4 color;\n"
14462 "void main(){\n"
14463 " color = vec4(1);\n"
14464 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014465
14466 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14467 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14468
14469 VkPipelineObj pipe(m_device);
14470 pipe.AddColorAttachment();
14471 pipe.AddShader(&vs);
14472 pipe.AddShader(&fs);
14473
14474 pipe.AddVertexInputBindings(&input_binding, 1);
14475 pipe.AddVertexInputAttribs(&input_attrib, 1);
14476
14477 VkDescriptorSetObj descriptorSet(m_device);
14478 descriptorSet.AppendDummy();
14479 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14480
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014481 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014482 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14483
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014484 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014485}
14486
Karl Schultz6addd812016-02-02 17:17:23 -070014487TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014488 TEST_DESCRIPTION(
14489 "Test that an error is produced for a vertex shader input which is not "
14490 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14492 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014493
Tony Barbour1fa09702017-03-16 12:09:08 -060014494 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014496
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014497 char const *vsSource =
14498 "#version 450\n"
14499 "\n"
14500 "layout(location=0) in vec4 x;\n" /* not provided */
14501 "out gl_PerVertex {\n"
14502 " vec4 gl_Position;\n"
14503 "};\n"
14504 "void main(){\n"
14505 " gl_Position = x;\n"
14506 "}\n";
14507 char const *fsSource =
14508 "#version 450\n"
14509 "\n"
14510 "layout(location=0) out vec4 color;\n"
14511 "void main(){\n"
14512 " color = vec4(1);\n"
14513 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014514
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014515 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14516 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014517
14518 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014519 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014520 pipe.AddShader(&vs);
14521 pipe.AddShader(&fs);
14522
Chris Forbes62e8e502015-05-25 11:13:29 +120014523 VkDescriptorSetObj descriptorSet(m_device);
14524 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014525 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014526
Tony Barbour5781e8f2015-08-04 16:23:11 -060014527 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014528
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014529 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014530}
14531
Karl Schultz6addd812016-02-02 17:17:23 -070014532TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014533 TEST_DESCRIPTION(
14534 "Test that an error is produced for a mismatch between the "
14535 "fundamental type (float/int/uint) of an attribute and the "
14536 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014537 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 -060014538
Tony Barbour1fa09702017-03-16 12:09:08 -060014539 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014541
14542 VkVertexInputBindingDescription input_binding;
14543 memset(&input_binding, 0, sizeof(input_binding));
14544
14545 VkVertexInputAttributeDescription input_attrib;
14546 memset(&input_attrib, 0, sizeof(input_attrib));
14547 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14548
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014549 char const *vsSource =
14550 "#version 450\n"
14551 "\n"
14552 "layout(location=0) in int x;\n" /* attrib provided float */
14553 "out gl_PerVertex {\n"
14554 " vec4 gl_Position;\n"
14555 "};\n"
14556 "void main(){\n"
14557 " gl_Position = vec4(x);\n"
14558 "}\n";
14559 char const *fsSource =
14560 "#version 450\n"
14561 "\n"
14562 "layout(location=0) out vec4 color;\n"
14563 "void main(){\n"
14564 " color = vec4(1);\n"
14565 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014566
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014567 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14568 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014569
14570 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014571 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014572 pipe.AddShader(&vs);
14573 pipe.AddShader(&fs);
14574
14575 pipe.AddVertexInputBindings(&input_binding, 1);
14576 pipe.AddVertexInputAttribs(&input_attrib, 1);
14577
Chris Forbesc97d98e2015-05-25 11:13:31 +120014578 VkDescriptorSetObj descriptorSet(m_device);
14579 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014580 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014581
Tony Barbour5781e8f2015-08-04 16:23:11 -060014582 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014583
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014584 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014585}
14586
Chris Forbesc68b43c2016-04-06 11:18:47 +120014587TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014588 TEST_DESCRIPTION(
14589 "Test that an error is produced for a pipeline containing multiple "
14590 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14592 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014593
Tony Barbour1fa09702017-03-16 12:09:08 -060014594 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014595 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14596
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014597 char const *vsSource =
14598 "#version 450\n"
14599 "\n"
14600 "out gl_PerVertex {\n"
14601 " vec4 gl_Position;\n"
14602 "};\n"
14603 "void main(){\n"
14604 " gl_Position = vec4(1);\n"
14605 "}\n";
14606 char const *fsSource =
14607 "#version 450\n"
14608 "\n"
14609 "layout(location=0) out vec4 color;\n"
14610 "void main(){\n"
14611 " color = vec4(1);\n"
14612 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014613
14614 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14615 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14616
14617 VkPipelineObj pipe(m_device);
14618 pipe.AddColorAttachment();
14619 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014620 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014621 pipe.AddShader(&fs);
14622
14623 VkDescriptorSetObj descriptorSet(m_device);
14624 descriptorSet.AppendDummy();
14625 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14626
14627 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14628
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014629 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014630}
14631
Chris Forbes82ff92a2016-09-09 10:50:24 +120014632TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014634
Tony Barbour1fa09702017-03-16 12:09:08 -060014635 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014636 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14637
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014638 char const *vsSource =
14639 "#version 450\n"
14640 "out gl_PerVertex {\n"
14641 " vec4 gl_Position;\n"
14642 "};\n"
14643 "void main(){\n"
14644 " gl_Position = vec4(0);\n"
14645 "}\n";
14646 char const *fsSource =
14647 "#version 450\n"
14648 "\n"
14649 "layout(location=0) out vec4 color;\n"
14650 "void main(){\n"
14651 " color = vec4(1);\n"
14652 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014653
14654 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14655 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14656
14657 VkPipelineObj pipe(m_device);
14658 pipe.AddColorAttachment();
14659 pipe.AddShader(&vs);
14660 pipe.AddShader(&fs);
14661
14662 VkDescriptorSetObj descriptorSet(m_device);
14663 descriptorSet.AppendDummy();
14664 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14665
14666 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14667
14668 m_errorMonitor->VerifyFound();
14669}
14670
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014671TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14673 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14674 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014675
Tony Barbour1fa09702017-03-16 12:09:08 -060014676 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014677 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14678
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014679 char const *vsSource =
14680 "#version 450\n"
14681 "void main(){ gl_Position = vec4(0); }\n";
14682 char const *fsSource =
14683 "#version 450\n"
14684 "\n"
14685 "layout(location=0) out vec4 color;\n"
14686 "void main(){\n"
14687 " color = vec4(1);\n"
14688 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014689
14690 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14691 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14692
14693 VkPipelineObj pipe(m_device);
14694 pipe.AddColorAttachment();
14695 pipe.AddShader(&vs);
14696 pipe.AddShader(&fs);
14697
14698 VkDescriptorSetObj descriptorSet(m_device);
14699 descriptorSet.AppendDummy();
14700 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14701
14702 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014703 {
14704 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14705 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14706 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014707 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014708 {
14709 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14710 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14711 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014712 },
14713 };
14714 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014715 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014716 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014717 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14718 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014719 VkRenderPass rp;
14720 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14721 ASSERT_VK_SUCCESS(err);
14722
14723 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14724
14725 m_errorMonitor->VerifyFound();
14726
14727 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14728}
14729
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014730TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014731 TEST_DESCRIPTION(
14732 "Test that an error is produced for a variable output from "
14733 "the TCS without the patch decoration, but consumed in the TES "
14734 "with the decoration.");
14735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14736 "is per-vertex in tessellation control shader stage "
14737 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014738
Tony Barbour1fa09702017-03-16 12:09:08 -060014739 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014740 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14741
Chris Forbesc1e852d2016-04-04 19:26:42 +120014742 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014743 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014744 return;
14745 }
14746
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014747 char const *vsSource =
14748 "#version 450\n"
14749 "void main(){}\n";
14750 char const *tcsSource =
14751 "#version 450\n"
14752 "layout(location=0) out int x[];\n"
14753 "layout(vertices=3) out;\n"
14754 "void main(){\n"
14755 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14756 " gl_TessLevelInner[0] = 1;\n"
14757 " x[gl_InvocationID] = gl_InvocationID;\n"
14758 "}\n";
14759 char const *tesSource =
14760 "#version 450\n"
14761 "layout(triangles, equal_spacing, cw) in;\n"
14762 "layout(location=0) patch in int x;\n"
14763 "out gl_PerVertex { vec4 gl_Position; };\n"
14764 "void main(){\n"
14765 " gl_Position.xyz = gl_TessCoord;\n"
14766 " gl_Position.w = x;\n"
14767 "}\n";
14768 char const *fsSource =
14769 "#version 450\n"
14770 "layout(location=0) out vec4 color;\n"
14771 "void main(){\n"
14772 " color = vec4(1);\n"
14773 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014774
14775 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14776 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14777 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14778 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14779
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014780 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14781 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014782
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014783 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014784
14785 VkPipelineObj pipe(m_device);
14786 pipe.SetInputAssembly(&iasci);
14787 pipe.SetTessellation(&tsci);
14788 pipe.AddColorAttachment();
14789 pipe.AddShader(&vs);
14790 pipe.AddShader(&tcs);
14791 pipe.AddShader(&tes);
14792 pipe.AddShader(&fs);
14793
14794 VkDescriptorSetObj descriptorSet(m_device);
14795 descriptorSet.AppendDummy();
14796 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14797
14798 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14799
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014800 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014801}
14802
Karl Schultz6addd812016-02-02 17:17:23 -070014803TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014804 TEST_DESCRIPTION(
14805 "Test that an error is produced for a vertex attribute setup where multiple "
14806 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014807 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14808 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014809
Tony Barbour1fa09702017-03-16 12:09:08 -060014810 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014811 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014812
14813 /* Two binding descriptions for binding 0 */
14814 VkVertexInputBindingDescription input_bindings[2];
14815 memset(input_bindings, 0, sizeof(input_bindings));
14816
14817 VkVertexInputAttributeDescription input_attrib;
14818 memset(&input_attrib, 0, sizeof(input_attrib));
14819 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14820
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014821 char const *vsSource =
14822 "#version 450\n"
14823 "\n"
14824 "layout(location=0) in float x;\n" /* attrib provided float */
14825 "out gl_PerVertex {\n"
14826 " vec4 gl_Position;\n"
14827 "};\n"
14828 "void main(){\n"
14829 " gl_Position = vec4(x);\n"
14830 "}\n";
14831 char const *fsSource =
14832 "#version 450\n"
14833 "\n"
14834 "layout(location=0) out vec4 color;\n"
14835 "void main(){\n"
14836 " color = vec4(1);\n"
14837 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014838
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014839 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14840 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014841
14842 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014843 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014844 pipe.AddShader(&vs);
14845 pipe.AddShader(&fs);
14846
14847 pipe.AddVertexInputBindings(input_bindings, 2);
14848 pipe.AddVertexInputAttribs(&input_attrib, 1);
14849
Chris Forbes280ba2c2015-06-12 11:16:41 +120014850 VkDescriptorSetObj descriptorSet(m_device);
14851 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014852 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014853
Tony Barbour5781e8f2015-08-04 16:23:11 -060014854 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014855
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014856 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014857}
Chris Forbes8f68b562015-05-25 11:13:32 +120014858
Karl Schultz6addd812016-02-02 17:17:23 -070014859TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014860 TEST_DESCRIPTION(
14861 "Test that an error is produced for a fragment shader which does not "
14862 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014864
Tony Barbour1fa09702017-03-16 12:09:08 -060014865 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014867 char const *vsSource =
14868 "#version 450\n"
14869 "\n"
14870 "out gl_PerVertex {\n"
14871 " vec4 gl_Position;\n"
14872 "};\n"
14873 "void main(){\n"
14874 " gl_Position = vec4(1);\n"
14875 "}\n";
14876 char const *fsSource =
14877 "#version 450\n"
14878 "\n"
14879 "void main(){\n"
14880 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014881
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014882 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14883 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014884
14885 VkPipelineObj pipe(m_device);
14886 pipe.AddShader(&vs);
14887 pipe.AddShader(&fs);
14888
Chia-I Wu08accc62015-07-07 11:50:03 +080014889 /* set up CB 0, not written */
14890 pipe.AddColorAttachment();
14891 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014892
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014893 VkDescriptorSetObj descriptorSet(m_device);
14894 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014895 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014896
Tony Barbour5781e8f2015-08-04 16:23:11 -060014897 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014898
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014899 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014900}
14901
Karl Schultz6addd812016-02-02 17:17:23 -070014902TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014903 TEST_DESCRIPTION(
14904 "Test that a warning is produced for a fragment shader which provides a spurious "
14905 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014907 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014908
Tony Barbour1fa09702017-03-16 12:09:08 -060014909 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014910
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014911 char const *vsSource =
14912 "#version 450\n"
14913 "\n"
14914 "out gl_PerVertex {\n"
14915 " vec4 gl_Position;\n"
14916 "};\n"
14917 "void main(){\n"
14918 " gl_Position = vec4(1);\n"
14919 "}\n";
14920 char const *fsSource =
14921 "#version 450\n"
14922 "\n"
14923 "layout(location=0) out vec4 x;\n"
14924 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14925 "void main(){\n"
14926 " x = vec4(1);\n"
14927 " y = vec4(1);\n"
14928 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014929
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014930 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14931 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014932
14933 VkPipelineObj pipe(m_device);
14934 pipe.AddShader(&vs);
14935 pipe.AddShader(&fs);
14936
Chia-I Wu08accc62015-07-07 11:50:03 +080014937 /* set up CB 0, not written */
14938 pipe.AddColorAttachment();
14939 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014940 /* FS writes CB 1, but we don't configure it */
14941
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014942 VkDescriptorSetObj descriptorSet(m_device);
14943 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014944 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014945
Tony Barbour5781e8f2015-08-04 16:23:11 -060014946 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014947
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014948 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014949}
14950
Karl Schultz6addd812016-02-02 17:17:23 -070014951TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014952 TEST_DESCRIPTION(
14953 "Test that an error is produced for a mismatch between the fundamental "
14954 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014956
Tony Barbour1fa09702017-03-16 12:09:08 -060014957 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014958
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014959 char const *vsSource =
14960 "#version 450\n"
14961 "\n"
14962 "out gl_PerVertex {\n"
14963 " vec4 gl_Position;\n"
14964 "};\n"
14965 "void main(){\n"
14966 " gl_Position = vec4(1);\n"
14967 "}\n";
14968 char const *fsSource =
14969 "#version 450\n"
14970 "\n"
14971 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14972 "void main(){\n"
14973 " x = ivec4(1);\n"
14974 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014975
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014976 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14977 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014978
14979 VkPipelineObj pipe(m_device);
14980 pipe.AddShader(&vs);
14981 pipe.AddShader(&fs);
14982
Chia-I Wu08accc62015-07-07 11:50:03 +080014983 /* set up CB 0; type is UNORM by default */
14984 pipe.AddColorAttachment();
14985 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014986
Chris Forbesa36d69e2015-05-25 11:13:44 +120014987 VkDescriptorSetObj descriptorSet(m_device);
14988 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014989 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014990
Tony Barbour5781e8f2015-08-04 16:23:11 -060014991 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014992
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014993 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014994}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014995
Karl Schultz6addd812016-02-02 17:17:23 -070014996TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014997 TEST_DESCRIPTION(
14998 "Test that an error is produced for a shader consuming a uniform "
14999 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015001
Tony Barbour1fa09702017-03-16 12:09:08 -060015002 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015003
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015004 char const *vsSource =
15005 "#version 450\n"
15006 "\n"
15007 "out gl_PerVertex {\n"
15008 " vec4 gl_Position;\n"
15009 "};\n"
15010 "void main(){\n"
15011 " gl_Position = vec4(1);\n"
15012 "}\n";
15013 char const *fsSource =
15014 "#version 450\n"
15015 "\n"
15016 "layout(location=0) out vec4 x;\n"
15017 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15018 "void main(){\n"
15019 " x = vec4(bar.y);\n"
15020 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015021
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015022 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15023 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015024
Chris Forbes556c76c2015-08-14 12:04:59 +120015025 VkPipelineObj pipe(m_device);
15026 pipe.AddShader(&vs);
15027 pipe.AddShader(&fs);
15028
15029 /* set up CB 0; type is UNORM by default */
15030 pipe.AddColorAttachment();
15031 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15032
15033 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015034 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015035
15036 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15037
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015038 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015039}
15040
Chris Forbes5c59e902016-02-26 16:56:09 +130015041TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015042 TEST_DESCRIPTION(
15043 "Test that an error is produced for a shader consuming push constants "
15044 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015046
Tony Barbour1fa09702017-03-16 12:09:08 -060015047 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015048
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015049 char const *vsSource =
15050 "#version 450\n"
15051 "\n"
15052 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15053 "out gl_PerVertex {\n"
15054 " vec4 gl_Position;\n"
15055 "};\n"
15056 "void main(){\n"
15057 " gl_Position = vec4(consts.x);\n"
15058 "}\n";
15059 char const *fsSource =
15060 "#version 450\n"
15061 "\n"
15062 "layout(location=0) out vec4 x;\n"
15063 "void main(){\n"
15064 " x = vec4(1);\n"
15065 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015066
15067 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15068 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15069
15070 VkPipelineObj pipe(m_device);
15071 pipe.AddShader(&vs);
15072 pipe.AddShader(&fs);
15073
15074 /* set up CB 0; type is UNORM by default */
15075 pipe.AddColorAttachment();
15076 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15077
15078 VkDescriptorSetObj descriptorSet(m_device);
15079 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15080
15081 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15082
15083 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015084 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015085}
15086
Chris Forbes3fb17902016-08-22 14:57:55 +120015087TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015088 TEST_DESCRIPTION(
15089 "Test that an error is produced for a shader consuming an input attachment "
15090 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15092 "consumes input attachment index 0 but not provided in subpass");
15093
Tony Barbour1fa09702017-03-16 12:09:08 -060015094 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015095
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015096 char const *vsSource =
15097 "#version 450\n"
15098 "\n"
15099 "out gl_PerVertex {\n"
15100 " vec4 gl_Position;\n"
15101 "};\n"
15102 "void main(){\n"
15103 " gl_Position = vec4(1);\n"
15104 "}\n";
15105 char const *fsSource =
15106 "#version 450\n"
15107 "\n"
15108 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15109 "layout(location=0) out vec4 color;\n"
15110 "void main() {\n"
15111 " color = subpassLoad(x);\n"
15112 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015113
15114 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15115 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15116
15117 VkPipelineObj pipe(m_device);
15118 pipe.AddShader(&vs);
15119 pipe.AddShader(&fs);
15120 pipe.AddColorAttachment();
15121 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15122
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015123 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15124 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015125 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015126 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015127 ASSERT_VK_SUCCESS(err);
15128
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015129 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015130 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015131 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015132 ASSERT_VK_SUCCESS(err);
15133
15134 // error here.
15135 pipe.CreateVKPipeline(pl, renderPass());
15136
15137 m_errorMonitor->VerifyFound();
15138
15139 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15140 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15141}
15142
Chris Forbes5a9a0472016-08-22 16:02:09 +120015143TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015144 TEST_DESCRIPTION(
15145 "Test that an error is produced for a shader consuming an input attachment "
15146 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015147 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15148 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15149
Tony Barbour1fa09702017-03-16 12:09:08 -060015150 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015151
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015152 char const *vsSource =
15153 "#version 450\n"
15154 "\n"
15155 "out gl_PerVertex {\n"
15156 " vec4 gl_Position;\n"
15157 "};\n"
15158 "void main(){\n"
15159 " gl_Position = vec4(1);\n"
15160 "}\n";
15161 char const *fsSource =
15162 "#version 450\n"
15163 "\n"
15164 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15165 "layout(location=0) out vec4 color;\n"
15166 "void main() {\n"
15167 " color = subpassLoad(x);\n"
15168 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015169
15170 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15171 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15172
15173 VkPipelineObj pipe(m_device);
15174 pipe.AddShader(&vs);
15175 pipe.AddShader(&fs);
15176 pipe.AddColorAttachment();
15177 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15178
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015179 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15180 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015181 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015182 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015183 ASSERT_VK_SUCCESS(err);
15184
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015185 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015186 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015187 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015188 ASSERT_VK_SUCCESS(err);
15189
15190 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015191 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15192 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15193 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15194 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15195 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 +120015196 };
15197 VkAttachmentReference color = {
15198 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15199 };
15200 VkAttachmentReference input = {
15201 1, VK_IMAGE_LAYOUT_GENERAL,
15202 };
15203
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015204 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015205
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015206 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015207 VkRenderPass rp;
15208 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15209 ASSERT_VK_SUCCESS(err);
15210
15211 // error here.
15212 pipe.CreateVKPipeline(pl, rp);
15213
15214 m_errorMonitor->VerifyFound();
15215
15216 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15217 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15218 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15219}
15220
Chris Forbes541f7b02016-08-22 15:30:27 +120015221TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015222 TEST_DESCRIPTION(
15223 "Test that an error is produced for a shader consuming an input attachment "
15224 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015226 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015227
Tony Barbour1fa09702017-03-16 12:09:08 -060015228 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015229
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015230 char const *vsSource =
15231 "#version 450\n"
15232 "\n"
15233 "out gl_PerVertex {\n"
15234 " vec4 gl_Position;\n"
15235 "};\n"
15236 "void main(){\n"
15237 " gl_Position = vec4(1);\n"
15238 "}\n";
15239 char const *fsSource =
15240 "#version 450\n"
15241 "\n"
15242 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15243 "layout(location=0) out vec4 color;\n"
15244 "void main() {\n"
15245 " color = subpassLoad(xs[0]);\n"
15246 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015247
15248 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15249 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15250
15251 VkPipelineObj pipe(m_device);
15252 pipe.AddShader(&vs);
15253 pipe.AddShader(&fs);
15254 pipe.AddColorAttachment();
15255 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15256
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015257 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15258 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015259 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015260 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015261 ASSERT_VK_SUCCESS(err);
15262
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015263 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015264 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015265 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015266 ASSERT_VK_SUCCESS(err);
15267
15268 // error here.
15269 pipe.CreateVKPipeline(pl, renderPass());
15270
15271 m_errorMonitor->VerifyFound();
15272
15273 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15274 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15275}
15276
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015277TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015278 TEST_DESCRIPTION(
15279 "Test that an error is produced for a compute pipeline consuming a "
15280 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015282
Tony Barbour1fa09702017-03-16 12:09:08 -060015283 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015284
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015285 char const *csSource =
15286 "#version 450\n"
15287 "\n"
15288 "layout(local_size_x=1) in;\n"
15289 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15290 "void main(){\n"
15291 " x = vec4(1);\n"
15292 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015293
15294 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15295
15296 VkDescriptorSetObj descriptorSet(m_device);
15297 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15298
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015299 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15300 nullptr,
15301 0,
15302 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15303 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15304 descriptorSet.GetPipelineLayout(),
15305 VK_NULL_HANDLE,
15306 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015307
15308 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015309 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015310
15311 m_errorMonitor->VerifyFound();
15312
15313 if (err == VK_SUCCESS) {
15314 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15315 }
15316}
15317
Chris Forbes22a9b092016-07-19 14:34:05 +120015318TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015319 TEST_DESCRIPTION(
15320 "Test that an error is produced for a pipeline consuming a "
15321 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15323 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015324
Tony Barbour1fa09702017-03-16 12:09:08 -060015325 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015326
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015327 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15328 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015329 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015330 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015331 ASSERT_VK_SUCCESS(err);
15332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015333 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015334 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015335 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015336 ASSERT_VK_SUCCESS(err);
15337
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015338 char const *csSource =
15339 "#version 450\n"
15340 "\n"
15341 "layout(local_size_x=1) in;\n"
15342 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15343 "void main() {\n"
15344 " x.x = 1.0f;\n"
15345 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015346 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15347
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015348 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15349 nullptr,
15350 0,
15351 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15352 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15353 pl,
15354 VK_NULL_HANDLE,
15355 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015356
15357 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015358 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015359
15360 m_errorMonitor->VerifyFound();
15361
15362 if (err == VK_SUCCESS) {
15363 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15364 }
15365
15366 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15367 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15368}
15369
Chris Forbes50020592016-07-27 13:52:41 +120015370TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015371 TEST_DESCRIPTION(
15372 "Test that an error is produced when an image view type "
15373 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015374
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015375 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 +120015376
Tony Barbour1fa09702017-03-16 12:09:08 -060015377 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15379
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015380 char const *vsSource =
15381 "#version 450\n"
15382 "\n"
15383 "out gl_PerVertex { vec4 gl_Position; };\n"
15384 "void main() { gl_Position = vec4(0); }\n";
15385 char const *fsSource =
15386 "#version 450\n"
15387 "\n"
15388 "layout(set=0, binding=0) uniform sampler3D s;\n"
15389 "layout(location=0) out vec4 color;\n"
15390 "void main() {\n"
15391 " color = texture(s, vec3(0));\n"
15392 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015393 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15394 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15395
15396 VkPipelineObj pipe(m_device);
15397 pipe.AddShader(&vs);
15398 pipe.AddShader(&fs);
15399 pipe.AddColorAttachment();
15400
15401 VkTextureObj texture(m_device, nullptr);
15402 VkSamplerObj sampler(m_device);
15403
15404 VkDescriptorSetObj descriptorSet(m_device);
15405 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15406 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15407
15408 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15409 ASSERT_VK_SUCCESS(err);
15410
Tony Barbour552f6c02016-12-21 14:34:07 -070015411 m_commandBuffer->BeginCommandBuffer();
15412 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015413
15414 m_commandBuffer->BindPipeline(pipe);
15415 m_commandBuffer->BindDescriptorSet(descriptorSet);
15416
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015417 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015418 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015419 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015420 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15421
15422 // error produced here.
15423 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15424
15425 m_errorMonitor->VerifyFound();
15426
Tony Barbour552f6c02016-12-21 14:34:07 -070015427 m_commandBuffer->EndRenderPass();
15428 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015429}
15430
Chris Forbes5533bfc2016-07-27 14:12:34 +120015431TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015432 TEST_DESCRIPTION(
15433 "Test that an error is produced when a multisampled images "
15434 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015435
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015437
Tony Barbour1fa09702017-03-16 12:09:08 -060015438 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15440
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015441 char const *vsSource =
15442 "#version 450\n"
15443 "\n"
15444 "out gl_PerVertex { vec4 gl_Position; };\n"
15445 "void main() { gl_Position = vec4(0); }\n";
15446 char const *fsSource =
15447 "#version 450\n"
15448 "\n"
15449 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15450 "layout(location=0) out vec4 color;\n"
15451 "void main() {\n"
15452 " color = texelFetch(s, ivec2(0), 0);\n"
15453 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015454 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15455 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15456
15457 VkPipelineObj pipe(m_device);
15458 pipe.AddShader(&vs);
15459 pipe.AddShader(&fs);
15460 pipe.AddColorAttachment();
15461
15462 VkTextureObj texture(m_device, nullptr);
15463 VkSamplerObj sampler(m_device);
15464
15465 VkDescriptorSetObj descriptorSet(m_device);
15466 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15467 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15468
15469 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15470 ASSERT_VK_SUCCESS(err);
15471
Tony Barbour552f6c02016-12-21 14:34:07 -070015472 m_commandBuffer->BeginCommandBuffer();
15473 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015474
15475 m_commandBuffer->BindPipeline(pipe);
15476 m_commandBuffer->BindDescriptorSet(descriptorSet);
15477
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015478 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015479 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015480 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015481 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15482
15483 // error produced here.
15484 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15485
15486 m_errorMonitor->VerifyFound();
15487
Tony Barbour552f6c02016-12-21 14:34:07 -070015488 m_commandBuffer->EndRenderPass();
15489 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015490}
15491
Mark Youngc48c4c12016-04-11 14:26:49 -060015492TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015493 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015494
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015495 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15496 {
15497 VkFormatProperties properties;
15498 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15499 if (properties.optimalTilingFeatures == 0) {
15500 printf(" Image format not supported; skipped.\n");
15501 return;
15502 }
15503 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015504
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015505 VkImageCreateInfo info = {};
15506 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15507 info.pNext = NULL;
15508 info.imageType = VK_IMAGE_TYPE_2D;
15509 info.format = format;
15510 info.extent.height = 32;
15511 info.extent.depth = 1;
15512 info.mipLevels = 1;
15513 info.arrayLayers = 1;
15514 info.samples = VK_SAMPLE_COUNT_1_BIT;
15515 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15516 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15517 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015518
15519 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015520 {
15521 VkImageFormatProperties properties;
15522 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15523 info.tiling, info.usage, info.flags, &properties);
15524 ASSERT_VK_SUCCESS(result);
15525 info.extent.width = properties.maxExtent.width + 1;
15526 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015527
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015528 VkImage image;
15529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15530 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015531 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015532}
15533
Mark Youngc48c4c12016-04-11 14:26:49 -060015534TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015535 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015536
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015537 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15538 {
15539 VkFormatProperties properties;
15540 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15541 if (properties.optimalTilingFeatures == 0) {
15542 printf(" Image format not supported; skipped.\n");
15543 return;
15544 }
15545 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015546
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015547 VkImageCreateInfo info = {};
15548 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15549 info.pNext = NULL;
15550 info.imageType = VK_IMAGE_TYPE_2D;
15551 info.format = format;
15552 info.extent.height = 32;
15553 info.extent.depth = 1;
15554 info.mipLevels = 1;
15555 info.arrayLayers = 1;
15556 info.samples = VK_SAMPLE_COUNT_1_BIT;
15557 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15558 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15559 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015560
15561 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015562 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015563
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015564 VkImage image;
15565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15566 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15567 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015568 m_errorMonitor->VerifyFound();
15569}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015570
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015571TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015572 TEST_DESCRIPTION(
15573 "Create a render pass with an attachment description "
15574 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015575
Tony Barbour1fa09702017-03-16 12:09:08 -060015576 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15578
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015580
15581 VkAttachmentReference color_attach = {};
15582 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15583 color_attach.attachment = 0;
15584 VkSubpassDescription subpass = {};
15585 subpass.colorAttachmentCount = 1;
15586 subpass.pColorAttachments = &color_attach;
15587
15588 VkRenderPassCreateInfo rpci = {};
15589 rpci.subpassCount = 1;
15590 rpci.pSubpasses = &subpass;
15591 rpci.attachmentCount = 1;
15592 VkAttachmentDescription attach_desc = {};
15593 attach_desc.format = VK_FORMAT_UNDEFINED;
15594 rpci.pAttachments = &attach_desc;
15595 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15596 VkRenderPass rp;
15597 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15598
15599 m_errorMonitor->VerifyFound();
15600
15601 if (result == VK_SUCCESS) {
15602 vkDestroyRenderPass(m_device->device(), rp, NULL);
15603 }
15604}
15605
Karl Schultz6addd812016-02-02 17:17:23 -070015606TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015607 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015608
Mike Stroyana3082432015-09-25 13:39:21 -060015609 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015610 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15611 const int32_t tex_width = 32;
15612 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015613
15614 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015615 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15616 image_create_info.pNext = NULL;
15617 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15618 image_create_info.format = tex_format;
15619 image_create_info.extent.width = tex_width;
15620 image_create_info.extent.height = tex_height;
15621 image_create_info.extent.depth = 1;
15622 image_create_info.mipLevels = 1;
15623 image_create_info.arrayLayers = 1;
15624 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15625 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15626 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15627 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015628
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015629 VkImage image;
15630 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015631 ASSERT_VK_SUCCESS(err);
15632
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015633 VkMemoryRequirements requirements;
15634 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15635
15636 VkMemoryAllocateInfo alloc_info{};
15637 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15638 alloc_info.pNext = NULL;
15639 alloc_info.memoryTypeIndex = 0;
15640 alloc_info.allocationSize = requirements.size;
15641 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15642 ASSERT_TRUE(pass);
15643
15644 VkDeviceMemory memory;
15645 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15646 ASSERT_VK_SUCCESS(err);
15647
15648 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15649
Tobin Ehliscde08892015-09-22 10:11:37 -060015650 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015651 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015652 image_view_create_info.image = image;
15653 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15654 image_view_create_info.format = tex_format;
15655 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015656 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015657 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015658 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015659
15660 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015662 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015663 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015664
15665 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015666 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015667}
Mike Stroyana3082432015-09-25 13:39:21 -060015668
Mark Youngd339ba32016-05-30 13:28:35 -060015669TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15670 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015672 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015673
Tony Barbour1fa09702017-03-16 12:09:08 -060015674 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015675
15676 // Create an image and try to create a view with no memory backing the image
15677 VkImage image;
15678
15679 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15680 const int32_t tex_width = 32;
15681 const int32_t tex_height = 32;
15682
15683 VkImageCreateInfo image_create_info = {};
15684 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15685 image_create_info.pNext = NULL;
15686 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15687 image_create_info.format = tex_format;
15688 image_create_info.extent.width = tex_width;
15689 image_create_info.extent.height = tex_height;
15690 image_create_info.extent.depth = 1;
15691 image_create_info.mipLevels = 1;
15692 image_create_info.arrayLayers = 1;
15693 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15694 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15695 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15696 image_create_info.flags = 0;
15697
15698 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15699 ASSERT_VK_SUCCESS(err);
15700
15701 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015702 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015703 image_view_create_info.image = image;
15704 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15705 image_view_create_info.format = tex_format;
15706 image_view_create_info.subresourceRange.layerCount = 1;
15707 image_view_create_info.subresourceRange.baseMipLevel = 0;
15708 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015709 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015710
15711 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015712 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015713
15714 m_errorMonitor->VerifyFound();
15715 vkDestroyImage(m_device->device(), image, NULL);
15716 // If last error is success, it still created the view, so delete it.
15717 if (err == VK_SUCCESS) {
15718 vkDestroyImageView(m_device->device(), view, NULL);
15719 }
Mark Youngd339ba32016-05-30 13:28:35 -060015720}
15721
Karl Schultz6addd812016-02-02 17:17:23 -070015722TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015723 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015725
Tony Barbour1fa09702017-03-16 12:09:08 -060015726 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015727
Karl Schultz6addd812016-02-02 17:17:23 -070015728 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015729 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015730 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015731 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015732
15733 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015734 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015735 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015736 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15737 image_view_create_info.format = tex_format;
15738 image_view_create_info.subresourceRange.baseMipLevel = 0;
15739 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015740 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015741 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015742 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015743
15744 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015745 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015746
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015747 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015748}
15749
Mike Weiblena1e13f42017-02-09 21:25:59 -070015750TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15751 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15752
Tony Barbour1fa09702017-03-16 12:09:08 -060015753 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015754 VkSubresourceLayout subres_layout = {};
15755
15756 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15757 {
15758 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15759 VkImageObj img(m_device);
15760 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15761 ASSERT_TRUE(img.initialized());
15762
15763 VkImageSubresource subres = {};
15764 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15765 subres.mipLevel = 0;
15766 subres.arrayLayer = 0;
15767
15768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15769 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15770 m_errorMonitor->VerifyFound();
15771 }
15772
15773 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15774 {
15775 VkImageObj img(m_device);
15776 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15777 ASSERT_TRUE(img.initialized());
15778
15779 VkImageSubresource subres = {};
15780 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15781 subres.mipLevel = 0;
15782 subres.arrayLayer = 0;
15783
15784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15785 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15786 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15787 m_errorMonitor->VerifyFound();
15788 }
15789
15790 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15791 {
15792 VkImageObj img(m_device);
15793 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15794 ASSERT_TRUE(img.initialized());
15795
15796 VkImageSubresource subres = {};
15797 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15798 subres.mipLevel = 1; // ERROR: triggers VU 00739
15799 subres.arrayLayer = 0;
15800
15801 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15802 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15803 m_errorMonitor->VerifyFound();
15804 }
15805
15806 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15807 {
15808 VkImageObj img(m_device);
15809 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15810 ASSERT_TRUE(img.initialized());
15811
15812 VkImageSubresource subres = {};
15813 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15814 subres.mipLevel = 0;
15815 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15816
15817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15818 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15819 m_errorMonitor->VerifyFound();
15820 }
15821}
15822
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015823TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015824 VkResult err;
15825 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015826
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015828
Tony Barbour1fa09702017-03-16 12:09:08 -060015829 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015830
15831 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015832 VkImage srcImage;
15833 VkImage dstImage;
15834 VkDeviceMemory srcMem;
15835 VkDeviceMemory destMem;
15836 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015837
15838 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015839 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15840 image_create_info.pNext = NULL;
15841 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15842 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15843 image_create_info.extent.width = 32;
15844 image_create_info.extent.height = 32;
15845 image_create_info.extent.depth = 1;
15846 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015847 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015848 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15849 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15850 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15851 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015852
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015853 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015854 ASSERT_VK_SUCCESS(err);
15855
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015856 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015857 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015858 ASSERT_VK_SUCCESS(err);
15859
15860 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015861 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015862 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15863 memAlloc.pNext = NULL;
15864 memAlloc.allocationSize = 0;
15865 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015866
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015867 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015868 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015869 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015870 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015871 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015872 ASSERT_VK_SUCCESS(err);
15873
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015874 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015875 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015876 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015877 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015878 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015879 ASSERT_VK_SUCCESS(err);
15880
15881 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15882 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015883 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015884 ASSERT_VK_SUCCESS(err);
15885
Tony Barbour552f6c02016-12-21 14:34:07 -070015886 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015887 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015888 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015889 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015890 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015891 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015892 copyRegion.srcOffset.x = 0;
15893 copyRegion.srcOffset.y = 0;
15894 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015895 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015896 copyRegion.dstSubresource.mipLevel = 0;
15897 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015898 // Introduce failure by forcing the dst layerCount to differ from src
15899 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015900 copyRegion.dstOffset.x = 0;
15901 copyRegion.dstOffset.y = 0;
15902 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015903 copyRegion.extent.width = 1;
15904 copyRegion.extent.height = 1;
15905 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015906 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015907 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015908
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015909 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015910
Chia-I Wuf7458c52015-10-26 21:10:41 +080015911 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015912 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015913 vkFreeMemory(m_device->device(), srcMem, NULL);
15914 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015915}
15916
Tony Barbourd6673642016-05-05 14:46:39 -060015917TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015918 TEST_DESCRIPTION("Creating images with unsuported formats ");
15919
Tony Barbour1fa09702017-03-16 12:09:08 -060015920 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015921 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015922
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015923 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015924 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015925 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015926 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15927 image_create_info.format = VK_FORMAT_UNDEFINED;
15928 image_create_info.extent.width = 32;
15929 image_create_info.extent.height = 32;
15930 image_create_info.extent.depth = 1;
15931 image_create_info.mipLevels = 1;
15932 image_create_info.arrayLayers = 1;
15933 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15934 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15935 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015936
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15938 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015939
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015940 VkImage image;
15941 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015942 m_errorMonitor->VerifyFound();
15943
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015944 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015945 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015946 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15947 VkFormat format = static_cast<VkFormat>(f);
15948 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015949 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015950 unsupported = format;
15951 break;
15952 }
15953 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015954
Tony Barbourd6673642016-05-05 14:46:39 -060015955 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015956 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015958
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015959 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015960 m_errorMonitor->VerifyFound();
15961 }
15962}
15963
15964TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015965 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15966
Tony Barbour1fa09702017-03-16 12:09:08 -060015967 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070015968 auto depth_format = find_depth_stencil_format(m_device);
15969 if (!depth_format) {
15970 return;
15971 }
Tony Barbourd6673642016-05-05 14:46:39 -060015972
15973 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015974 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 -060015975 VK_IMAGE_TILING_OPTIMAL, 0);
15976 ASSERT_TRUE(image.initialized());
15977
15978 VkImageView imgView;
15979 VkImageViewCreateInfo imgViewInfo = {};
15980 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15981 imgViewInfo.image = image.handle();
15982 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15983 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15984 imgViewInfo.subresourceRange.layerCount = 1;
15985 imgViewInfo.subresourceRange.baseMipLevel = 0;
15986 imgViewInfo.subresourceRange.levelCount = 1;
15987 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15988
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015989 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015990 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015992 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15993 m_errorMonitor->VerifyFound();
15994 imgViewInfo.subresourceRange.baseMipLevel = 0;
15995
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015996 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015997 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015998 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015999 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16000 m_errorMonitor->VerifyFound();
16001 imgViewInfo.subresourceRange.baseArrayLayer = 0;
16002
Tony Barbourd6673642016-05-05 14:46:39 -060016003 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16004 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016006 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16007 m_errorMonitor->VerifyFound();
16008 imgViewInfo.subresourceRange.levelCount = 1;
16009
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016010 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16011 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016012 m_errorMonitor->SetDesiredFailureMsg(
16013 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16014 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016015 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16016 m_errorMonitor->VerifyFound();
16017 imgViewInfo.subresourceRange.layerCount = 1;
16018
Tony Barbourd6673642016-05-05 14:46:39 -060016019 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016020 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016021 m_errorMonitor->SetDesiredFailureMsg(
16022 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16023 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016024 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16025 m_errorMonitor->VerifyFound();
16026 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16027
Tony Barbourd6673642016-05-05 14:46:39 -060016028 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16029 // VIEW_CREATE_ERROR
16030 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016031 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016032 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16033 m_errorMonitor->VerifyFound();
16034 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16035
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016036 // TODO: Update framework to easily passing mutable flag into ImageObj init
16037 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016038 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16039 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16040 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016041 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16042 // VIEW_CREATE_ERROR
16043 VkImageCreateInfo mutImgInfo = image.create_info();
16044 VkImage mutImage;
16045 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016046 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016047 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16048 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016049 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016050 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016051
16052 VkMemoryRequirements requirements;
16053 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16054
16055 VkMemoryAllocateInfo alloc_info{};
16056 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16057 alloc_info.pNext = NULL;
16058 alloc_info.memoryTypeIndex = 0;
16059 alloc_info.allocationSize = requirements.size;
16060 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16061 ASSERT_TRUE(pass);
16062
16063 VkDeviceMemory memory;
16064 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16065 ASSERT_VK_SUCCESS(ret);
16066
16067 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16068 ASSERT_VK_SUCCESS(ret);
16069
Tony Barbourd6673642016-05-05 14:46:39 -060016070 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016071 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016072 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16073 m_errorMonitor->VerifyFound();
16074 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016075
16076 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016077 vkDestroyImage(m_device->handle(), mutImage, NULL);
16078}
16079
Dave Houlton75967fc2017-03-06 17:21:16 -070016080TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16081 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16082
Tony Barbour1fa09702017-03-16 12:09:08 -060016083 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016084
Jamie Madill35127872017-03-15 16:17:46 -040016085 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016086 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16087 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16088 if (device_features.textureCompressionBC) {
16089 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16090 } else if (device_features.textureCompressionETC2) {
16091 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16092 } else if (device_features.textureCompressionASTC_LDR) {
16093 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16094 } else {
16095 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16096 return;
16097 }
16098
16099 VkImageCreateInfo ci;
16100 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16101 ci.pNext = NULL;
16102 ci.flags = 0;
16103 ci.imageType = VK_IMAGE_TYPE_2D;
16104 ci.format = compressed_format;
16105 ci.extent = {32, 32, 1};
16106 ci.mipLevels = 6;
16107 ci.arrayLayers = 1;
16108 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16109 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16110 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16111 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16112 ci.queueFamilyIndexCount = 0;
16113 ci.pQueueFamilyIndices = NULL;
16114 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16115
16116 VkImageObj image(m_device);
16117 image.init(&ci);
16118 ASSERT_TRUE(image.initialized());
16119
16120 VkImageObj odd_image(m_device);
16121 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16122 odd_image.init(&ci);
16123 ASSERT_TRUE(odd_image.initialized());
16124
16125 // Allocate buffers
16126 VkMemoryPropertyFlags reqs = 0;
16127 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16128 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16129 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16130 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16131 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16132
16133 VkBufferImageCopy region = {};
16134 region.bufferRowLength = 0;
16135 region.bufferImageHeight = 0;
16136 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16137 region.imageSubresource.layerCount = 1;
16138 region.imageOffset = {0, 0, 0};
16139 region.bufferOffset = 0;
16140
16141 // start recording
16142 m_commandBuffer->BeginCommandBuffer();
16143
16144 // Mip level copies that work - 5 levels
16145 m_errorMonitor->ExpectSuccess();
16146
16147 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16148 region.imageExtent = {32, 32, 1};
16149 region.imageSubresource.mipLevel = 0;
16150 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16151 &region);
16152 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16153 &region);
16154
16155 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16156 region.imageExtent = {8, 8, 1};
16157 region.imageSubresource.mipLevel = 2;
16158 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16159 &region);
16160 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16161 &region);
16162
16163 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16164 region.imageExtent = {4, 4, 1};
16165 region.imageSubresource.mipLevel = 3;
16166 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16167 &region);
16168 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16169 &region);
16170
16171 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16172 region.imageExtent = {2, 2, 1};
16173 region.imageSubresource.mipLevel = 4;
16174 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16175 &region);
16176 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16177 &region);
16178
16179 region.imageExtent = {1, 1, 1};
16180 region.imageSubresource.mipLevel = 5;
16181 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16182 &region);
16183 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16184 &region);
16185 m_errorMonitor->VerifyNotFound();
16186
16187 // Buffer must accomodate a full compressed block, regardless of texel count
16188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16189 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16190 &region);
16191 m_errorMonitor->VerifyFound();
16192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16193 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16194 &region);
16195 m_errorMonitor->VerifyFound();
16196
16197 // Copy width < compressed block size, but not the full mip width
16198 region.imageExtent = {1, 2, 1};
16199 region.imageSubresource.mipLevel = 4;
16200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16201 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16202 &region);
16203 m_errorMonitor->VerifyFound();
16204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16205 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16206 &region);
16207 m_errorMonitor->VerifyFound();
16208
16209 // Copy height < compressed block size but not the full mip height
16210 region.imageExtent = {2, 1, 1};
16211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16212 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16213 &region);
16214 m_errorMonitor->VerifyFound();
16215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16216 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16217 &region);
16218 m_errorMonitor->VerifyFound();
16219
16220 // Offsets must be multiple of compressed block size
16221 region.imageOffset = {1, 1, 0};
16222 region.imageExtent = {1, 1, 1};
16223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16224 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16225 &region);
16226 m_errorMonitor->VerifyFound();
16227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16228 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16229 &region);
16230 m_errorMonitor->VerifyFound();
16231
16232 // Offset + extent width = mip width - should succeed
16233 region.imageOffset = {4, 4, 0};
16234 region.imageExtent = {3, 4, 1};
16235 region.imageSubresource.mipLevel = 2;
16236 m_errorMonitor->ExpectSuccess();
16237 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16238 &region);
16239 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16240 &region);
16241 m_errorMonitor->VerifyNotFound();
16242
16243 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16244 region.imageExtent = {4, 4, 1};
16245 m_errorMonitor->ExpectSuccess();
16246 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16247 &region);
16248 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16249 &region);
16250 m_errorMonitor->VerifyNotFound();
16251
16252 // Offset + extent width < mip width and not a multiple of block width - should fail
16253 region.imageExtent = {3, 3, 1};
16254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16255 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16256 &region);
16257 m_errorMonitor->VerifyFound();
16258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16259 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16260 &region);
16261 m_errorMonitor->VerifyFound();
16262}
16263
Dave Houlton59a20702017-02-02 17:26:23 -070016264TEST_F(VkLayerTest, ImageBufferCopyTests) {
16265 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16266
Tony Barbour1fa09702017-03-16 12:09:08 -060016267 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016268 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16269 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16270 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16271 return;
16272 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016273
16274 // Bail if any dimension of transfer granularity is 0.
16275 auto index = m_device->graphics_queue_node_index_;
16276 auto queue_family_properties = m_device->phy().queue_properties();
16277 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16278 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16279 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16280 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16281 return;
16282 }
16283
Dave Houlton59a20702017-02-02 17:26:23 -070016284 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16285 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16286 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016287 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16288 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16289 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16290 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16291
Dave Houlton59a20702017-02-02 17:26:23 -070016292 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16293 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16294 VK_IMAGE_TILING_OPTIMAL, 0);
16295 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16296 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16297 VK_IMAGE_TILING_OPTIMAL, 0);
16298 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16299 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016300 ASSERT_TRUE(image_64k.initialized());
16301 ASSERT_TRUE(image_16k.initialized());
16302 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016303
Dave Houltonf3229d52017-02-21 15:59:08 -070016304 // Verify all needed Depth/Stencil formats are supported
16305 bool missing_ds_support = false;
16306 VkFormatProperties props = {0, 0, 0};
16307 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16308 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16309 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16310 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16311 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16312 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16313 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16314 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16315
16316 if (!missing_ds_support) {
16317 ds_image_4D_1S.init(
16318 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16319 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16320 VK_IMAGE_TILING_OPTIMAL, 0);
16321 ASSERT_TRUE(ds_image_4D_1S.initialized());
16322
16323 ds_image_3D_1S.init(
16324 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16325 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16326 VK_IMAGE_TILING_OPTIMAL, 0);
16327 ASSERT_TRUE(ds_image_3D_1S.initialized());
16328
16329 ds_image_2D.init(
16330 256, 256, VK_FORMAT_D16_UNORM,
16331 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16332 VK_IMAGE_TILING_OPTIMAL, 0);
16333 ASSERT_TRUE(ds_image_2D.initialized());
16334
16335 ds_image_1S.init(
16336 256, 256, VK_FORMAT_S8_UINT,
16337 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16338 VK_IMAGE_TILING_OPTIMAL, 0);
16339 ASSERT_TRUE(ds_image_1S.initialized());
16340 }
16341
16342 // Allocate buffers
16343 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016344 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016345 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16346 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16347 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16348 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016349
16350 VkBufferImageCopy region = {};
16351 region.bufferRowLength = 0;
16352 region.bufferImageHeight = 0;
16353 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16354 region.imageSubresource.layerCount = 1;
16355 region.imageOffset = {0, 0, 0};
16356 region.imageExtent = {64, 64, 1};
16357 region.bufferOffset = 0;
16358
16359 // attempt copies before putting command buffer in recording state
16360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16361 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16362 &region);
16363 m_errorMonitor->VerifyFound();
16364
16365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16366 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16367 &region);
16368 m_errorMonitor->VerifyFound();
16369
16370 // start recording
16371 m_commandBuffer->BeginCommandBuffer();
16372
16373 // successful copies
16374 m_errorMonitor->ExpectSuccess();
16375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16376 &region);
16377 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16378 &region);
16379 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16380 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16381 &region);
16382 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16384 &region);
16385 region.imageOffset.x = 0;
16386 region.imageExtent.height = 64;
16387 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16389 &region);
16390 m_errorMonitor->VerifyNotFound();
16391
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016392 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016393 region.imageExtent = {65, 64, 1};
16394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16395 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16396 &region);
16397 m_errorMonitor->VerifyFound();
16398
16399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16400 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16401 &region);
16402 m_errorMonitor->VerifyFound();
16403
16404 // image/buffer too small (offset) on copy to image
16405 region.imageExtent = {64, 64, 1};
16406 region.imageOffset = {0, 4, 0};
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 on copy to buffer
16418 region.imageExtent = {64, 64, 1};
16419 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016420 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16422 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16423 &region);
16424 m_errorMonitor->VerifyFound();
16425
16426 region.imageExtent = {64, 65, 1};
16427 region.bufferOffset = 0;
16428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16429 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16430 &region);
16431 m_errorMonitor->VerifyFound();
16432
16433 // buffer size ok but rowlength causes loose packing
16434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16435 region.imageExtent = {64, 64, 1};
16436 region.bufferRowLength = 68;
16437 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16438 &region);
16439 m_errorMonitor->VerifyFound();
16440
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016441 // An extent with zero area should produce a warning, but no error
16442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16443 region.imageExtent.width = 0;
16444 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16445 &region);
16446 m_errorMonitor->VerifyFound();
16447
Dave Houlton59a20702017-02-02 17:26:23 -070016448 // aspect bits
16449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16450 region.imageExtent = {64, 64, 1};
16451 region.bufferRowLength = 0;
16452 region.bufferImageHeight = 0;
16453 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16454 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16455 buffer_16k.handle(), 1, &region);
16456 m_errorMonitor->VerifyFound();
16457
16458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16459 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16460 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16461 &region);
16462 m_errorMonitor->VerifyFound();
16463
16464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16465 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16466 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16467 buffer_16k.handle(), 1, &region);
16468 m_errorMonitor->VerifyFound();
16469
Dave Houltonf3229d52017-02-21 15:59:08 -070016470 // Test Depth/Stencil copies
16471 if (missing_ds_support) {
16472 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16473 } else {
16474 VkBufferImageCopy ds_region = {};
16475 ds_region.bufferOffset = 0;
16476 ds_region.bufferRowLength = 0;
16477 ds_region.bufferImageHeight = 0;
16478 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16479 ds_region.imageSubresource.mipLevel = 0;
16480 ds_region.imageSubresource.baseArrayLayer = 0;
16481 ds_region.imageSubresource.layerCount = 1;
16482 ds_region.imageOffset = {0, 0, 0};
16483 ds_region.imageExtent = {256, 256, 1};
16484
16485 // Depth copies that should succeed
16486 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16487 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16488 buffer_256k.handle(), 1, &ds_region);
16489 m_errorMonitor->VerifyNotFound();
16490
16491 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16492 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16493 buffer_256k.handle(), 1, &ds_region);
16494 m_errorMonitor->VerifyNotFound();
16495
16496 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16497 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16498 buffer_128k.handle(), 1, &ds_region);
16499 m_errorMonitor->VerifyNotFound();
16500
16501 // Depth copies that should fail
16502 ds_region.bufferOffset = 4;
16503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16504 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16505 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16506 buffer_256k.handle(), 1, &ds_region);
16507 m_errorMonitor->VerifyFound();
16508
16509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16510 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16511 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16512 buffer_256k.handle(), 1, &ds_region);
16513 m_errorMonitor->VerifyFound();
16514
16515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16516 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16517 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16518 buffer_128k.handle(), 1, &ds_region);
16519 m_errorMonitor->VerifyFound();
16520
16521 // Stencil copies that should succeed
16522 ds_region.bufferOffset = 0;
16523 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16524 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16525 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16526 buffer_64k.handle(), 1, &ds_region);
16527 m_errorMonitor->VerifyNotFound();
16528
16529 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16530 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16531 buffer_64k.handle(), 1, &ds_region);
16532 m_errorMonitor->VerifyNotFound();
16533
16534 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16535 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16536 buffer_64k.handle(), 1, &ds_region);
16537 m_errorMonitor->VerifyNotFound();
16538
16539 // Stencil copies that should fail
16540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16541 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16542 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16543 buffer_16k.handle(), 1, &ds_region);
16544 m_errorMonitor->VerifyFound();
16545
16546 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16547 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16548 ds_region.bufferRowLength = 260;
16549 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16550 buffer_64k.handle(), 1, &ds_region);
16551 m_errorMonitor->VerifyFound();
16552
16553 ds_region.bufferRowLength = 0;
16554 ds_region.bufferOffset = 4;
16555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16556 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16557 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16558 buffer_64k.handle(), 1, &ds_region);
16559 m_errorMonitor->VerifyFound();
16560 }
16561
Dave Houlton584d51e2017-02-16 12:52:54 -070016562 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016563 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016564 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016565 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16566 device_features.textureCompressionASTC_LDR)) {
16567 printf(" No compressed formats supported - block compression tests skipped.\n");
16568 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016569 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16570 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016571 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016572 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 -070016573 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16574 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016575 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016576 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 -070016577 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016578 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16579 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016580 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016581 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16582 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016583 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16584 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016585 }
16586 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016587
Dave Houlton584d51e2017-02-16 12:52:54 -070016588 // Just fits
16589 m_errorMonitor->ExpectSuccess();
16590 region.imageExtent = {128, 128, 1};
16591 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16592 buffer_16k.handle(), 1, &region);
16593 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016594
Dave Houlton584d51e2017-02-16 12:52:54 -070016595 // with offset, too big for buffer
16596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16597 region.bufferOffset = 16;
16598 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16599 buffer_16k.handle(), 1, &region);
16600 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016601 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016602
Dave Houlton67e9b532017-03-02 17:00:10 -070016603 // extents that are not a multiple of compressed block size
16604 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16605 region.imageExtent.width = 66;
16606 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16607 buffer_16k.handle(), 1, &region);
16608 m_errorMonitor->VerifyFound();
16609 region.imageExtent.width = 128;
16610
16611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016612 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016613 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16614 buffer_16k.handle(), 1, &region);
16615 m_errorMonitor->VerifyFound();
16616 region.imageExtent.height = 128;
16617
16618 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16619
16620 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16621 m_errorMonitor->ExpectSuccess();
16622 region.imageExtent.width = 66;
16623 region.imageOffset.x = 64;
16624 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16625 buffer_16k.handle(), 1, &region);
16626 region.imageExtent.width = 16;
16627 region.imageOffset.x = 0;
16628 region.imageExtent.height = 2;
16629 region.imageOffset.y = 128;
16630 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016631 buffer_16k.handle(), 1, &region);
16632 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016633 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016634
Dave Houlton584d51e2017-02-16 12:52:54 -070016635 // buffer offset must be a multiple of texel block size (16)
16636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16638 region.imageExtent = {64, 64, 1};
16639 region.bufferOffset = 24;
16640 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16641 buffer_16k.handle(), 1, &region);
16642 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016643
Dave Houlton584d51e2017-02-16 12:52:54 -070016644 // rowlength not a multiple of block width (4)
16645 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16646 region.bufferOffset = 0;
16647 region.bufferRowLength = 130;
16648 region.bufferImageHeight = 0;
16649 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16650 buffer_64k.handle(), 1, &region);
16651 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016652
Dave Houlton584d51e2017-02-16 12:52:54 -070016653 // imageheight not a multiple of block height (4)
16654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16655 region.bufferRowLength = 0;
16656 region.bufferImageHeight = 130;
16657 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16658 buffer_64k.handle(), 1, &region);
16659 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016660 }
Dave Houlton59a20702017-02-02 17:26:23 -070016661}
16662
Tony Barbourd6673642016-05-05 14:46:39 -060016663TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016664 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016665
Tony Barbour1fa09702017-03-16 12:09:08 -060016666 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016667
Rene Lindsay135204f2016-12-22 17:11:09 -070016668 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016669 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016670 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 -070016671 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016672 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016673 vk_testing::Buffer buffer;
16674 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016675 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016676 VkBufferImageCopy region = {};
16677 region.bufferRowLength = 128;
16678 region.bufferImageHeight = 128;
16679 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16680 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016681 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016682 region.imageExtent.height = 4;
16683 region.imageExtent.width = 4;
16684 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016685
16686 VkImageObj image2(m_device);
16687 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 -070016688 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016689 ASSERT_TRUE(image2.initialized());
16690 vk_testing::Buffer buffer2;
16691 VkMemoryPropertyFlags reqs2 = 0;
16692 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16693 VkBufferImageCopy region2 = {};
16694 region2.bufferRowLength = 128;
16695 region2.bufferImageHeight = 128;
16696 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16697 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16698 region2.imageSubresource.layerCount = 1;
16699 region2.imageExtent.height = 4;
16700 region2.imageExtent.width = 4;
16701 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016702 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016703
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016704 // Image must have offset.z of 0 and extent.depth of 1
16705 // Introduce failure by setting imageExtent.depth to 0
16706 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016708 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016709 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016710 m_errorMonitor->VerifyFound();
16711
16712 region.imageExtent.depth = 1;
16713
16714 // Image must have offset.z of 0 and extent.depth of 1
16715 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016716 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016717 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016720 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016721 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016722 m_errorMonitor->VerifyFound();
16723
16724 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016725 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16726 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016727 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016729 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16730 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016731 m_errorMonitor->VerifyFound();
16732
16733 // BufferOffset must be a multiple of 4
16734 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016735 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016736 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016737 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16738 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016739 m_errorMonitor->VerifyFound();
16740
16741 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16742 region.bufferOffset = 0;
16743 region.imageExtent.height = 128;
16744 region.imageExtent.width = 128;
16745 // Introduce failure by setting bufferRowLength > 0 but less than width
16746 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016748 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16749 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016750 m_errorMonitor->VerifyFound();
16751
16752 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16753 region.bufferRowLength = 128;
16754 // Introduce failure by setting bufferRowHeight > 0 but less than height
16755 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016757 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16758 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016759 m_errorMonitor->VerifyFound();
16760
16761 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016762 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016763 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16764 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016765 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016766 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16767 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016768 VkImageBlit blitRegion = {};
16769 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16770 blitRegion.srcSubresource.baseArrayLayer = 0;
16771 blitRegion.srcSubresource.layerCount = 1;
16772 blitRegion.srcSubresource.mipLevel = 0;
16773 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16774 blitRegion.dstSubresource.baseArrayLayer = 0;
16775 blitRegion.dstSubresource.layerCount = 1;
16776 blitRegion.dstSubresource.mipLevel = 0;
16777
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016778 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16780 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16782 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016783 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16784 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016785 m_errorMonitor->VerifyFound();
16786
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016788 VkImageMemoryBarrier img_barrier;
16789 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16790 img_barrier.pNext = NULL;
16791 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16792 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16793 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16794 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16795 img_barrier.image = image.handle();
16796 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16797 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16798 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16799 img_barrier.subresourceRange.baseArrayLayer = 0;
16800 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016801 img_barrier.subresourceRange.layerCount = 0;
16802 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016803 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16804 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016805 m_errorMonitor->VerifyFound();
16806 img_barrier.subresourceRange.layerCount = 1;
16807}
16808
16809TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016810 TEST_DESCRIPTION("Exceed the limits of image format ");
16811
Tony Barbour1fa09702017-03-16 12:09:08 -060016812 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016813
16814 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16815 {
16816 VkFormatProperties properties;
16817 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16818 if (properties.linearTilingFeatures == 0) {
16819 printf(" Image format not supported; skipped.\n");
16820 return;
16821 }
16822 }
16823
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016825 VkImageCreateInfo image_create_info = {};
16826 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16827 image_create_info.pNext = NULL;
16828 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016829 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016830 image_create_info.extent.width = 32;
16831 image_create_info.extent.height = 32;
16832 image_create_info.extent.depth = 1;
16833 image_create_info.mipLevels = 1;
16834 image_create_info.arrayLayers = 1;
16835 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16836 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16837 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16838 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16839 image_create_info.flags = 0;
16840
16841 VkImage nullImg;
16842 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016843 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16844 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016845 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016846 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16847 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16848 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016849 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016850
Tony Barbour0907e362017-03-09 15:05:30 -070016851 uint32_t maxDim =
16852 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16853 // If max mip levels exceeds image extents, skip the max mip levels test
16854 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16855 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16856 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16857 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16858 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16859 m_errorMonitor->VerifyFound();
16860 image_create_info.mipLevels = 1;
16861 }
Tony Barbourd6673642016-05-05 14:46:39 -060016862
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016864 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16865 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16866 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16867 m_errorMonitor->VerifyFound();
16868 image_create_info.arrayLayers = 1;
16869
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016870 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016871 int samples = imgFmtProps.sampleCounts >> 1;
16872 image_create_info.samples = (VkSampleCountFlagBits)samples;
16873 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16874 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16875 m_errorMonitor->VerifyFound();
16876 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16877
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16879 "pCreateInfo->initialLayout, must be "
16880 "VK_IMAGE_LAYOUT_UNDEFINED or "
16881 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016882 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16883 // Expect INVALID_LAYOUT
16884 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16885 m_errorMonitor->VerifyFound();
16886 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16887}
16888
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016889TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016890 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016892
Tony Barbour1fa09702017-03-16 12:09:08 -060016893 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016894
16895 VkImageObj src_image(m_device);
16896 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16897 VkImageObj dst_image(m_device);
16898 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16899
Tony Barbour552f6c02016-12-21 14:34:07 -070016900 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016901 VkImageCopy copy_region;
16902 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16903 copy_region.srcSubresource.mipLevel = 0;
16904 copy_region.srcSubresource.baseArrayLayer = 0;
16905 copy_region.srcSubresource.layerCount = 0;
16906 copy_region.srcOffset.x = 0;
16907 copy_region.srcOffset.y = 0;
16908 copy_region.srcOffset.z = 0;
16909 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16910 copy_region.dstSubresource.mipLevel = 0;
16911 copy_region.dstSubresource.baseArrayLayer = 0;
16912 copy_region.dstSubresource.layerCount = 0;
16913 copy_region.dstOffset.x = 0;
16914 copy_region.dstOffset.y = 0;
16915 copy_region.dstOffset.z = 0;
16916 copy_region.extent.width = 64;
16917 copy_region.extent.height = 64;
16918 copy_region.extent.depth = 1;
16919 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16920 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016921 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016922
16923 m_errorMonitor->VerifyFound();
16924}
16925
16926TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016927 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016929
Tony Barbour1fa09702017-03-16 12:09:08 -060016930 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016931
16932 VkImageObj src_image(m_device);
16933 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16934 VkImageObj dst_image(m_device);
16935 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16936
Tony Barbour552f6c02016-12-21 14:34:07 -070016937 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016938 VkImageCopy copy_region;
16939 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16940 copy_region.srcSubresource.mipLevel = 0;
16941 copy_region.srcSubresource.baseArrayLayer = 0;
16942 copy_region.srcSubresource.layerCount = 0;
16943 copy_region.srcOffset.x = 0;
16944 copy_region.srcOffset.y = 0;
16945 copy_region.srcOffset.z = 0;
16946 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16947 copy_region.dstSubresource.mipLevel = 0;
16948 copy_region.dstSubresource.baseArrayLayer = 0;
16949 copy_region.dstSubresource.layerCount = 0;
16950 copy_region.dstOffset.x = 0;
16951 copy_region.dstOffset.y = 0;
16952 copy_region.dstOffset.z = 0;
16953 copy_region.extent.width = 64;
16954 copy_region.extent.height = 64;
16955 copy_region.extent.depth = 1;
16956 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16957 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016958 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016959
16960 m_errorMonitor->VerifyFound();
16961}
16962
Karl Schultz6addd812016-02-02 17:17:23 -070016963TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016964 VkResult err;
16965 bool pass;
16966
16967 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016969
Tony Barbour1fa09702017-03-16 12:09:08 -060016970 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016971
16972 // Create two images of different types and try to copy between them
16973 VkImage srcImage;
16974 VkImage dstImage;
16975 VkDeviceMemory srcMem;
16976 VkDeviceMemory destMem;
16977 VkMemoryRequirements memReqs;
16978
16979 VkImageCreateInfo image_create_info = {};
16980 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16981 image_create_info.pNext = NULL;
16982 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16983 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16984 image_create_info.extent.width = 32;
16985 image_create_info.extent.height = 32;
16986 image_create_info.extent.depth = 1;
16987 image_create_info.mipLevels = 1;
16988 image_create_info.arrayLayers = 1;
16989 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16990 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16991 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16992 image_create_info.flags = 0;
16993
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016994 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016995 ASSERT_VK_SUCCESS(err);
16996
16997 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16998 // Introduce failure by creating second image with a different-sized format.
16999 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
17000
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017001 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060017002 ASSERT_VK_SUCCESS(err);
17003
17004 // Allocate memory
17005 VkMemoryAllocateInfo memAlloc = {};
17006 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17007 memAlloc.pNext = NULL;
17008 memAlloc.allocationSize = 0;
17009 memAlloc.memoryTypeIndex = 0;
17010
17011 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17012 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017013 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017014 ASSERT_TRUE(pass);
17015 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17016 ASSERT_VK_SUCCESS(err);
17017
17018 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17019 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017020 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017021 ASSERT_TRUE(pass);
17022 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17023 ASSERT_VK_SUCCESS(err);
17024
17025 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17026 ASSERT_VK_SUCCESS(err);
17027 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17028 ASSERT_VK_SUCCESS(err);
17029
Tony Barbour552f6c02016-12-21 14:34:07 -070017030 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017031 VkImageCopy copyRegion;
17032 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17033 copyRegion.srcSubresource.mipLevel = 0;
17034 copyRegion.srcSubresource.baseArrayLayer = 0;
17035 copyRegion.srcSubresource.layerCount = 0;
17036 copyRegion.srcOffset.x = 0;
17037 copyRegion.srcOffset.y = 0;
17038 copyRegion.srcOffset.z = 0;
17039 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17040 copyRegion.dstSubresource.mipLevel = 0;
17041 copyRegion.dstSubresource.baseArrayLayer = 0;
17042 copyRegion.dstSubresource.layerCount = 0;
17043 copyRegion.dstOffset.x = 0;
17044 copyRegion.dstOffset.y = 0;
17045 copyRegion.dstOffset.z = 0;
17046 copyRegion.extent.width = 1;
17047 copyRegion.extent.height = 1;
17048 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017049 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017050 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017051
17052 m_errorMonitor->VerifyFound();
17053
17054 vkDestroyImage(m_device->device(), srcImage, NULL);
17055 vkDestroyImage(m_device->device(), dstImage, NULL);
17056 vkFreeMemory(m_device->device(), srcMem, NULL);
17057 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017058}
17059
Karl Schultz6addd812016-02-02 17:17:23 -070017060TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17061 VkResult err;
17062 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017063
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017064 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17066 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017067
Tony Barbour1fa09702017-03-16 12:09:08 -060017068 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017069 auto depth_format = find_depth_stencil_format(m_device);
17070 if (!depth_format) {
17071 return;
17072 }
Mike Stroyana3082432015-09-25 13:39:21 -060017073
17074 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017075 VkImage srcImage;
17076 VkImage dstImage;
17077 VkDeviceMemory srcMem;
17078 VkDeviceMemory destMem;
17079 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017080
17081 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017082 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17083 image_create_info.pNext = NULL;
17084 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017085 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017086 image_create_info.extent.width = 32;
17087 image_create_info.extent.height = 32;
17088 image_create_info.extent.depth = 1;
17089 image_create_info.mipLevels = 1;
17090 image_create_info.arrayLayers = 1;
17091 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17092 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17093 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17094 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017096 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017097 ASSERT_VK_SUCCESS(err);
17098
Karl Schultzbdb75952016-04-19 11:36:49 -060017099 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17100
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017101 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017102 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017103 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017104 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017105
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017106 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017107 ASSERT_VK_SUCCESS(err);
17108
17109 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017110 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017111 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17112 memAlloc.pNext = NULL;
17113 memAlloc.allocationSize = 0;
17114 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017115
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017116 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017117 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017118 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017119 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017120 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017121 ASSERT_VK_SUCCESS(err);
17122
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017123 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017124 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017125 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017126 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017127 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017128 ASSERT_VK_SUCCESS(err);
17129
17130 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17131 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017132 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017133 ASSERT_VK_SUCCESS(err);
17134
Tony Barbour552f6c02016-12-21 14:34:07 -070017135 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017136 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017137 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017138 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017139 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017140 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017141 copyRegion.srcOffset.x = 0;
17142 copyRegion.srcOffset.y = 0;
17143 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017144 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017145 copyRegion.dstSubresource.mipLevel = 0;
17146 copyRegion.dstSubresource.baseArrayLayer = 0;
17147 copyRegion.dstSubresource.layerCount = 0;
17148 copyRegion.dstOffset.x = 0;
17149 copyRegion.dstOffset.y = 0;
17150 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017151 copyRegion.extent.width = 1;
17152 copyRegion.extent.height = 1;
17153 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017154 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017155 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017156
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017157 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017158
Chia-I Wuf7458c52015-10-26 21:10:41 +080017159 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017160 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017161 vkFreeMemory(m_device->device(), srcMem, NULL);
17162 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017163}
17164
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017165TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17166 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017167
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017168 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017169
17170 VkImageFormatProperties image_format_properties;
17171 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17172 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17173 &image_format_properties);
17174
17175 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17176 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17177 printf(" Image multi-sample support not found; skipped.\n");
17178 return;
17179 }
17180
17181 VkImageCreateInfo ci;
17182 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17183 ci.pNext = NULL;
17184 ci.flags = 0;
17185 ci.imageType = VK_IMAGE_TYPE_2D;
17186 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17187 ci.extent = {128, 128, 1};
17188 ci.mipLevels = 1;
17189 ci.arrayLayers = 1;
17190 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17191 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17192 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17193 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17194 ci.queueFamilyIndexCount = 0;
17195 ci.pQueueFamilyIndices = NULL;
17196 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17197
17198 VkImageObj image1(m_device);
17199 image1.init(&ci);
17200 ASSERT_TRUE(image1.initialized());
17201
17202 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17203 VkImageObj image2(m_device);
17204 image2.init(&ci);
17205 ASSERT_TRUE(image2.initialized());
17206
17207 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17208 VkImageObj image4(m_device);
17209 image4.init(&ci);
17210 ASSERT_TRUE(image4.initialized());
17211
17212 m_commandBuffer->BeginCommandBuffer();
17213
17214 VkImageCopy copyRegion;
17215 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17216 copyRegion.srcSubresource.mipLevel = 0;
17217 copyRegion.srcSubresource.baseArrayLayer = 0;
17218 copyRegion.srcSubresource.layerCount = 1;
17219 copyRegion.srcOffset = {0, 0, 0};
17220 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17221 copyRegion.dstSubresource.mipLevel = 0;
17222 copyRegion.dstSubresource.baseArrayLayer = 0;
17223 copyRegion.dstSubresource.layerCount = 1;
17224 copyRegion.dstOffset = {0, 0, 0};
17225 copyRegion.extent = {128, 128, 1};
17226
17227 // Copy a single sample image to/from a multi-sample image
17228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17229 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17230 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17231 m_errorMonitor->VerifyFound();
17232
17233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17234 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17235 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17236 m_errorMonitor->VerifyFound();
17237
17238 // Copy between multi-sample images with different sample counts
17239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17240 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17241 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17242 m_errorMonitor->VerifyFound();
17243
17244 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17245 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17246 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17247 m_errorMonitor->VerifyFound();
17248
17249 m_commandBuffer->EndCommandBuffer();
17250}
17251
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017252TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17253 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017254 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour9357d542017-03-24 15:42:21 -060017255 auto ds_format = find_depth_stencil_format(m_device);
17256 if (!ds_format) {
17257 return;
17258 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017259
17260 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17261 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17262 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
Tony Barbour9357d542017-03-24 15:42:21 -060017263 ds_image.init(128, 128, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL,
17264 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017265 ASSERT_TRUE(color_image.initialized());
17266 ASSERT_TRUE(depth_image.initialized());
17267 ASSERT_TRUE(ds_image.initialized());
17268
17269 VkImageCopy copyRegion;
17270 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17271 copyRegion.srcSubresource.mipLevel = 0;
17272 copyRegion.srcSubresource.baseArrayLayer = 0;
17273 copyRegion.srcSubresource.layerCount = 1;
17274 copyRegion.srcOffset = {0, 0, 0};
17275 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17276 copyRegion.dstSubresource.mipLevel = 0;
17277 copyRegion.dstSubresource.baseArrayLayer = 0;
17278 copyRegion.dstSubresource.layerCount = 1;
17279 copyRegion.dstOffset = {64, 0, 0};
17280 copyRegion.extent = {64, 128, 1};
17281
17282 // Submitting command before command buffer is in recording state
17283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You must call vkBeginCommandBuffer");// VALIDATION_ERROR_01192);
17284 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17285 m_errorMonitor->VerifyFound();
17286
17287 m_commandBuffer->BeginCommandBuffer();
17288
17289 // Src and dest aspect masks don't match
17290 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
17292 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17293 m_errorMonitor->VerifyFound();
17294 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17295
17296 // Illegal combinations of aspect bits - VU 01221
17297 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
17298 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17300 // These aspect/format mismatches are redundant but unavoidable here
17301 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17303 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17304 m_errorMonitor->VerifyFound();
17305 // Metadata aspect is illegal - VU 01222
17306 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17307 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17309 // These aspect/format mismatches are redundant but unavoidable here
17310 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17311 m_errorMonitor->VerifyFound();
17312
17313 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17314 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17315
17316 // Aspect mask doesn't match source image format - VU 01200
17317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17318 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17320 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17321 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17322 m_errorMonitor->VerifyFound();
17323
17324 // Aspect mask doesn't match dest image format - VU 01201
17325 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17326 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17328 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17330 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17331 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17332 m_errorMonitor->VerifyFound();
17333
17334 m_commandBuffer->EndCommandBuffer();
17335}
17336
Karl Schultz6addd812016-02-02 17:17:23 -070017337TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17338 VkResult err;
17339 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017340
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17342 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017343
Tony Barbour1fa09702017-03-16 12:09:08 -060017344 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017345
17346 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017347 VkImage srcImage;
17348 VkImage dstImage;
17349 VkDeviceMemory srcMem;
17350 VkDeviceMemory destMem;
17351 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017352
17353 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017354 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17355 image_create_info.pNext = NULL;
17356 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17357 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17358 image_create_info.extent.width = 32;
17359 image_create_info.extent.height = 1;
17360 image_create_info.extent.depth = 1;
17361 image_create_info.mipLevels = 1;
17362 image_create_info.arrayLayers = 1;
17363 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17364 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17365 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17366 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017367
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017368 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017369 ASSERT_VK_SUCCESS(err);
17370
Karl Schultz6addd812016-02-02 17:17:23 -070017371 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017372
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017373 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017374 ASSERT_VK_SUCCESS(err);
17375
17376 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017377 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017378 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17379 memAlloc.pNext = NULL;
17380 memAlloc.allocationSize = 0;
17381 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017382
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017383 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017384 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017385 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017386 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017387 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017388 ASSERT_VK_SUCCESS(err);
17389
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017390 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017391 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017392 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017393 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017394 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017395 ASSERT_VK_SUCCESS(err);
17396
17397 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17398 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017399 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017400 ASSERT_VK_SUCCESS(err);
17401
Tony Barbour552f6c02016-12-21 14:34:07 -070017402 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017403 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017404 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17405 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017406 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017407 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017408 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017409 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017410 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017411 resolveRegion.srcOffset.x = 0;
17412 resolveRegion.srcOffset.y = 0;
17413 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017414 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017415 resolveRegion.dstSubresource.mipLevel = 0;
17416 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017417 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017418 resolveRegion.dstOffset.x = 0;
17419 resolveRegion.dstOffset.y = 0;
17420 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017421 resolveRegion.extent.width = 1;
17422 resolveRegion.extent.height = 1;
17423 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017424 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017425 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017427 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017428
Chia-I Wuf7458c52015-10-26 21:10:41 +080017429 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017430 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017431 vkFreeMemory(m_device->device(), srcMem, NULL);
17432 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017433}
17434
Karl Schultz6addd812016-02-02 17:17:23 -070017435TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17436 VkResult err;
17437 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017438
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17440 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017441
Tony Barbour1fa09702017-03-16 12:09:08 -060017442 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017443
Chris Forbesa7530692016-05-08 12:35:39 +120017444 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017445 VkImage srcImage;
17446 VkImage dstImage;
17447 VkDeviceMemory srcMem;
17448 VkDeviceMemory destMem;
17449 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017450
17451 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017452 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17453 image_create_info.pNext = NULL;
17454 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17455 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17456 image_create_info.extent.width = 32;
17457 image_create_info.extent.height = 1;
17458 image_create_info.extent.depth = 1;
17459 image_create_info.mipLevels = 1;
17460 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017461 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017462 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17463 // Note: Some implementations expect color attachment usage for any
17464 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017465 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017466 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017467
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017468 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017469 ASSERT_VK_SUCCESS(err);
17470
Karl Schultz6addd812016-02-02 17:17:23 -070017471 // 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_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017474
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017475 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017476 ASSERT_VK_SUCCESS(err);
17477
17478 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017479 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017480 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17481 memAlloc.pNext = NULL;
17482 memAlloc.allocationSize = 0;
17483 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017484
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017485 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017486 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017487 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017488 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017489 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017490 ASSERT_VK_SUCCESS(err);
17491
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017492 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017493 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017494 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017495 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017496 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017497 ASSERT_VK_SUCCESS(err);
17498
17499 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17500 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017501 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017502 ASSERT_VK_SUCCESS(err);
17503
Tony Barbour552f6c02016-12-21 14:34:07 -070017504 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017505 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017506 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17507 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017508 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017509 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017510 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017511 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017512 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017513 resolveRegion.srcOffset.x = 0;
17514 resolveRegion.srcOffset.y = 0;
17515 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017516 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017517 resolveRegion.dstSubresource.mipLevel = 0;
17518 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017519 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017520 resolveRegion.dstOffset.x = 0;
17521 resolveRegion.dstOffset.y = 0;
17522 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017523 resolveRegion.extent.width = 1;
17524 resolveRegion.extent.height = 1;
17525 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017526 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017527 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017528
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017529 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017530
Chia-I Wuf7458c52015-10-26 21:10:41 +080017531 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017532 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017533 vkFreeMemory(m_device->device(), srcMem, NULL);
17534 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017535}
17536
Karl Schultz6addd812016-02-02 17:17:23 -070017537TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17538 VkResult err;
17539 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017540
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017541 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017542 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017543
Tony Barbour1fa09702017-03-16 12:09:08 -060017544 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017545
17546 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017547 VkImage srcImage;
17548 VkImage dstImage;
17549 VkDeviceMemory srcMem;
17550 VkDeviceMemory destMem;
17551 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017552
17553 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017554 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17555 image_create_info.pNext = NULL;
17556 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17557 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17558 image_create_info.extent.width = 32;
17559 image_create_info.extent.height = 1;
17560 image_create_info.extent.depth = 1;
17561 image_create_info.mipLevels = 1;
17562 image_create_info.arrayLayers = 1;
17563 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17564 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17565 // Note: Some implementations expect color attachment usage for any
17566 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017567 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017568 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017569
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017570 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017571 ASSERT_VK_SUCCESS(err);
17572
Karl Schultz6addd812016-02-02 17:17:23 -070017573 // Set format to something other than source image
17574 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17575 // Note: Some implementations expect color attachment usage for any
17576 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017577 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017578 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017579
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017580 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017581 ASSERT_VK_SUCCESS(err);
17582
17583 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017584 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017585 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17586 memAlloc.pNext = NULL;
17587 memAlloc.allocationSize = 0;
17588 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017589
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017590 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017591 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017592 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017593 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017594 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017595 ASSERT_VK_SUCCESS(err);
17596
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017597 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017598 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017599 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017600 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017601 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017602 ASSERT_VK_SUCCESS(err);
17603
17604 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17605 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017606 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017607 ASSERT_VK_SUCCESS(err);
17608
Tony Barbour552f6c02016-12-21 14:34:07 -070017609 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017610 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017611 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17612 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017613 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017614 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017615 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017616 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017617 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017618 resolveRegion.srcOffset.x = 0;
17619 resolveRegion.srcOffset.y = 0;
17620 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017621 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017622 resolveRegion.dstSubresource.mipLevel = 0;
17623 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017624 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017625 resolveRegion.dstOffset.x = 0;
17626 resolveRegion.dstOffset.y = 0;
17627 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017628 resolveRegion.extent.width = 1;
17629 resolveRegion.extent.height = 1;
17630 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017631 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017632 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017633
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017634 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017635
Chia-I Wuf7458c52015-10-26 21:10:41 +080017636 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017637 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017638 vkFreeMemory(m_device->device(), srcMem, NULL);
17639 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017640}
17641
Karl Schultz6addd812016-02-02 17:17:23 -070017642TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17643 VkResult err;
17644 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017645
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017647 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017648
Tony Barbour1fa09702017-03-16 12:09:08 -060017649 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017650
17651 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017652 VkImage srcImage;
17653 VkImage dstImage;
17654 VkDeviceMemory srcMem;
17655 VkDeviceMemory destMem;
17656 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017657
17658 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017659 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17660 image_create_info.pNext = NULL;
17661 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17662 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17663 image_create_info.extent.width = 32;
17664 image_create_info.extent.height = 1;
17665 image_create_info.extent.depth = 1;
17666 image_create_info.mipLevels = 1;
17667 image_create_info.arrayLayers = 1;
17668 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17669 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17670 // Note: Some implementations expect color attachment usage for any
17671 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017672 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017673 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017674
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017675 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017676 ASSERT_VK_SUCCESS(err);
17677
Karl Schultz6addd812016-02-02 17:17:23 -070017678 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17679 // Note: Some implementations expect color attachment usage for any
17680 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017681 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017682 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017683
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017684 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017685 ASSERT_VK_SUCCESS(err);
17686
17687 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017688 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017689 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17690 memAlloc.pNext = NULL;
17691 memAlloc.allocationSize = 0;
17692 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017693
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017694 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017695 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017696 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017697 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017698 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017699 ASSERT_VK_SUCCESS(err);
17700
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017701 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017702 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017703 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017704 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017705 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017706 ASSERT_VK_SUCCESS(err);
17707
17708 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17709 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017710 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017711 ASSERT_VK_SUCCESS(err);
17712
Tony Barbour552f6c02016-12-21 14:34:07 -070017713 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017714 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017715 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17716 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017717 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017718 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017719 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017720 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017721 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017722 resolveRegion.srcOffset.x = 0;
17723 resolveRegion.srcOffset.y = 0;
17724 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017725 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017726 resolveRegion.dstSubresource.mipLevel = 0;
17727 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017728 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017729 resolveRegion.dstOffset.x = 0;
17730 resolveRegion.dstOffset.y = 0;
17731 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017732 resolveRegion.extent.width = 1;
17733 resolveRegion.extent.height = 1;
17734 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017735 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017736 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017737
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017738 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017739
Chia-I Wuf7458c52015-10-26 21:10:41 +080017740 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017741 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017742 vkFreeMemory(m_device->device(), srcMem, NULL);
17743 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017744}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017745
Karl Schultz6addd812016-02-02 17:17:23 -070017746TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017747 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017748 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17749 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017750 // The image format check comes 2nd in validation so we trigger it first,
17751 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017752 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017753
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17755 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017756
Tony Barbour1fa09702017-03-16 12:09:08 -060017757 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017758 auto depth_format = find_depth_stencil_format(m_device);
17759 if (!depth_format) {
17760 return;
17761 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017762
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017763 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017764 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17765 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017766
17767 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017768 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17769 ds_pool_ci.pNext = NULL;
17770 ds_pool_ci.maxSets = 1;
17771 ds_pool_ci.poolSizeCount = 1;
17772 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017773
17774 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017775 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017776 ASSERT_VK_SUCCESS(err);
17777
17778 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017779 dsl_binding.binding = 0;
17780 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17781 dsl_binding.descriptorCount = 1;
17782 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17783 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017784
17785 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017786 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17787 ds_layout_ci.pNext = NULL;
17788 ds_layout_ci.bindingCount = 1;
17789 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017790 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017791 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017792 ASSERT_VK_SUCCESS(err);
17793
17794 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017795 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017796 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017797 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017798 alloc_info.descriptorPool = ds_pool;
17799 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017800 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017801 ASSERT_VK_SUCCESS(err);
17802
Karl Schultz6addd812016-02-02 17:17:23 -070017803 VkImage image_bad;
17804 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017805 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017806 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017807 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017808 const int32_t tex_width = 32;
17809 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017810
17811 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017812 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17813 image_create_info.pNext = NULL;
17814 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17815 image_create_info.format = tex_format_bad;
17816 image_create_info.extent.width = tex_width;
17817 image_create_info.extent.height = tex_height;
17818 image_create_info.extent.depth = 1;
17819 image_create_info.mipLevels = 1;
17820 image_create_info.arrayLayers = 1;
17821 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17822 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017823 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017824 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017825
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017826 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017827 ASSERT_VK_SUCCESS(err);
17828 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017829 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17830 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017831 ASSERT_VK_SUCCESS(err);
17832
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017833 // ---Bind image memory---
17834 VkMemoryRequirements img_mem_reqs;
17835 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17836 VkMemoryAllocateInfo image_alloc_info = {};
17837 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17838 image_alloc_info.pNext = NULL;
17839 image_alloc_info.memoryTypeIndex = 0;
17840 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017841 bool pass =
17842 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 -070017843 ASSERT_TRUE(pass);
17844 VkDeviceMemory mem;
17845 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17846 ASSERT_VK_SUCCESS(err);
17847 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17848 ASSERT_VK_SUCCESS(err);
17849 // -----------------------
17850
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017851 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017852 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017853 image_view_create_info.image = image_bad;
17854 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17855 image_view_create_info.format = tex_format_bad;
17856 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17857 image_view_create_info.subresourceRange.baseMipLevel = 0;
17858 image_view_create_info.subresourceRange.layerCount = 1;
17859 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017860 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017861
17862 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017863 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017864
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017865 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017866
Chia-I Wuf7458c52015-10-26 21:10:41 +080017867 vkDestroyImage(m_device->device(), image_bad, NULL);
17868 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017869 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17870 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017871
17872 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017873}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017874
17875TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017876 TEST_DESCRIPTION(
17877 "Call ClearColorImage w/ a depth|stencil image and "
17878 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017879
Tony Barbour1fa09702017-03-16 12:09:08 -060017880 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017881 auto depth_format = find_depth_stencil_format(m_device);
17882 if (!depth_format) {
17883 return;
17884 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17886
Tony Barbour552f6c02016-12-21 14:34:07 -070017887 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017888
17889 // Color image
17890 VkClearColorValue clear_color;
17891 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17892 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17893 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17894 const int32_t img_width = 32;
17895 const int32_t img_height = 32;
17896 VkImageCreateInfo image_create_info = {};
17897 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17898 image_create_info.pNext = NULL;
17899 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17900 image_create_info.format = color_format;
17901 image_create_info.extent.width = img_width;
17902 image_create_info.extent.height = img_height;
17903 image_create_info.extent.depth = 1;
17904 image_create_info.mipLevels = 1;
17905 image_create_info.arrayLayers = 1;
17906 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17907 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17908 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17909
17910 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017911 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017912
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017913 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017914
17915 // Depth/Stencil image
17916 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017917 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017918 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17919 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017920 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017921 ds_image_create_info.extent.width = 64;
17922 ds_image_create_info.extent.height = 64;
17923 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017924 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 -060017925
17926 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017927 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017928
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017929 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 -060017930
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017932
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017933 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017934 &color_range);
17935
17936 m_errorMonitor->VerifyFound();
17937
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17939 "vkCmdClearColorImage called with "
17940 "image created without "
17941 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017942
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017943 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017944 &color_range);
17945
17946 m_errorMonitor->VerifyFound();
17947
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017948 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17950 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017951
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017952 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17953 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017954
17955 m_errorMonitor->VerifyFound();
17956}
Tobin Ehliscde08892015-09-22 10:11:37 -060017957
Mike Schuchardt35fece12017-03-07 14:40:28 -070017958TEST_F(VkLayerTest, CommandQueueFlags) {
17959 TEST_DESCRIPTION(
17960 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17961 "graphics-only command");
17962
17963 ASSERT_NO_FATAL_FAILURE(Init());
17964
17965 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
17966 if(queueFamilyIndex == UINT32_MAX) {
17967 printf(" Non-graphics queue family not found; skipped.\n");
17968 return;
17969 } else {
17970 // Create command pool on a non-graphics queue
17971 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17972
17973 // Setup command buffer on pool
17974 VkCommandBufferObj command_buffer(m_device, &command_pool);
17975 command_buffer.BeginCommandBuffer();
17976
17977 // Issue a graphics only command
17978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17979 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17980 command_buffer.SetViewport(0, 1, &viewport);
17981 m_errorMonitor->VerifyFound();
17982 }
17983}
17984
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017985// WSI Enabled Tests
17986//
Chris Forbes09368e42016-10-13 11:59:22 +130017987#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017988TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17989
17990#if defined(VK_USE_PLATFORM_XCB_KHR)
17991 VkSurfaceKHR surface = VK_NULL_HANDLE;
17992
17993 VkResult err;
17994 bool pass;
17995 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17996 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17997 // uint32_t swapchain_image_count = 0;
17998 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17999 // uint32_t image_index = 0;
18000 // VkPresentInfoKHR present_info = {};
18001
Tony Barbour1fa09702017-03-16 12:09:08 -060018002 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018003
18004 // Use the create function from one of the VK_KHR_*_surface extension in
18005 // order to create a surface, testing all known errors in the process,
18006 // before successfully creating a surface:
18007 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18009 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18010 pass = (err != VK_SUCCESS);
18011 ASSERT_TRUE(pass);
18012 m_errorMonitor->VerifyFound();
18013
18014 // Next, try to create a surface with the wrong
18015 // VkXcbSurfaceCreateInfoKHR::sType:
18016 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18017 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18018 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18019 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18020 pass = (err != VK_SUCCESS);
18021 ASSERT_TRUE(pass);
18022 m_errorMonitor->VerifyFound();
18023
18024 // Create a native window, and then correctly create a surface:
18025 xcb_connection_t *connection;
18026 xcb_screen_t *screen;
18027 xcb_window_t xcb_window;
18028 xcb_intern_atom_reply_t *atom_wm_delete_window;
18029
18030 const xcb_setup_t *setup;
18031 xcb_screen_iterator_t iter;
18032 int scr;
18033 uint32_t value_mask, value_list[32];
18034 int width = 1;
18035 int height = 1;
18036
18037 connection = xcb_connect(NULL, &scr);
18038 ASSERT_TRUE(connection != NULL);
18039 setup = xcb_get_setup(connection);
18040 iter = xcb_setup_roots_iterator(setup);
18041 while (scr-- > 0)
18042 xcb_screen_next(&iter);
18043 screen = iter.data;
18044
18045 xcb_window = xcb_generate_id(connection);
18046
18047 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18048 value_list[0] = screen->black_pixel;
18049 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18050
18051 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18052 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18053
18054 /* Magic code that will send notification when window is destroyed */
18055 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18056 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18057
18058 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18059 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18060 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18061 free(reply);
18062
18063 xcb_map_window(connection, xcb_window);
18064
18065 // Force the x/y coordinates to 100,100 results are identical in consecutive
18066 // runs
18067 const uint32_t coords[] = { 100, 100 };
18068 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18069
18070 // Finally, try to correctly create a surface:
18071 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18072 xcb_create_info.pNext = NULL;
18073 xcb_create_info.flags = 0;
18074 xcb_create_info.connection = connection;
18075 xcb_create_info.window = xcb_window;
18076 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18077 pass = (err == VK_SUCCESS);
18078 ASSERT_TRUE(pass);
18079
18080 // Check if surface supports presentation:
18081
18082 // 1st, do so without having queried the queue families:
18083 VkBool32 supported = false;
18084 // TODO: Get the following error to come out:
18085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18086 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18087 "function");
18088 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18089 pass = (err != VK_SUCCESS);
18090 // ASSERT_TRUE(pass);
18091 // m_errorMonitor->VerifyFound();
18092
18093 // Next, query a queue family index that's too large:
18094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18095 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18096 pass = (err != VK_SUCCESS);
18097 ASSERT_TRUE(pass);
18098 m_errorMonitor->VerifyFound();
18099
18100 // Finally, do so correctly:
18101 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18102 // SUPPORTED
18103 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18104 pass = (err == VK_SUCCESS);
18105 ASSERT_TRUE(pass);
18106
18107 // Before proceeding, try to create a swapchain without having called
18108 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18109 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18110 swapchain_create_info.pNext = NULL;
18111 swapchain_create_info.flags = 0;
18112 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18113 swapchain_create_info.surface = surface;
18114 swapchain_create_info.imageArrayLayers = 1;
18115 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18116 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18117 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18118 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18119 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18120 pass = (err != VK_SUCCESS);
18121 ASSERT_TRUE(pass);
18122 m_errorMonitor->VerifyFound();
18123
18124 // Get the surface capabilities:
18125 VkSurfaceCapabilitiesKHR surface_capabilities;
18126
18127 // Do so correctly (only error logged by this entrypoint is if the
18128 // extension isn't enabled):
18129 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18130 pass = (err == VK_SUCCESS);
18131 ASSERT_TRUE(pass);
18132
18133 // Get the surface formats:
18134 uint32_t surface_format_count;
18135
18136 // First, try without a pointer to surface_format_count:
18137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18138 "specified as NULL");
18139 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18140 pass = (err == VK_SUCCESS);
18141 ASSERT_TRUE(pass);
18142 m_errorMonitor->VerifyFound();
18143
18144 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18145 // correctly done a 1st try (to get the count):
18146 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18147 surface_format_count = 0;
18148 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18149 pass = (err == VK_SUCCESS);
18150 ASSERT_TRUE(pass);
18151 m_errorMonitor->VerifyFound();
18152
18153 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18154 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18155 pass = (err == VK_SUCCESS);
18156 ASSERT_TRUE(pass);
18157
18158 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18159 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18160
18161 // Next, do a 2nd try with surface_format_count being set too high:
18162 surface_format_count += 5;
18163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18164 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18165 pass = (err == VK_SUCCESS);
18166 ASSERT_TRUE(pass);
18167 m_errorMonitor->VerifyFound();
18168
18169 // Finally, do a correct 1st and 2nd try:
18170 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18171 pass = (err == VK_SUCCESS);
18172 ASSERT_TRUE(pass);
18173 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18174 pass = (err == VK_SUCCESS);
18175 ASSERT_TRUE(pass);
18176
18177 // Get the surface present modes:
18178 uint32_t surface_present_mode_count;
18179
18180 // First, try without a pointer to surface_format_count:
18181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18182 "specified as NULL");
18183
18184 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18185 pass = (err == VK_SUCCESS);
18186 ASSERT_TRUE(pass);
18187 m_errorMonitor->VerifyFound();
18188
18189 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18190 // correctly done a 1st try (to get the count):
18191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18192 surface_present_mode_count = 0;
18193 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18194 (VkPresentModeKHR *)&surface_present_mode_count);
18195 pass = (err == VK_SUCCESS);
18196 ASSERT_TRUE(pass);
18197 m_errorMonitor->VerifyFound();
18198
18199 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18200 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18201 pass = (err == VK_SUCCESS);
18202 ASSERT_TRUE(pass);
18203
18204 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18205 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18206
18207 // Next, do a 2nd try with surface_format_count being set too high:
18208 surface_present_mode_count += 5;
18209 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18210 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18211 pass = (err == VK_SUCCESS);
18212 ASSERT_TRUE(pass);
18213 m_errorMonitor->VerifyFound();
18214
18215 // Finally, do a correct 1st and 2nd try:
18216 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18217 pass = (err == VK_SUCCESS);
18218 ASSERT_TRUE(pass);
18219 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18220 pass = (err == VK_SUCCESS);
18221 ASSERT_TRUE(pass);
18222
18223 // Create a swapchain:
18224
18225 // First, try without a pointer to swapchain_create_info:
18226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18227 "specified as NULL");
18228
18229 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18230 pass = (err != VK_SUCCESS);
18231 ASSERT_TRUE(pass);
18232 m_errorMonitor->VerifyFound();
18233
18234 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18235 // sType:
18236 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18238
18239 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18240 pass = (err != VK_SUCCESS);
18241 ASSERT_TRUE(pass);
18242 m_errorMonitor->VerifyFound();
18243
18244 // Next, call with a NULL swapchain pointer:
18245 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18246 swapchain_create_info.pNext = NULL;
18247 swapchain_create_info.flags = 0;
18248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18249 "specified as NULL");
18250
18251 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18252 pass = (err != VK_SUCCESS);
18253 ASSERT_TRUE(pass);
18254 m_errorMonitor->VerifyFound();
18255
18256 // TODO: Enhance swapchain layer so that
18257 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18258
18259 // Next, call with a queue family index that's too large:
18260 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18261 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18262 swapchain_create_info.queueFamilyIndexCount = 2;
18263 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18265 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18266 pass = (err != VK_SUCCESS);
18267 ASSERT_TRUE(pass);
18268 m_errorMonitor->VerifyFound();
18269
18270 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18271 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18272 swapchain_create_info.queueFamilyIndexCount = 1;
18273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18274 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18275 "pCreateInfo->pQueueFamilyIndices).");
18276 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18277 pass = (err != VK_SUCCESS);
18278 ASSERT_TRUE(pass);
18279 m_errorMonitor->VerifyFound();
18280
18281 // Next, call with an invalid imageSharingMode:
18282 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18283 swapchain_create_info.queueFamilyIndexCount = 1;
18284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18285 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18286 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18287 pass = (err != VK_SUCCESS);
18288 ASSERT_TRUE(pass);
18289 m_errorMonitor->VerifyFound();
18290 // Fix for the future:
18291 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18292 // SUPPORTED
18293 swapchain_create_info.queueFamilyIndexCount = 0;
18294 queueFamilyIndex[0] = 0;
18295 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18296
18297 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18298 // Get the images from a swapchain:
18299 // Acquire an image from a swapchain:
18300 // Present an image to a swapchain:
18301 // Destroy the swapchain:
18302
18303 // TODOs:
18304 //
18305 // - Try destroying the device without first destroying the swapchain
18306 //
18307 // - Try destroying the device without first destroying the surface
18308 //
18309 // - Try destroying the surface without first destroying the swapchain
18310
18311 // Destroy the surface:
18312 vkDestroySurfaceKHR(instance(), surface, NULL);
18313
18314 // Tear down the window:
18315 xcb_destroy_window(connection, xcb_window);
18316 xcb_disconnect(connection);
18317
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018318#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018319 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018320#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018321}
Chris Forbes09368e42016-10-13 11:59:22 +130018322#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018323
18324//
18325// POSITIVE VALIDATION TESTS
18326//
18327// These tests do not expect to encounter ANY validation errors pass only if this is true
18328
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018329TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18330 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018331 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018332 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18333
18334 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18335 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018336 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018337 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18338 command_buffer_allocate_info.commandBufferCount = 1;
18339
18340 VkCommandBuffer secondary_command_buffer;
18341 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18342 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18343 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18344 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18345 command_buffer_inheritance_info.renderPass = m_renderPass;
18346 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18347
18348 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18349 command_buffer_begin_info.flags =
18350 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18351 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18352
18353 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18354 VkClearAttachment color_attachment;
18355 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18356 color_attachment.clearValue.color.float32[0] = 0;
18357 color_attachment.clearValue.color.float32[1] = 0;
18358 color_attachment.clearValue.color.float32[2] = 0;
18359 color_attachment.clearValue.color.float32[3] = 0;
18360 color_attachment.colorAttachment = 0;
18361 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18362 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18363}
18364
Tobin Ehlise0006882016-11-03 10:14:28 -060018365TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018366 TEST_DESCRIPTION(
18367 "Perform an image layout transition in a secondary command buffer followed "
18368 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018369 VkResult err;
18370 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018371 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070018372 auto depth_format = find_depth_stencil_format(m_device);
18373 if (!depth_format) {
18374 return;
18375 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18377 // Allocate a secondary and primary cmd buffer
18378 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18379 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018380 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018381 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18382 command_buffer_allocate_info.commandBufferCount = 1;
18383
18384 VkCommandBuffer secondary_command_buffer;
18385 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18386 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18387 VkCommandBuffer primary_command_buffer;
18388 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18389 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18390 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18391 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18392 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18393 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18394 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18395
18396 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18397 ASSERT_VK_SUCCESS(err);
18398 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018399 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 -060018400 ASSERT_TRUE(image.initialized());
18401 VkImageMemoryBarrier img_barrier = {};
18402 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18403 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18404 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18405 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18406 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18407 img_barrier.image = image.handle();
18408 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18409 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18410 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18411 img_barrier.subresourceRange.baseArrayLayer = 0;
18412 img_barrier.subresourceRange.baseMipLevel = 0;
18413 img_barrier.subresourceRange.layerCount = 1;
18414 img_barrier.subresourceRange.levelCount = 1;
18415 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18416 0, nullptr, 1, &img_barrier);
18417 err = vkEndCommandBuffer(secondary_command_buffer);
18418 ASSERT_VK_SUCCESS(err);
18419
18420 // Now update primary cmd buffer to execute secondary and transitions image
18421 command_buffer_begin_info.pInheritanceInfo = nullptr;
18422 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18423 ASSERT_VK_SUCCESS(err);
18424 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18425 VkImageMemoryBarrier img_barrier2 = {};
18426 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18427 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18428 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18429 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18430 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18431 img_barrier2.image = image.handle();
18432 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18433 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18434 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18435 img_barrier2.subresourceRange.baseArrayLayer = 0;
18436 img_barrier2.subresourceRange.baseMipLevel = 0;
18437 img_barrier2.subresourceRange.layerCount = 1;
18438 img_barrier2.subresourceRange.levelCount = 1;
18439 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18440 nullptr, 1, &img_barrier2);
18441 err = vkEndCommandBuffer(primary_command_buffer);
18442 ASSERT_VK_SUCCESS(err);
18443 VkSubmitInfo submit_info = {};
18444 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18445 submit_info.commandBufferCount = 1;
18446 submit_info.pCommandBuffers = &primary_command_buffer;
18447 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18448 ASSERT_VK_SUCCESS(err);
18449 m_errorMonitor->VerifyNotFound();
18450 err = vkDeviceWaitIdle(m_device->device());
18451 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018452 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18453 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018454}
18455
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018456// This is a positive test. No failures are expected.
18457TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018458 TEST_DESCRIPTION(
18459 "Ensure that the vkUpdateDescriptorSets validation code "
18460 "is ignoring VkWriteDescriptorSet members that are not "
18461 "related to the descriptor type specified by "
18462 "VkWriteDescriptorSet::descriptorType. Correct "
18463 "validation behavior will result in the test running to "
18464 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018465
18466 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18467
Tony Barbour1fa09702017-03-16 12:09:08 -060018468 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018469
18470 // Image Case
18471 {
18472 m_errorMonitor->ExpectSuccess();
18473
18474 VkImage image;
18475 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18476 const int32_t tex_width = 32;
18477 const int32_t tex_height = 32;
18478 VkImageCreateInfo image_create_info = {};
18479 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18480 image_create_info.pNext = NULL;
18481 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18482 image_create_info.format = tex_format;
18483 image_create_info.extent.width = tex_width;
18484 image_create_info.extent.height = tex_height;
18485 image_create_info.extent.depth = 1;
18486 image_create_info.mipLevels = 1;
18487 image_create_info.arrayLayers = 1;
18488 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18489 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18490 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18491 image_create_info.flags = 0;
18492 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18493 ASSERT_VK_SUCCESS(err);
18494
18495 VkMemoryRequirements memory_reqs;
18496 VkDeviceMemory image_memory;
18497 bool pass;
18498 VkMemoryAllocateInfo memory_info = {};
18499 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18500 memory_info.pNext = NULL;
18501 memory_info.allocationSize = 0;
18502 memory_info.memoryTypeIndex = 0;
18503 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18504 memory_info.allocationSize = memory_reqs.size;
18505 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18506 ASSERT_TRUE(pass);
18507 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18508 ASSERT_VK_SUCCESS(err);
18509 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18510 ASSERT_VK_SUCCESS(err);
18511
18512 VkImageViewCreateInfo image_view_create_info = {};
18513 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18514 image_view_create_info.image = image;
18515 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18516 image_view_create_info.format = tex_format;
18517 image_view_create_info.subresourceRange.layerCount = 1;
18518 image_view_create_info.subresourceRange.baseMipLevel = 0;
18519 image_view_create_info.subresourceRange.levelCount = 1;
18520 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18521
18522 VkImageView view;
18523 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18524 ASSERT_VK_SUCCESS(err);
18525
18526 VkDescriptorPoolSize ds_type_count = {};
18527 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18528 ds_type_count.descriptorCount = 1;
18529
18530 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18531 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18532 ds_pool_ci.pNext = NULL;
18533 ds_pool_ci.maxSets = 1;
18534 ds_pool_ci.poolSizeCount = 1;
18535 ds_pool_ci.pPoolSizes = &ds_type_count;
18536
18537 VkDescriptorPool ds_pool;
18538 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18539 ASSERT_VK_SUCCESS(err);
18540
18541 VkDescriptorSetLayoutBinding dsl_binding = {};
18542 dsl_binding.binding = 0;
18543 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18544 dsl_binding.descriptorCount = 1;
18545 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18546 dsl_binding.pImmutableSamplers = NULL;
18547
18548 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18549 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18550 ds_layout_ci.pNext = NULL;
18551 ds_layout_ci.bindingCount = 1;
18552 ds_layout_ci.pBindings = &dsl_binding;
18553 VkDescriptorSetLayout ds_layout;
18554 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18555 ASSERT_VK_SUCCESS(err);
18556
18557 VkDescriptorSet descriptor_set;
18558 VkDescriptorSetAllocateInfo alloc_info = {};
18559 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18560 alloc_info.descriptorSetCount = 1;
18561 alloc_info.descriptorPool = ds_pool;
18562 alloc_info.pSetLayouts = &ds_layout;
18563 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18564 ASSERT_VK_SUCCESS(err);
18565
18566 VkDescriptorImageInfo image_info = {};
18567 image_info.imageView = view;
18568 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18569
18570 VkWriteDescriptorSet descriptor_write;
18571 memset(&descriptor_write, 0, sizeof(descriptor_write));
18572 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18573 descriptor_write.dstSet = descriptor_set;
18574 descriptor_write.dstBinding = 0;
18575 descriptor_write.descriptorCount = 1;
18576 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18577 descriptor_write.pImageInfo = &image_info;
18578
18579 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18580 // be
18581 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18582 // This will most likely produce a crash if the parameter_validation
18583 // layer
18584 // does not correctly ignore pBufferInfo.
18585 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18586 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18587
18588 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18589
18590 m_errorMonitor->VerifyNotFound();
18591
18592 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18593 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18594 vkDestroyImageView(m_device->device(), view, NULL);
18595 vkDestroyImage(m_device->device(), image, NULL);
18596 vkFreeMemory(m_device->device(), image_memory, NULL);
18597 }
18598
18599 // Buffer Case
18600 {
18601 m_errorMonitor->ExpectSuccess();
18602
18603 VkBuffer buffer;
18604 uint32_t queue_family_index = 0;
18605 VkBufferCreateInfo buffer_create_info = {};
18606 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18607 buffer_create_info.size = 1024;
18608 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18609 buffer_create_info.queueFamilyIndexCount = 1;
18610 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18611
18612 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18613 ASSERT_VK_SUCCESS(err);
18614
18615 VkMemoryRequirements memory_reqs;
18616 VkDeviceMemory buffer_memory;
18617 bool pass;
18618 VkMemoryAllocateInfo memory_info = {};
18619 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18620 memory_info.pNext = NULL;
18621 memory_info.allocationSize = 0;
18622 memory_info.memoryTypeIndex = 0;
18623
18624 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18625 memory_info.allocationSize = memory_reqs.size;
18626 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18627 ASSERT_TRUE(pass);
18628
18629 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18630 ASSERT_VK_SUCCESS(err);
18631 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18632 ASSERT_VK_SUCCESS(err);
18633
18634 VkDescriptorPoolSize ds_type_count = {};
18635 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18636 ds_type_count.descriptorCount = 1;
18637
18638 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18639 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18640 ds_pool_ci.pNext = NULL;
18641 ds_pool_ci.maxSets = 1;
18642 ds_pool_ci.poolSizeCount = 1;
18643 ds_pool_ci.pPoolSizes = &ds_type_count;
18644
18645 VkDescriptorPool ds_pool;
18646 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18647 ASSERT_VK_SUCCESS(err);
18648
18649 VkDescriptorSetLayoutBinding dsl_binding = {};
18650 dsl_binding.binding = 0;
18651 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18652 dsl_binding.descriptorCount = 1;
18653 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18654 dsl_binding.pImmutableSamplers = NULL;
18655
18656 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18657 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18658 ds_layout_ci.pNext = NULL;
18659 ds_layout_ci.bindingCount = 1;
18660 ds_layout_ci.pBindings = &dsl_binding;
18661 VkDescriptorSetLayout ds_layout;
18662 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18663 ASSERT_VK_SUCCESS(err);
18664
18665 VkDescriptorSet descriptor_set;
18666 VkDescriptorSetAllocateInfo alloc_info = {};
18667 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18668 alloc_info.descriptorSetCount = 1;
18669 alloc_info.descriptorPool = ds_pool;
18670 alloc_info.pSetLayouts = &ds_layout;
18671 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18672 ASSERT_VK_SUCCESS(err);
18673
18674 VkDescriptorBufferInfo buffer_info = {};
18675 buffer_info.buffer = buffer;
18676 buffer_info.offset = 0;
18677 buffer_info.range = 1024;
18678
18679 VkWriteDescriptorSet descriptor_write;
18680 memset(&descriptor_write, 0, sizeof(descriptor_write));
18681 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18682 descriptor_write.dstSet = descriptor_set;
18683 descriptor_write.dstBinding = 0;
18684 descriptor_write.descriptorCount = 1;
18685 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18686 descriptor_write.pBufferInfo = &buffer_info;
18687
18688 // Set pImageInfo and pTexelBufferView to invalid values, which should
18689 // be
18690 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18691 // This will most likely produce a crash if the parameter_validation
18692 // layer
18693 // does not correctly ignore pImageInfo.
18694 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18695 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18696
18697 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18698
18699 m_errorMonitor->VerifyNotFound();
18700
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018701 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18702 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18703 vkDestroyBuffer(m_device->device(), buffer, NULL);
18704 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18705 }
18706
18707 // Texel Buffer Case
18708 {
18709 m_errorMonitor->ExpectSuccess();
18710
18711 VkBuffer buffer;
18712 uint32_t queue_family_index = 0;
18713 VkBufferCreateInfo buffer_create_info = {};
18714 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18715 buffer_create_info.size = 1024;
18716 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18717 buffer_create_info.queueFamilyIndexCount = 1;
18718 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18719
18720 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18721 ASSERT_VK_SUCCESS(err);
18722
18723 VkMemoryRequirements memory_reqs;
18724 VkDeviceMemory buffer_memory;
18725 bool pass;
18726 VkMemoryAllocateInfo memory_info = {};
18727 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18728 memory_info.pNext = NULL;
18729 memory_info.allocationSize = 0;
18730 memory_info.memoryTypeIndex = 0;
18731
18732 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18733 memory_info.allocationSize = memory_reqs.size;
18734 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18735 ASSERT_TRUE(pass);
18736
18737 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18738 ASSERT_VK_SUCCESS(err);
18739 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18740 ASSERT_VK_SUCCESS(err);
18741
18742 VkBufferViewCreateInfo buff_view_ci = {};
18743 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18744 buff_view_ci.buffer = buffer;
18745 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18746 buff_view_ci.range = VK_WHOLE_SIZE;
18747 VkBufferView buffer_view;
18748 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18749
18750 VkDescriptorPoolSize ds_type_count = {};
18751 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18752 ds_type_count.descriptorCount = 1;
18753
18754 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18755 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18756 ds_pool_ci.pNext = NULL;
18757 ds_pool_ci.maxSets = 1;
18758 ds_pool_ci.poolSizeCount = 1;
18759 ds_pool_ci.pPoolSizes = &ds_type_count;
18760
18761 VkDescriptorPool ds_pool;
18762 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18763 ASSERT_VK_SUCCESS(err);
18764
18765 VkDescriptorSetLayoutBinding dsl_binding = {};
18766 dsl_binding.binding = 0;
18767 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18768 dsl_binding.descriptorCount = 1;
18769 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18770 dsl_binding.pImmutableSamplers = NULL;
18771
18772 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18773 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18774 ds_layout_ci.pNext = NULL;
18775 ds_layout_ci.bindingCount = 1;
18776 ds_layout_ci.pBindings = &dsl_binding;
18777 VkDescriptorSetLayout ds_layout;
18778 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18779 ASSERT_VK_SUCCESS(err);
18780
18781 VkDescriptorSet descriptor_set;
18782 VkDescriptorSetAllocateInfo alloc_info = {};
18783 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18784 alloc_info.descriptorSetCount = 1;
18785 alloc_info.descriptorPool = ds_pool;
18786 alloc_info.pSetLayouts = &ds_layout;
18787 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18788 ASSERT_VK_SUCCESS(err);
18789
18790 VkWriteDescriptorSet descriptor_write;
18791 memset(&descriptor_write, 0, sizeof(descriptor_write));
18792 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18793 descriptor_write.dstSet = descriptor_set;
18794 descriptor_write.dstBinding = 0;
18795 descriptor_write.descriptorCount = 1;
18796 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18797 descriptor_write.pTexelBufferView = &buffer_view;
18798
18799 // Set pImageInfo and pBufferInfo to invalid values, which should be
18800 // ignored for descriptorType ==
18801 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18802 // This will most likely produce a crash if the parameter_validation
18803 // layer
18804 // does not correctly ignore pImageInfo and pBufferInfo.
18805 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18806 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18807
18808 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18809
18810 m_errorMonitor->VerifyNotFound();
18811
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018812 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18813 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18814 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18815 vkDestroyBuffer(m_device->device(), buffer, NULL);
18816 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18817 }
18818}
18819
Tobin Ehlisf7428442016-10-25 07:58:24 -060018820TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18821 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18822
Tony Barbour1fa09702017-03-16 12:09:08 -060018823 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018824 // Create layout where two binding #s are "1"
18825 static const uint32_t NUM_BINDINGS = 3;
18826 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18827 dsl_binding[0].binding = 1;
18828 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18829 dsl_binding[0].descriptorCount = 1;
18830 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18831 dsl_binding[0].pImmutableSamplers = NULL;
18832 dsl_binding[1].binding = 0;
18833 dsl_binding[1].descriptorCount = 1;
18834 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18835 dsl_binding[1].descriptorCount = 1;
18836 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18837 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018838 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018839 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18840 dsl_binding[2].descriptorCount = 1;
18841 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18842 dsl_binding[2].pImmutableSamplers = NULL;
18843
18844 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18845 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18846 ds_layout_ci.pNext = NULL;
18847 ds_layout_ci.bindingCount = NUM_BINDINGS;
18848 ds_layout_ci.pBindings = dsl_binding;
18849 VkDescriptorSetLayout ds_layout;
18850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18851 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18852 m_errorMonitor->VerifyFound();
18853}
18854
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018855TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018856 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18857
Tony Barbour1fa09702017-03-16 12:09:08 -060018858 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018859
Tony Barbour552f6c02016-12-21 14:34:07 -070018860 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018861
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018862 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18863
18864 {
18865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18866 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18867 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18868 m_errorMonitor->VerifyFound();
18869 }
18870
18871 {
18872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18873 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18874 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18875 m_errorMonitor->VerifyFound();
18876 }
18877
18878 {
18879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18880 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18881 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18882 m_errorMonitor->VerifyFound();
18883 }
18884
18885 {
18886 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18887 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18888 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18889 m_errorMonitor->VerifyFound();
18890 }
18891
18892 {
18893 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18894 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18895 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18896 m_errorMonitor->VerifyFound();
18897 }
18898
18899 {
18900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18901 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18902 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18903 m_errorMonitor->VerifyFound();
18904 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018905
18906 {
18907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18908 VkRect2D scissor = {{-1, 0}, {16, 16}};
18909 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18910 m_errorMonitor->VerifyFound();
18911 }
18912
18913 {
18914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18915 VkRect2D scissor = {{0, -2}, {16, 16}};
18916 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18917 m_errorMonitor->VerifyFound();
18918 }
18919
18920 {
18921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18922 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18923 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18924 m_errorMonitor->VerifyFound();
18925 }
18926
18927 {
18928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18929 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18930 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18931 m_errorMonitor->VerifyFound();
18932 }
18933
Tony Barbour552f6c02016-12-21 14:34:07 -070018934 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018935}
18936
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018937// This is a positive test. No failures are expected.
18938TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18939 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18940 VkResult err;
18941
Tony Barbour1fa09702017-03-16 12:09:08 -060018942 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018943 m_errorMonitor->ExpectSuccess();
18944 VkDescriptorPoolSize ds_type_count = {};
18945 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18946 ds_type_count.descriptorCount = 2;
18947
18948 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18949 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18950 ds_pool_ci.pNext = NULL;
18951 ds_pool_ci.maxSets = 1;
18952 ds_pool_ci.poolSizeCount = 1;
18953 ds_pool_ci.pPoolSizes = &ds_type_count;
18954
18955 VkDescriptorPool ds_pool;
18956 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18957 ASSERT_VK_SUCCESS(err);
18958
18959 // Create layout with two uniform buffer descriptors w/ empty binding between them
18960 static const uint32_t NUM_BINDINGS = 3;
18961 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18962 dsl_binding[0].binding = 0;
18963 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18964 dsl_binding[0].descriptorCount = 1;
18965 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18966 dsl_binding[0].pImmutableSamplers = NULL;
18967 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018968 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018969 dsl_binding[2].binding = 2;
18970 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18971 dsl_binding[2].descriptorCount = 1;
18972 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18973 dsl_binding[2].pImmutableSamplers = NULL;
18974
18975 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18976 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18977 ds_layout_ci.pNext = NULL;
18978 ds_layout_ci.bindingCount = NUM_BINDINGS;
18979 ds_layout_ci.pBindings = dsl_binding;
18980 VkDescriptorSetLayout ds_layout;
18981 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18982 ASSERT_VK_SUCCESS(err);
18983
18984 VkDescriptorSet descriptor_set = {};
18985 VkDescriptorSetAllocateInfo alloc_info = {};
18986 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18987 alloc_info.descriptorSetCount = 1;
18988 alloc_info.descriptorPool = ds_pool;
18989 alloc_info.pSetLayouts = &ds_layout;
18990 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18991 ASSERT_VK_SUCCESS(err);
18992
18993 // Create a buffer to be used for update
18994 VkBufferCreateInfo buff_ci = {};
18995 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18996 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18997 buff_ci.size = 256;
18998 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18999 VkBuffer buffer;
19000 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
19001 ASSERT_VK_SUCCESS(err);
19002 // Have to bind memory to buffer before descriptor update
19003 VkMemoryAllocateInfo mem_alloc = {};
19004 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19005 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019006 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019007 mem_alloc.memoryTypeIndex = 0;
19008
19009 VkMemoryRequirements mem_reqs;
19010 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19011 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19012 if (!pass) {
19013 vkDestroyBuffer(m_device->device(), buffer, NULL);
19014 return;
19015 }
19016
19017 VkDeviceMemory mem;
19018 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19019 ASSERT_VK_SUCCESS(err);
19020 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19021 ASSERT_VK_SUCCESS(err);
19022
19023 // Only update the descriptor at binding 2
19024 VkDescriptorBufferInfo buff_info = {};
19025 buff_info.buffer = buffer;
19026 buff_info.offset = 0;
19027 buff_info.range = VK_WHOLE_SIZE;
19028 VkWriteDescriptorSet descriptor_write = {};
19029 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19030 descriptor_write.dstBinding = 2;
19031 descriptor_write.descriptorCount = 1;
19032 descriptor_write.pTexelBufferView = nullptr;
19033 descriptor_write.pBufferInfo = &buff_info;
19034 descriptor_write.pImageInfo = nullptr;
19035 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19036 descriptor_write.dstSet = descriptor_set;
19037
19038 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19039
19040 m_errorMonitor->VerifyNotFound();
19041 // Cleanup
19042 vkFreeMemory(m_device->device(), mem, NULL);
19043 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19044 vkDestroyBuffer(m_device->device(), buffer, NULL);
19045 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19046}
19047
19048// This is a positive test. No failures are expected.
19049TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19050 VkResult err;
19051 bool pass;
19052
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019053 TEST_DESCRIPTION(
19054 "Create a buffer, allocate memory, bind memory, destroy "
19055 "the buffer, create an image, and bind the same memory to "
19056 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019057
19058 m_errorMonitor->ExpectSuccess();
19059
Tony Barbour1fa09702017-03-16 12:09:08 -060019060 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019061
19062 VkBuffer buffer;
19063 VkImage image;
19064 VkDeviceMemory mem;
19065 VkMemoryRequirements mem_reqs;
19066
19067 VkBufferCreateInfo buf_info = {};
19068 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19069 buf_info.pNext = NULL;
19070 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19071 buf_info.size = 256;
19072 buf_info.queueFamilyIndexCount = 0;
19073 buf_info.pQueueFamilyIndices = NULL;
19074 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19075 buf_info.flags = 0;
19076 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19077 ASSERT_VK_SUCCESS(err);
19078
19079 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19080
19081 VkMemoryAllocateInfo alloc_info = {};
19082 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19083 alloc_info.pNext = NULL;
19084 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019085
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019086 // Ensure memory is big enough for both bindings
19087 alloc_info.allocationSize = 0x10000;
19088
19089 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19090 if (!pass) {
19091 vkDestroyBuffer(m_device->device(), buffer, NULL);
19092 return;
19093 }
19094
19095 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19096 ASSERT_VK_SUCCESS(err);
19097
19098 uint8_t *pData;
19099 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19100 ASSERT_VK_SUCCESS(err);
19101
19102 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19103
19104 vkUnmapMemory(m_device->device(), mem);
19105
19106 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19107 ASSERT_VK_SUCCESS(err);
19108
19109 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19110 // memory. In fact, it was never used by the GPU.
19111 // Just be be sure, wait for idle.
19112 vkDestroyBuffer(m_device->device(), buffer, NULL);
19113 vkDeviceWaitIdle(m_device->device());
19114
Tobin Ehlis6a005702016-12-28 15:25:56 -070019115 // Use optimal as some platforms report linear support but then fail image creation
19116 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19117 VkImageFormatProperties image_format_properties;
19118 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19119 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19120 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019121 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019122 vkFreeMemory(m_device->device(), mem, NULL);
19123 return;
19124 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019125 VkImageCreateInfo image_create_info = {};
19126 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19127 image_create_info.pNext = NULL;
19128 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19129 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19130 image_create_info.extent.width = 64;
19131 image_create_info.extent.height = 64;
19132 image_create_info.extent.depth = 1;
19133 image_create_info.mipLevels = 1;
19134 image_create_info.arrayLayers = 1;
19135 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019136 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019137 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19138 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19139 image_create_info.queueFamilyIndexCount = 0;
19140 image_create_info.pQueueFamilyIndices = NULL;
19141 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19142 image_create_info.flags = 0;
19143
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019144 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019145 * to be textures or it will be the staging image if they are not.
19146 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019147 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19148 ASSERT_VK_SUCCESS(err);
19149
19150 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19151
Tobin Ehlis6a005702016-12-28 15:25:56 -070019152 VkMemoryAllocateInfo mem_alloc = {};
19153 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19154 mem_alloc.pNext = NULL;
19155 mem_alloc.allocationSize = 0;
19156 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019157 mem_alloc.allocationSize = mem_reqs.size;
19158
19159 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19160 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019161 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019162 vkDestroyImage(m_device->device(), image, NULL);
19163 return;
19164 }
19165
19166 // VALIDATION FAILURE:
19167 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19168 ASSERT_VK_SUCCESS(err);
19169
19170 m_errorMonitor->VerifyNotFound();
19171
19172 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019173 vkDestroyImage(m_device->device(), image, NULL);
19174}
19175
Tony Barbourab713912017-02-02 14:17:35 -070019176// This is a positive test. No failures are expected.
19177TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19178 VkResult err;
19179
19180 TEST_DESCRIPTION(
19181 "Call all applicable destroy and free routines with NULL"
19182 "handles, expecting no validation errors");
19183
19184 m_errorMonitor->ExpectSuccess();
19185
Tony Barbour1fa09702017-03-16 12:09:08 -060019186 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019187 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19188 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19189 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19190 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19191 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19192 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19193 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19194 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19195 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19196 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19197 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19198 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19199 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19200 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19201 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19202 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19203 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19204 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19205 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19206 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19207
19208 VkCommandPool command_pool;
19209 VkCommandPoolCreateInfo pool_create_info{};
19210 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19211 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19212 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19213 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19214 VkCommandBuffer command_buffers[3] = {};
19215 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19216 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19217 command_buffer_allocate_info.commandPool = command_pool;
19218 command_buffer_allocate_info.commandBufferCount = 1;
19219 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19220 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19221 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19222 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19223
19224 VkDescriptorPoolSize ds_type_count = {};
19225 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19226 ds_type_count.descriptorCount = 1;
19227
19228 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19229 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19230 ds_pool_ci.pNext = NULL;
19231 ds_pool_ci.maxSets = 1;
19232 ds_pool_ci.poolSizeCount = 1;
19233 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19234 ds_pool_ci.pPoolSizes = &ds_type_count;
19235
19236 VkDescriptorPool ds_pool;
19237 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19238 ASSERT_VK_SUCCESS(err);
19239
19240 VkDescriptorSetLayoutBinding dsl_binding = {};
19241 dsl_binding.binding = 2;
19242 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19243 dsl_binding.descriptorCount = 1;
19244 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19245 dsl_binding.pImmutableSamplers = NULL;
19246 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19247 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19248 ds_layout_ci.pNext = NULL;
19249 ds_layout_ci.bindingCount = 1;
19250 ds_layout_ci.pBindings = &dsl_binding;
19251 VkDescriptorSetLayout ds_layout;
19252 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19253 ASSERT_VK_SUCCESS(err);
19254
19255 VkDescriptorSet descriptor_sets[3] = {};
19256 VkDescriptorSetAllocateInfo alloc_info = {};
19257 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19258 alloc_info.descriptorSetCount = 1;
19259 alloc_info.descriptorPool = ds_pool;
19260 alloc_info.pSetLayouts = &ds_layout;
19261 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19262 ASSERT_VK_SUCCESS(err);
19263 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19264 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19265 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19266
19267 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19268
19269 m_errorMonitor->VerifyNotFound();
19270}
19271
Tony Barbour626994c2017-02-08 15:29:37 -070019272TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019273 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019274
19275 m_errorMonitor->ExpectSuccess();
19276
Tony Barbour1fa09702017-03-16 12:09:08 -060019277 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019278 VkCommandBuffer cmd_bufs[4];
19279 VkCommandBufferAllocateInfo alloc_info;
19280 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19281 alloc_info.pNext = NULL;
19282 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019283 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019284 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19285 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19286 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019287 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19288 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19289 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019290 ASSERT_TRUE(image.initialized());
19291 VkCommandBufferBeginInfo cb_binfo;
19292 cb_binfo.pNext = NULL;
19293 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19294 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19295 cb_binfo.flags = 0;
19296 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19297 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19298 VkImageMemoryBarrier img_barrier = {};
19299 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19300 img_barrier.pNext = NULL;
19301 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19302 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19303 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19304 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19305 img_barrier.image = image.handle();
19306 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19307 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19308 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19309 img_barrier.subresourceRange.baseArrayLayer = 0;
19310 img_barrier.subresourceRange.baseMipLevel = 0;
19311 img_barrier.subresourceRange.layerCount = 1;
19312 img_barrier.subresourceRange.levelCount = 1;
19313 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19314 &img_barrier);
19315 vkEndCommandBuffer(cmd_bufs[0]);
19316 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19317 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19318 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19319 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19320 &img_barrier);
19321 vkEndCommandBuffer(cmd_bufs[1]);
19322 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19323 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19324 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19325 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19326 &img_barrier);
19327 vkEndCommandBuffer(cmd_bufs[2]);
19328 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19329 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19330 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19331 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19332 &img_barrier);
19333 vkEndCommandBuffer(cmd_bufs[3]);
19334
19335 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19336 VkSemaphore semaphore1, semaphore2;
19337 VkSemaphoreCreateInfo semaphore_create_info{};
19338 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19339 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19340 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19341 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19342 VkSubmitInfo submit_info[3];
19343 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19344 submit_info[0].pNext = nullptr;
19345 submit_info[0].commandBufferCount = 1;
19346 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19347 submit_info[0].signalSemaphoreCount = 1;
19348 submit_info[0].pSignalSemaphores = &semaphore1;
19349 submit_info[0].waitSemaphoreCount = 0;
19350 submit_info[0].pWaitDstStageMask = nullptr;
19351 submit_info[0].pWaitDstStageMask = flags;
19352 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19353 submit_info[1].pNext = nullptr;
19354 submit_info[1].commandBufferCount = 1;
19355 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19356 submit_info[1].waitSemaphoreCount = 1;
19357 submit_info[1].pWaitSemaphores = &semaphore1;
19358 submit_info[1].signalSemaphoreCount = 1;
19359 submit_info[1].pSignalSemaphores = &semaphore2;
19360 submit_info[1].pWaitDstStageMask = flags;
19361 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19362 submit_info[2].pNext = nullptr;
19363 submit_info[2].commandBufferCount = 2;
19364 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19365 submit_info[2].waitSemaphoreCount = 1;
19366 submit_info[2].pWaitSemaphores = &semaphore2;
19367 submit_info[2].signalSemaphoreCount = 0;
19368 submit_info[2].pSignalSemaphores = nullptr;
19369 submit_info[2].pWaitDstStageMask = flags;
19370 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19371 vkQueueWaitIdle(m_device->m_queue);
19372
19373 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19374 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19375 m_errorMonitor->VerifyNotFound();
19376}
19377
Tobin Ehlis953e8392016-11-17 10:54:13 -070019378TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19379 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19380 // We previously had a bug where dynamic offset of inactive bindings was still being used
19381 VkResult err;
19382 m_errorMonitor->ExpectSuccess();
19383
Tony Barbour1fa09702017-03-16 12:09:08 -060019384 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019385 ASSERT_NO_FATAL_FAILURE(InitViewport());
19386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19387
19388 VkDescriptorPoolSize ds_type_count = {};
19389 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19390 ds_type_count.descriptorCount = 3;
19391
19392 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19393 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19394 ds_pool_ci.pNext = NULL;
19395 ds_pool_ci.maxSets = 1;
19396 ds_pool_ci.poolSizeCount = 1;
19397 ds_pool_ci.pPoolSizes = &ds_type_count;
19398
19399 VkDescriptorPool ds_pool;
19400 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19401 ASSERT_VK_SUCCESS(err);
19402
19403 const uint32_t BINDING_COUNT = 3;
19404 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019405 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019406 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19407 dsl_binding[0].descriptorCount = 1;
19408 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19409 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019410 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019411 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19412 dsl_binding[1].descriptorCount = 1;
19413 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19414 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019415 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019416 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19417 dsl_binding[2].descriptorCount = 1;
19418 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19419 dsl_binding[2].pImmutableSamplers = NULL;
19420
19421 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19422 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19423 ds_layout_ci.pNext = NULL;
19424 ds_layout_ci.bindingCount = BINDING_COUNT;
19425 ds_layout_ci.pBindings = dsl_binding;
19426 VkDescriptorSetLayout ds_layout;
19427 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19428 ASSERT_VK_SUCCESS(err);
19429
19430 VkDescriptorSet descriptor_set;
19431 VkDescriptorSetAllocateInfo alloc_info = {};
19432 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19433 alloc_info.descriptorSetCount = 1;
19434 alloc_info.descriptorPool = ds_pool;
19435 alloc_info.pSetLayouts = &ds_layout;
19436 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19437 ASSERT_VK_SUCCESS(err);
19438
19439 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19440 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19441 pipeline_layout_ci.pNext = NULL;
19442 pipeline_layout_ci.setLayoutCount = 1;
19443 pipeline_layout_ci.pSetLayouts = &ds_layout;
19444
19445 VkPipelineLayout pipeline_layout;
19446 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19447 ASSERT_VK_SUCCESS(err);
19448
19449 // Create two buffers to update the descriptors with
19450 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19451 uint32_t qfi = 0;
19452 VkBufferCreateInfo buffCI = {};
19453 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19454 buffCI.size = 2048;
19455 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19456 buffCI.queueFamilyIndexCount = 1;
19457 buffCI.pQueueFamilyIndices = &qfi;
19458
19459 VkBuffer dyub1;
19460 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19461 ASSERT_VK_SUCCESS(err);
19462 // buffer2
19463 buffCI.size = 1024;
19464 VkBuffer dyub2;
19465 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19466 ASSERT_VK_SUCCESS(err);
19467 // Allocate memory and bind to buffers
19468 VkMemoryAllocateInfo mem_alloc[2] = {};
19469 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19470 mem_alloc[0].pNext = NULL;
19471 mem_alloc[0].memoryTypeIndex = 0;
19472 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19473 mem_alloc[1].pNext = NULL;
19474 mem_alloc[1].memoryTypeIndex = 0;
19475
19476 VkMemoryRequirements mem_reqs1;
19477 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19478 VkMemoryRequirements mem_reqs2;
19479 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19480 mem_alloc[0].allocationSize = mem_reqs1.size;
19481 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19482 mem_alloc[1].allocationSize = mem_reqs2.size;
19483 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19484 if (!pass) {
19485 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19486 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19487 return;
19488 }
19489
19490 VkDeviceMemory mem1;
19491 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19492 ASSERT_VK_SUCCESS(err);
19493 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19494 ASSERT_VK_SUCCESS(err);
19495 VkDeviceMemory mem2;
19496 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19497 ASSERT_VK_SUCCESS(err);
19498 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19499 ASSERT_VK_SUCCESS(err);
19500 // Update descriptors
19501 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19502 buff_info[0].buffer = dyub1;
19503 buff_info[0].offset = 0;
19504 buff_info[0].range = 256;
19505 buff_info[1].buffer = dyub1;
19506 buff_info[1].offset = 256;
19507 buff_info[1].range = 512;
19508 buff_info[2].buffer = dyub2;
19509 buff_info[2].offset = 0;
19510 buff_info[2].range = 512;
19511
19512 VkWriteDescriptorSet descriptor_write;
19513 memset(&descriptor_write, 0, sizeof(descriptor_write));
19514 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19515 descriptor_write.dstSet = descriptor_set;
19516 descriptor_write.dstBinding = 0;
19517 descriptor_write.descriptorCount = BINDING_COUNT;
19518 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19519 descriptor_write.pBufferInfo = buff_info;
19520
19521 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19522
Tony Barbour552f6c02016-12-21 14:34:07 -070019523 m_commandBuffer->BeginCommandBuffer();
19524 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019525
19526 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019527 char const *vsSource =
19528 "#version 450\n"
19529 "\n"
19530 "out gl_PerVertex { \n"
19531 " vec4 gl_Position;\n"
19532 "};\n"
19533 "void main(){\n"
19534 " gl_Position = vec4(1);\n"
19535 "}\n";
19536 char const *fsSource =
19537 "#version 450\n"
19538 "\n"
19539 "layout(location=0) out vec4 x;\n"
19540 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19541 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19542 "void main(){\n"
19543 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19544 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019545 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19546 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19547 VkPipelineObj pipe(m_device);
19548 pipe.SetViewport(m_viewports);
19549 pipe.SetScissor(m_scissors);
19550 pipe.AddShader(&vs);
19551 pipe.AddShader(&fs);
19552 pipe.AddColorAttachment();
19553 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19554
19555 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19556 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19557 // we used to have a bug in this case.
19558 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19559 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19560 &descriptor_set, BINDING_COUNT, dyn_off);
19561 Draw(1, 0, 0, 0);
19562 m_errorMonitor->VerifyNotFound();
19563
19564 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19565 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19566 vkFreeMemory(m_device->device(), mem1, NULL);
19567 vkFreeMemory(m_device->device(), mem2, NULL);
19568
19569 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19570 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19571 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19572}
19573
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019574TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019575 TEST_DESCRIPTION(
19576 "Ensure that validations handling of non-coherent memory "
19577 "mapping while using VK_WHOLE_SIZE does not cause access "
19578 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019579 VkResult err;
19580 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019581 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019582
19583 VkDeviceMemory mem;
19584 VkMemoryRequirements mem_reqs;
19585 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019586 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019587 VkMemoryAllocateInfo alloc_info = {};
19588 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19589 alloc_info.pNext = NULL;
19590 alloc_info.memoryTypeIndex = 0;
19591
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019592 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019593 alloc_info.allocationSize = allocation_size;
19594
19595 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19596 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 -070019597 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019598 if (!pass) {
19599 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019600 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19601 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019602 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019603 pass = m_device->phy().set_memory_type(
19604 mem_reqs.memoryTypeBits, &alloc_info,
19605 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19606 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019607 if (!pass) {
19608 return;
19609 }
19610 }
19611 }
19612
19613 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19614 ASSERT_VK_SUCCESS(err);
19615
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019616 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019617 m_errorMonitor->ExpectSuccess();
19618 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19619 ASSERT_VK_SUCCESS(err);
19620 VkMappedMemoryRange mmr = {};
19621 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19622 mmr.memory = mem;
19623 mmr.offset = 0;
19624 mmr.size = VK_WHOLE_SIZE;
19625 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19626 ASSERT_VK_SUCCESS(err);
19627 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19628 ASSERT_VK_SUCCESS(err);
19629 m_errorMonitor->VerifyNotFound();
19630 vkUnmapMemory(m_device->device(), mem);
19631
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019632 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019633 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019634 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019635 ASSERT_VK_SUCCESS(err);
19636 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19637 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019638 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019639 mmr.size = VK_WHOLE_SIZE;
19640 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19641 ASSERT_VK_SUCCESS(err);
19642 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19643 ASSERT_VK_SUCCESS(err);
19644 m_errorMonitor->VerifyNotFound();
19645 vkUnmapMemory(m_device->device(), mem);
19646
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019647 // Map with offset and size
19648 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019649 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019650 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019651 ASSERT_VK_SUCCESS(err);
19652 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19653 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019654 mmr.offset = 4 * atom_size;
19655 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019656 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19657 ASSERT_VK_SUCCESS(err);
19658 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19659 ASSERT_VK_SUCCESS(err);
19660 m_errorMonitor->VerifyNotFound();
19661 vkUnmapMemory(m_device->device(), mem);
19662
19663 // Map without offset and flush WHOLE_SIZE with two separate offsets
19664 m_errorMonitor->ExpectSuccess();
19665 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19666 ASSERT_VK_SUCCESS(err);
19667 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19668 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019669 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019670 mmr.size = VK_WHOLE_SIZE;
19671 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19672 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019673 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019674 mmr.size = VK_WHOLE_SIZE;
19675 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19676 ASSERT_VK_SUCCESS(err);
19677 m_errorMonitor->VerifyNotFound();
19678 vkUnmapMemory(m_device->device(), mem);
19679
19680 vkFreeMemory(m_device->device(), mem, NULL);
19681}
19682
19683// This is a positive test. We used to expect error in this case but spec now allows it
19684TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19685 m_errorMonitor->ExpectSuccess();
19686 vk_testing::Fence testFence;
19687 VkFenceCreateInfo fenceInfo = {};
19688 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19689 fenceInfo.pNext = NULL;
19690
Tony Barbour1fa09702017-03-16 12:09:08 -060019691 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019692 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019693 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019694 VkResult result = vkResetFences(m_device->device(), 1, fences);
19695 ASSERT_VK_SUCCESS(result);
19696
19697 m_errorMonitor->VerifyNotFound();
19698}
19699
19700TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19701 m_errorMonitor->ExpectSuccess();
19702
Tony Barbour1fa09702017-03-16 12:09:08 -060019703 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019704 VkResult err;
19705
19706 // Record (empty!) command buffer that can be submitted multiple times
19707 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019708 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19709 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019710 m_commandBuffer->BeginCommandBuffer(&cbbi);
19711 m_commandBuffer->EndCommandBuffer();
19712
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019713 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019714 VkFence fence;
19715 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19716 ASSERT_VK_SUCCESS(err);
19717
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019718 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019719 VkSemaphore s1, s2;
19720 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19721 ASSERT_VK_SUCCESS(err);
19722 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19723 ASSERT_VK_SUCCESS(err);
19724
19725 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019726 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019727 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19728 ASSERT_VK_SUCCESS(err);
19729
19730 // Submit CB again, signaling s2.
19731 si.pSignalSemaphores = &s2;
19732 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19733 ASSERT_VK_SUCCESS(err);
19734
19735 // Wait for fence.
19736 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19737 ASSERT_VK_SUCCESS(err);
19738
19739 // CB is still in flight from second submission, but semaphore s1 is no
19740 // longer in flight. delete it.
19741 vkDestroySemaphore(m_device->device(), s1, nullptr);
19742
19743 m_errorMonitor->VerifyNotFound();
19744
19745 // Force device idle and clean up remaining objects
19746 vkDeviceWaitIdle(m_device->device());
19747 vkDestroySemaphore(m_device->device(), s2, nullptr);
19748 vkDestroyFence(m_device->device(), fence, nullptr);
19749}
19750
19751TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19752 m_errorMonitor->ExpectSuccess();
19753
Tony Barbour1fa09702017-03-16 12:09:08 -060019754 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019755 VkResult err;
19756
19757 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019758 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019759 VkFence f1;
19760 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19761 ASSERT_VK_SUCCESS(err);
19762
19763 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019764 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019765 VkFence f2;
19766 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19767 ASSERT_VK_SUCCESS(err);
19768
19769 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019770 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019771 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19772
19773 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019774 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019775 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19776
19777 // Should have both retired!
19778 vkDestroyFence(m_device->device(), f1, nullptr);
19779 vkDestroyFence(m_device->device(), f2, nullptr);
19780
19781 m_errorMonitor->VerifyNotFound();
19782}
19783
19784TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019785 TEST_DESCRIPTION(
19786 "Verify that creating an image view from an image with valid usage "
19787 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019788
Tony Barbour1fa09702017-03-16 12:09:08 -060019789 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019790
19791 m_errorMonitor->ExpectSuccess();
19792 // Verify that we can create a view with usage INPUT_ATTACHMENT
19793 VkImageObj image(m_device);
19794 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19795 ASSERT_TRUE(image.initialized());
19796 VkImageView imageView;
19797 VkImageViewCreateInfo ivci = {};
19798 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19799 ivci.image = image.handle();
19800 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19801 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19802 ivci.subresourceRange.layerCount = 1;
19803 ivci.subresourceRange.baseMipLevel = 0;
19804 ivci.subresourceRange.levelCount = 1;
19805 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19806
19807 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19808 m_errorMonitor->VerifyNotFound();
19809 vkDestroyImageView(m_device->device(), imageView, NULL);
19810}
19811
19812// This is a positive test. No failures are expected.
19813TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019814 TEST_DESCRIPTION(
19815 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19816 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019817
Tony Barbour1fa09702017-03-16 12:09:08 -060019818 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019819
19820 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019821 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019822 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019823
19824 m_errorMonitor->ExpectSuccess();
19825
19826 VkImage image;
19827 VkImageCreateInfo image_create_info = {};
19828 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19829 image_create_info.pNext = NULL;
19830 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19831 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19832 image_create_info.extent.width = 64;
19833 image_create_info.extent.height = 64;
19834 image_create_info.extent.depth = 1;
19835 image_create_info.mipLevels = 1;
19836 image_create_info.arrayLayers = 1;
19837 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19838 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19839 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19840 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19841 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19842 ASSERT_VK_SUCCESS(err);
19843
19844 VkMemoryRequirements memory_reqs;
19845 VkDeviceMemory memory_one, memory_two;
19846 bool pass;
19847 VkMemoryAllocateInfo memory_info = {};
19848 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19849 memory_info.pNext = NULL;
19850 memory_info.allocationSize = 0;
19851 memory_info.memoryTypeIndex = 0;
19852 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19853 // Find an image big enough to allow sparse mapping of 2 memory regions
19854 // Increase the image size until it is at least twice the
19855 // size of the required alignment, to ensure we can bind both
19856 // allocated memory blocks to the image on aligned offsets.
19857 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19858 vkDestroyImage(m_device->device(), image, nullptr);
19859 image_create_info.extent.width *= 2;
19860 image_create_info.extent.height *= 2;
19861 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19862 ASSERT_VK_SUCCESS(err);
19863 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19864 }
19865 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19866 // at the end of the first
19867 memory_info.allocationSize = memory_reqs.alignment;
19868 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19869 ASSERT_TRUE(pass);
19870 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19871 ASSERT_VK_SUCCESS(err);
19872 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19873 ASSERT_VK_SUCCESS(err);
19874 VkSparseMemoryBind binds[2];
19875 binds[0].flags = 0;
19876 binds[0].memory = memory_one;
19877 binds[0].memoryOffset = 0;
19878 binds[0].resourceOffset = 0;
19879 binds[0].size = memory_info.allocationSize;
19880 binds[1].flags = 0;
19881 binds[1].memory = memory_two;
19882 binds[1].memoryOffset = 0;
19883 binds[1].resourceOffset = memory_info.allocationSize;
19884 binds[1].size = memory_info.allocationSize;
19885
19886 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19887 opaqueBindInfo.image = image;
19888 opaqueBindInfo.bindCount = 2;
19889 opaqueBindInfo.pBinds = binds;
19890
19891 VkFence fence = VK_NULL_HANDLE;
19892 VkBindSparseInfo bindSparseInfo = {};
19893 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19894 bindSparseInfo.imageOpaqueBindCount = 1;
19895 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19896
19897 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19898 vkQueueWaitIdle(m_device->m_queue);
19899 vkDestroyImage(m_device->device(), image, NULL);
19900 vkFreeMemory(m_device->device(), memory_one, NULL);
19901 vkFreeMemory(m_device->device(), memory_two, NULL);
19902 m_errorMonitor->VerifyNotFound();
19903}
19904
19905TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019906 TEST_DESCRIPTION(
19907 "Ensure that CmdBeginRenderPass with an attachment's "
19908 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19909 "the command buffer has prior knowledge of that "
19910 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019911
19912 m_errorMonitor->ExpectSuccess();
19913
Tony Barbour1fa09702017-03-16 12:09:08 -060019914 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019915
19916 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019917 VkAttachmentDescription attachment = {0,
19918 VK_FORMAT_R8G8B8A8_UNORM,
19919 VK_SAMPLE_COUNT_1_BIT,
19920 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19921 VK_ATTACHMENT_STORE_OP_STORE,
19922 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19923 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19924 VK_IMAGE_LAYOUT_UNDEFINED,
19925 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019926
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019927 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019928
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019929 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019930
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019931 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019932
19933 VkRenderPass rp;
19934 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19935 ASSERT_VK_SUCCESS(err);
19936
19937 // A compatible framebuffer.
19938 VkImageObj image(m_device);
19939 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19940 ASSERT_TRUE(image.initialized());
19941
19942 VkImageViewCreateInfo ivci = {
19943 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19944 nullptr,
19945 0,
19946 image.handle(),
19947 VK_IMAGE_VIEW_TYPE_2D,
19948 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019949 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19950 VK_COMPONENT_SWIZZLE_IDENTITY},
19951 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019952 };
19953 VkImageView view;
19954 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19955 ASSERT_VK_SUCCESS(err);
19956
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019957 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019958 VkFramebuffer fb;
19959 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19960 ASSERT_VK_SUCCESS(err);
19961
19962 // Record a single command buffer which uses this renderpass twice. The
19963 // bug is triggered at the beginning of the second renderpass, when the
19964 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019965 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 -070019966 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019967 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19968 vkCmdEndRenderPass(m_commandBuffer->handle());
19969 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19970
19971 m_errorMonitor->VerifyNotFound();
19972
19973 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019974 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019975
19976 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19977 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19978 vkDestroyImageView(m_device->device(), view, nullptr);
19979}
19980
19981TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019982 TEST_DESCRIPTION(
19983 "This test should pass. Create a Framebuffer and "
19984 "command buffer, bind them together, then destroy "
19985 "command pool and framebuffer and verify there are no "
19986 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019987
19988 m_errorMonitor->ExpectSuccess();
19989
Tony Barbour1fa09702017-03-16 12:09:08 -060019990 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019991
19992 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019993 VkAttachmentDescription attachment = {0,
19994 VK_FORMAT_R8G8B8A8_UNORM,
19995 VK_SAMPLE_COUNT_1_BIT,
19996 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19997 VK_ATTACHMENT_STORE_OP_STORE,
19998 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19999 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20000 VK_IMAGE_LAYOUT_UNDEFINED,
20001 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020002
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020003 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020004
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020005 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020006
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020007 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020008
20009 VkRenderPass rp;
20010 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20011 ASSERT_VK_SUCCESS(err);
20012
20013 // A compatible framebuffer.
20014 VkImageObj image(m_device);
20015 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20016 ASSERT_TRUE(image.initialized());
20017
20018 VkImageViewCreateInfo ivci = {
20019 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20020 nullptr,
20021 0,
20022 image.handle(),
20023 VK_IMAGE_VIEW_TYPE_2D,
20024 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020025 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20026 VK_COMPONENT_SWIZZLE_IDENTITY},
20027 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020028 };
20029 VkImageView view;
20030 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20031 ASSERT_VK_SUCCESS(err);
20032
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020033 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020034 VkFramebuffer fb;
20035 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20036 ASSERT_VK_SUCCESS(err);
20037
20038 // Explicitly create a command buffer to bind the FB to so that we can then
20039 // destroy the command pool in order to implicitly free command buffer
20040 VkCommandPool command_pool;
20041 VkCommandPoolCreateInfo pool_create_info{};
20042 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20043 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20044 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20045 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20046
20047 VkCommandBuffer command_buffer;
20048 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20049 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20050 command_buffer_allocate_info.commandPool = command_pool;
20051 command_buffer_allocate_info.commandBufferCount = 1;
20052 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20053 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20054
20055 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020056 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 -060020057 VkCommandBufferBeginInfo begin_info{};
20058 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20059 vkBeginCommandBuffer(command_buffer, &begin_info);
20060
20061 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20062 vkCmdEndRenderPass(command_buffer);
20063 vkEndCommandBuffer(command_buffer);
20064 vkDestroyImageView(m_device->device(), view, nullptr);
20065 // Destroy command pool to implicitly free command buffer
20066 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20067 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20068 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20069 m_errorMonitor->VerifyNotFound();
20070}
20071
20072TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020073 TEST_DESCRIPTION(
20074 "Ensure that CmdBeginRenderPass applies the layout "
20075 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020076
20077 m_errorMonitor->ExpectSuccess();
20078
Tony Barbour1fa09702017-03-16 12:09:08 -060020079 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020080
20081 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020082 VkAttachmentDescription attachment = {0,
20083 VK_FORMAT_R8G8B8A8_UNORM,
20084 VK_SAMPLE_COUNT_1_BIT,
20085 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20086 VK_ATTACHMENT_STORE_OP_STORE,
20087 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20088 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20089 VK_IMAGE_LAYOUT_UNDEFINED,
20090 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020091
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020092 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020093
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020094 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020095
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020096 VkSubpassDependency dep = {0,
20097 0,
20098 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20099 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20100 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20101 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20102 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020103
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020104 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020105
20106 VkResult err;
20107 VkRenderPass rp;
20108 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20109 ASSERT_VK_SUCCESS(err);
20110
20111 // A compatible framebuffer.
20112 VkImageObj image(m_device);
20113 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20114 ASSERT_TRUE(image.initialized());
20115
20116 VkImageViewCreateInfo ivci = {
20117 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20118 nullptr,
20119 0,
20120 image.handle(),
20121 VK_IMAGE_VIEW_TYPE_2D,
20122 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020123 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20124 VK_COMPONENT_SWIZZLE_IDENTITY},
20125 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020126 };
20127 VkImageView view;
20128 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20129 ASSERT_VK_SUCCESS(err);
20130
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020131 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020132 VkFramebuffer fb;
20133 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20134 ASSERT_VK_SUCCESS(err);
20135
20136 // Record a single command buffer which issues a pipeline barrier w/
20137 // image memory barrier for the attachment. This detects the previously
20138 // missing tracking of the subpass layout by throwing a validation error
20139 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020140 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 -070020141 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020142 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20143
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020144 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20145 nullptr,
20146 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20147 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20148 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20149 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20150 VK_QUEUE_FAMILY_IGNORED,
20151 VK_QUEUE_FAMILY_IGNORED,
20152 image.handle(),
20153 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020154 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020155 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20156 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020157
20158 vkCmdEndRenderPass(m_commandBuffer->handle());
20159 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020160 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020161
20162 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20163 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20164 vkDestroyImageView(m_device->device(), view, nullptr);
20165}
20166
20167TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020168 TEST_DESCRIPTION(
20169 "Validate that when an imageView of a depth/stencil image "
20170 "is used as a depth/stencil framebuffer attachment, the "
20171 "aspectMask is ignored and both depth and stencil image "
20172 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020173
Tony Barbour1fa09702017-03-16 12:09:08 -060020174 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020175 VkFormatProperties format_properties;
20176 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20177 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20178 return;
20179 }
20180
20181 m_errorMonitor->ExpectSuccess();
20182
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020183 VkAttachmentDescription attachment = {0,
20184 VK_FORMAT_D32_SFLOAT_S8_UINT,
20185 VK_SAMPLE_COUNT_1_BIT,
20186 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20187 VK_ATTACHMENT_STORE_OP_STORE,
20188 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20189 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20190 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20191 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020192
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020193 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020194
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020195 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020196
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020197 VkSubpassDependency dep = {0,
20198 0,
20199 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20200 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20201 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20202 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20203 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020204
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020205 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020206
20207 VkResult err;
20208 VkRenderPass rp;
20209 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20210 ASSERT_VK_SUCCESS(err);
20211
20212 VkImageObj image(m_device);
20213 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020214 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020215 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020216 ASSERT_TRUE(image.initialized());
20217 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20218
20219 VkImageViewCreateInfo ivci = {
20220 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20221 nullptr,
20222 0,
20223 image.handle(),
20224 VK_IMAGE_VIEW_TYPE_2D,
20225 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020226 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20227 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020228 };
20229 VkImageView view;
20230 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20231 ASSERT_VK_SUCCESS(err);
20232
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020233 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020234 VkFramebuffer fb;
20235 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20236 ASSERT_VK_SUCCESS(err);
20237
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020238 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 -070020239 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020240 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20241
20242 VkImageMemoryBarrier imb = {};
20243 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20244 imb.pNext = nullptr;
20245 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20246 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20247 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20248 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20249 imb.srcQueueFamilyIndex = 0;
20250 imb.dstQueueFamilyIndex = 0;
20251 imb.image = image.handle();
20252 imb.subresourceRange.aspectMask = 0x6;
20253 imb.subresourceRange.baseMipLevel = 0;
20254 imb.subresourceRange.levelCount = 0x1;
20255 imb.subresourceRange.baseArrayLayer = 0;
20256 imb.subresourceRange.layerCount = 0x1;
20257
20258 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020259 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20260 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020261
20262 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020263 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020264 QueueCommandBuffer(false);
20265 m_errorMonitor->VerifyNotFound();
20266
20267 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20268 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20269 vkDestroyImageView(m_device->device(), view, nullptr);
20270}
20271
20272TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020273 TEST_DESCRIPTION(
20274 "Ensure that layout transitions work correctly without "
20275 "errors, when an attachment reference is "
20276 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020277
20278 m_errorMonitor->ExpectSuccess();
20279
Tony Barbour1fa09702017-03-16 12:09:08 -060020280 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020281
20282 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020283 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020284
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020285 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020286
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020287 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020288
20289 VkRenderPass rp;
20290 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20291 ASSERT_VK_SUCCESS(err);
20292
20293 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020294 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020295 VkFramebuffer fb;
20296 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20297 ASSERT_VK_SUCCESS(err);
20298
20299 // Record a command buffer which just begins and ends the renderpass. The
20300 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020301 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 -070020302 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020303 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20304 vkCmdEndRenderPass(m_commandBuffer->handle());
20305 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020306 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020307
20308 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20309 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20310}
20311
20312// This is a positive test. No errors are expected.
20313TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020314 TEST_DESCRIPTION(
20315 "Create a stencil-only attachment with a LOAD_OP set to "
20316 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020317 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020318 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070020319 auto depth_format = find_depth_stencil_format(m_device);
20320 if (!depth_format) {
20321 printf(" No Depth + Stencil format found. Skipped.\n");
20322 return;
20323 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020324 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020325 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020326 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20327 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020328 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20329 return;
20330 }
20331
Tony Barbourf887b162017-03-09 10:06:46 -070020332 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020333 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020334 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020335 VkAttachmentDescription att = {};
20336 VkAttachmentReference ref = {};
20337 att.format = depth_stencil_fmt;
20338 att.samples = VK_SAMPLE_COUNT_1_BIT;
20339 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20340 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20341 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20342 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20343 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20344 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20345
20346 VkClearValue clear;
20347 clear.depthStencil.depth = 1.0;
20348 clear.depthStencil.stencil = 0;
20349 ref.attachment = 0;
20350 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20351
20352 VkSubpassDescription subpass = {};
20353 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20354 subpass.flags = 0;
20355 subpass.inputAttachmentCount = 0;
20356 subpass.pInputAttachments = NULL;
20357 subpass.colorAttachmentCount = 0;
20358 subpass.pColorAttachments = NULL;
20359 subpass.pResolveAttachments = NULL;
20360 subpass.pDepthStencilAttachment = &ref;
20361 subpass.preserveAttachmentCount = 0;
20362 subpass.pPreserveAttachments = NULL;
20363
20364 VkRenderPass rp;
20365 VkRenderPassCreateInfo rp_info = {};
20366 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20367 rp_info.attachmentCount = 1;
20368 rp_info.pAttachments = &att;
20369 rp_info.subpassCount = 1;
20370 rp_info.pSubpasses = &subpass;
20371 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20372 ASSERT_VK_SUCCESS(result);
20373
20374 VkImageView *depthView = m_depthStencil->BindInfo();
20375 VkFramebufferCreateInfo fb_info = {};
20376 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20377 fb_info.pNext = NULL;
20378 fb_info.renderPass = rp;
20379 fb_info.attachmentCount = 1;
20380 fb_info.pAttachments = depthView;
20381 fb_info.width = 100;
20382 fb_info.height = 100;
20383 fb_info.layers = 1;
20384 VkFramebuffer fb;
20385 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20386 ASSERT_VK_SUCCESS(result);
20387
20388 VkRenderPassBeginInfo rpbinfo = {};
20389 rpbinfo.clearValueCount = 1;
20390 rpbinfo.pClearValues = &clear;
20391 rpbinfo.pNext = NULL;
20392 rpbinfo.renderPass = rp;
20393 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20394 rpbinfo.renderArea.extent.width = 100;
20395 rpbinfo.renderArea.extent.height = 100;
20396 rpbinfo.renderArea.offset.x = 0;
20397 rpbinfo.renderArea.offset.y = 0;
20398 rpbinfo.framebuffer = fb;
20399
20400 VkFence fence = {};
20401 VkFenceCreateInfo fence_ci = {};
20402 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20403 fence_ci.pNext = nullptr;
20404 fence_ci.flags = 0;
20405 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20406 ASSERT_VK_SUCCESS(result);
20407
20408 m_commandBuffer->BeginCommandBuffer();
20409 m_commandBuffer->BeginRenderPass(rpbinfo);
20410 m_commandBuffer->EndRenderPass();
20411 m_commandBuffer->EndCommandBuffer();
20412 m_commandBuffer->QueueCommandBuffer(fence);
20413
20414 VkImageObj destImage(m_device);
20415 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 -070020416 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020417 VkImageMemoryBarrier barrier = {};
20418 VkImageSubresourceRange range;
20419 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20420 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20421 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20422 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20423 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20424 barrier.image = m_depthStencil->handle();
20425 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20426 range.baseMipLevel = 0;
20427 range.levelCount = 1;
20428 range.baseArrayLayer = 0;
20429 range.layerCount = 1;
20430 barrier.subresourceRange = range;
20431 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20432 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20433 cmdbuf.BeginCommandBuffer();
20434 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 -070020435 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020436 barrier.srcAccessMask = 0;
20437 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20438 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20439 barrier.image = destImage.handle();
20440 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20441 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 -070020442 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020443 VkImageCopy cregion;
20444 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20445 cregion.srcSubresource.mipLevel = 0;
20446 cregion.srcSubresource.baseArrayLayer = 0;
20447 cregion.srcSubresource.layerCount = 1;
20448 cregion.srcOffset.x = 0;
20449 cregion.srcOffset.y = 0;
20450 cregion.srcOffset.z = 0;
20451 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20452 cregion.dstSubresource.mipLevel = 0;
20453 cregion.dstSubresource.baseArrayLayer = 0;
20454 cregion.dstSubresource.layerCount = 1;
20455 cregion.dstOffset.x = 0;
20456 cregion.dstOffset.y = 0;
20457 cregion.dstOffset.z = 0;
20458 cregion.extent.width = 100;
20459 cregion.extent.height = 100;
20460 cregion.extent.depth = 1;
20461 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020462 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020463 cmdbuf.EndCommandBuffer();
20464
20465 VkSubmitInfo submit_info;
20466 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20467 submit_info.pNext = NULL;
20468 submit_info.waitSemaphoreCount = 0;
20469 submit_info.pWaitSemaphores = NULL;
20470 submit_info.pWaitDstStageMask = NULL;
20471 submit_info.commandBufferCount = 1;
20472 submit_info.pCommandBuffers = &cmdbuf.handle();
20473 submit_info.signalSemaphoreCount = 0;
20474 submit_info.pSignalSemaphores = NULL;
20475
20476 m_errorMonitor->ExpectSuccess();
20477 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20478 m_errorMonitor->VerifyNotFound();
20479
20480 vkQueueWaitIdle(m_device->m_queue);
20481 vkDestroyFence(m_device->device(), fence, nullptr);
20482 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20483 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20484}
20485
20486// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020487TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20488 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20489
20490 m_errorMonitor->ExpectSuccess();
20491
Tony Barbour1fa09702017-03-16 12:09:08 -060020492 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour9357d542017-03-24 15:42:21 -060020493 auto depth_format = find_depth_stencil_format(m_device);
20494 if (!depth_format) {
20495 printf(" No Depth + Stencil format found. Skipped.\n");
20496 return;
20497 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020498 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20499
20500 VkImageMemoryBarrier img_barrier = {};
20501 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20502 img_barrier.pNext = NULL;
20503 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20504 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20505 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20506 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20507 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20508 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20509 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20510 img_barrier.subresourceRange.baseArrayLayer = 0;
20511 img_barrier.subresourceRange.baseMipLevel = 0;
20512 img_barrier.subresourceRange.layerCount = 1;
20513 img_barrier.subresourceRange.levelCount = 1;
20514
20515 {
20516 VkImageObj img_color(m_device);
20517 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20518 ASSERT_TRUE(img_color.initialized());
20519
20520 VkImageObj img_ds1(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020521 img_ds1.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020522 ASSERT_TRUE(img_ds1.initialized());
20523
20524 VkImageObj img_ds2(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020525 img_ds2.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020526 ASSERT_TRUE(img_ds2.initialized());
20527
20528 VkImageObj img_xfer_src(m_device);
20529 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20530 ASSERT_TRUE(img_xfer_src.initialized());
20531
20532 VkImageObj img_xfer_dst(m_device);
20533 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20534 ASSERT_TRUE(img_xfer_dst.initialized());
20535
20536 VkImageObj img_sampled(m_device);
20537 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20538 ASSERT_TRUE(img_sampled.initialized());
20539
20540 VkImageObj img_input(m_device);
20541 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20542 ASSERT_TRUE(img_input.initialized());
20543
20544 const struct {
20545 VkImageObj &image_obj;
20546 VkImageLayout old_layout;
20547 VkImageLayout new_layout;
20548 } buffer_layouts[] = {
20549 // clang-format off
20550 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20551 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20552 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20553 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20554 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20555 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20556 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20557 // clang-format on
20558 };
20559 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20560
20561 m_commandBuffer->BeginCommandBuffer();
20562 for (uint32_t i = 0; i < layout_count; ++i) {
20563 img_barrier.image = buffer_layouts[i].image_obj.handle();
20564 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20565 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20566 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20567 : VK_IMAGE_ASPECT_COLOR_BIT;
20568
20569 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20570 img_barrier.newLayout = buffer_layouts[i].new_layout;
20571 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20572 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20573
20574 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20575 img_barrier.newLayout = buffer_layouts[i].old_layout;
20576 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20577 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20578 }
20579 m_commandBuffer->EndCommandBuffer();
20580
20581 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20582 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20583 }
20584 m_errorMonitor->VerifyNotFound();
20585}
20586
20587// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020588TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20589 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20590
20591 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020592 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020593
20594 VkEvent event;
20595 VkEventCreateInfo event_create_info{};
20596 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20597 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20598
20599 VkCommandPool command_pool;
20600 VkCommandPoolCreateInfo pool_create_info{};
20601 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20602 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20603 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20604 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20605
20606 VkCommandBuffer command_buffer;
20607 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20608 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20609 command_buffer_allocate_info.commandPool = command_pool;
20610 command_buffer_allocate_info.commandBufferCount = 1;
20611 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20612 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20613
20614 VkQueue queue = VK_NULL_HANDLE;
20615 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20616
20617 {
20618 VkCommandBufferBeginInfo begin_info{};
20619 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20620 vkBeginCommandBuffer(command_buffer, &begin_info);
20621
20622 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 -070020623 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020624 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20625 vkEndCommandBuffer(command_buffer);
20626 }
20627 {
20628 VkSubmitInfo submit_info{};
20629 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20630 submit_info.commandBufferCount = 1;
20631 submit_info.pCommandBuffers = &command_buffer;
20632 submit_info.signalSemaphoreCount = 0;
20633 submit_info.pSignalSemaphores = nullptr;
20634 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20635 }
20636 { vkSetEvent(m_device->device(), event); }
20637
20638 vkQueueWaitIdle(queue);
20639
20640 vkDestroyEvent(m_device->device(), event, nullptr);
20641 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20642 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20643
20644 m_errorMonitor->VerifyNotFound();
20645}
20646// This is a positive test. No errors should be generated.
20647TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20648 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20649
Tony Barbour1fa09702017-03-16 12:09:08 -060020650 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020651 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020652
20653 m_errorMonitor->ExpectSuccess();
20654
20655 VkQueryPool query_pool;
20656 VkQueryPoolCreateInfo query_pool_create_info{};
20657 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20658 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20659 query_pool_create_info.queryCount = 1;
20660 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20661
20662 VkCommandPool command_pool;
20663 VkCommandPoolCreateInfo pool_create_info{};
20664 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20665 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20666 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20667 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20668
20669 VkCommandBuffer command_buffer;
20670 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20671 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20672 command_buffer_allocate_info.commandPool = command_pool;
20673 command_buffer_allocate_info.commandBufferCount = 1;
20674 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20675 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20676
20677 VkCommandBuffer secondary_command_buffer;
20678 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20679 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20680
20681 VkQueue queue = VK_NULL_HANDLE;
20682 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20683
20684 uint32_t qfi = 0;
20685 VkBufferCreateInfo buff_create_info = {};
20686 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20687 buff_create_info.size = 1024;
20688 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20689 buff_create_info.queueFamilyIndexCount = 1;
20690 buff_create_info.pQueueFamilyIndices = &qfi;
20691
20692 VkResult err;
20693 VkBuffer buffer;
20694 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20695 ASSERT_VK_SUCCESS(err);
20696 VkMemoryAllocateInfo mem_alloc = {};
20697 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20698 mem_alloc.pNext = NULL;
20699 mem_alloc.allocationSize = 1024;
20700 mem_alloc.memoryTypeIndex = 0;
20701
20702 VkMemoryRequirements memReqs;
20703 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20704 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20705 if (!pass) {
20706 vkDestroyBuffer(m_device->device(), buffer, NULL);
20707 return;
20708 }
20709
20710 VkDeviceMemory mem;
20711 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20712 ASSERT_VK_SUCCESS(err);
20713 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20714 ASSERT_VK_SUCCESS(err);
20715
20716 VkCommandBufferInheritanceInfo hinfo = {};
20717 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20718 hinfo.renderPass = VK_NULL_HANDLE;
20719 hinfo.subpass = 0;
20720 hinfo.framebuffer = VK_NULL_HANDLE;
20721 hinfo.occlusionQueryEnable = VK_FALSE;
20722 hinfo.queryFlags = 0;
20723 hinfo.pipelineStatistics = 0;
20724
20725 {
20726 VkCommandBufferBeginInfo begin_info{};
20727 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20728 begin_info.pInheritanceInfo = &hinfo;
20729 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20730
20731 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20732 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20733
20734 vkEndCommandBuffer(secondary_command_buffer);
20735
20736 begin_info.pInheritanceInfo = nullptr;
20737 vkBeginCommandBuffer(command_buffer, &begin_info);
20738
20739 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20740 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20741
20742 vkEndCommandBuffer(command_buffer);
20743 }
20744 {
20745 VkSubmitInfo submit_info{};
20746 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20747 submit_info.commandBufferCount = 1;
20748 submit_info.pCommandBuffers = &command_buffer;
20749 submit_info.signalSemaphoreCount = 0;
20750 submit_info.pSignalSemaphores = nullptr;
20751 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20752 }
20753
20754 vkQueueWaitIdle(queue);
20755
20756 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20757 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20758 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20759 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20760 vkDestroyBuffer(m_device->device(), buffer, NULL);
20761 vkFreeMemory(m_device->device(), mem, NULL);
20762
20763 m_errorMonitor->VerifyNotFound();
20764}
20765
20766// This is a positive test. No errors should be generated.
20767TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20768 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20769
Tony Barbour1fa09702017-03-16 12:09:08 -060020770 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020771 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020772
20773 m_errorMonitor->ExpectSuccess();
20774
20775 VkQueryPool query_pool;
20776 VkQueryPoolCreateInfo query_pool_create_info{};
20777 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20778 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20779 query_pool_create_info.queryCount = 1;
20780 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20781
20782 VkCommandPool command_pool;
20783 VkCommandPoolCreateInfo pool_create_info{};
20784 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20785 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20786 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20787 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20788
20789 VkCommandBuffer command_buffer[2];
20790 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20791 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20792 command_buffer_allocate_info.commandPool = command_pool;
20793 command_buffer_allocate_info.commandBufferCount = 2;
20794 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20795 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20796
20797 VkQueue queue = VK_NULL_HANDLE;
20798 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20799
20800 uint32_t qfi = 0;
20801 VkBufferCreateInfo buff_create_info = {};
20802 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20803 buff_create_info.size = 1024;
20804 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20805 buff_create_info.queueFamilyIndexCount = 1;
20806 buff_create_info.pQueueFamilyIndices = &qfi;
20807
20808 VkResult err;
20809 VkBuffer buffer;
20810 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20811 ASSERT_VK_SUCCESS(err);
20812 VkMemoryAllocateInfo mem_alloc = {};
20813 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20814 mem_alloc.pNext = NULL;
20815 mem_alloc.allocationSize = 1024;
20816 mem_alloc.memoryTypeIndex = 0;
20817
20818 VkMemoryRequirements memReqs;
20819 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20820 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20821 if (!pass) {
20822 vkDestroyBuffer(m_device->device(), buffer, NULL);
20823 return;
20824 }
20825
20826 VkDeviceMemory mem;
20827 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20828 ASSERT_VK_SUCCESS(err);
20829 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20830 ASSERT_VK_SUCCESS(err);
20831
20832 {
20833 VkCommandBufferBeginInfo begin_info{};
20834 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20835 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20836
20837 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20838 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20839
20840 vkEndCommandBuffer(command_buffer[0]);
20841
20842 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20843
20844 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20845
20846 vkEndCommandBuffer(command_buffer[1]);
20847 }
20848 {
20849 VkSubmitInfo submit_info{};
20850 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20851 submit_info.commandBufferCount = 2;
20852 submit_info.pCommandBuffers = command_buffer;
20853 submit_info.signalSemaphoreCount = 0;
20854 submit_info.pSignalSemaphores = nullptr;
20855 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20856 }
20857
20858 vkQueueWaitIdle(queue);
20859
20860 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20861 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20862 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20863 vkDestroyBuffer(m_device->device(), buffer, NULL);
20864 vkFreeMemory(m_device->device(), mem, NULL);
20865
20866 m_errorMonitor->VerifyNotFound();
20867}
20868
Tony Barbourc46924f2016-11-04 11:49:52 -060020869TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020870 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20871
Tony Barbour1fa09702017-03-16 12:09:08 -060020872 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020873 VkEvent event;
20874 VkEventCreateInfo event_create_info{};
20875 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20876 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20877
20878 VkCommandPool command_pool;
20879 VkCommandPoolCreateInfo pool_create_info{};
20880 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20881 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20882 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20883 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20884
20885 VkCommandBuffer command_buffer;
20886 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20887 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20888 command_buffer_allocate_info.commandPool = command_pool;
20889 command_buffer_allocate_info.commandBufferCount = 1;
20890 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20891 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20892
20893 VkQueue queue = VK_NULL_HANDLE;
20894 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20895
20896 {
20897 VkCommandBufferBeginInfo begin_info{};
20898 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20899 vkBeginCommandBuffer(command_buffer, &begin_info);
20900
20901 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020902 vkEndCommandBuffer(command_buffer);
20903 }
20904 {
20905 VkSubmitInfo submit_info{};
20906 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20907 submit_info.commandBufferCount = 1;
20908 submit_info.pCommandBuffers = &command_buffer;
20909 submit_info.signalSemaphoreCount = 0;
20910 submit_info.pSignalSemaphores = nullptr;
20911 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20912 }
20913 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20915 "that is already in use by a "
20916 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020917 vkSetEvent(m_device->device(), event);
20918 m_errorMonitor->VerifyFound();
20919 }
20920
20921 vkQueueWaitIdle(queue);
20922
20923 vkDestroyEvent(m_device->device(), event, nullptr);
20924 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20925 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20926}
20927
20928// This is a positive test. No errors should be generated.
20929TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020930 TEST_DESCRIPTION(
20931 "Two command buffers with two separate fences are each "
20932 "run through a Submit & WaitForFences cycle 3 times. This "
20933 "previously revealed a bug so running this positive test "
20934 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020935 m_errorMonitor->ExpectSuccess();
20936
Tony Barbour1fa09702017-03-16 12:09:08 -060020937 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020938 VkQueue queue = VK_NULL_HANDLE;
20939 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20940
20941 static const uint32_t NUM_OBJECTS = 2;
20942 static const uint32_t NUM_FRAMES = 3;
20943 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20944 VkFence fences[NUM_OBJECTS] = {};
20945
20946 VkCommandPool cmd_pool;
20947 VkCommandPoolCreateInfo cmd_pool_ci = {};
20948 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20949 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20950 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20951 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20952 ASSERT_VK_SUCCESS(err);
20953
20954 VkCommandBufferAllocateInfo cmd_buf_info = {};
20955 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20956 cmd_buf_info.commandPool = cmd_pool;
20957 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20958 cmd_buf_info.commandBufferCount = 1;
20959
20960 VkFenceCreateInfo fence_ci = {};
20961 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20962 fence_ci.pNext = nullptr;
20963 fence_ci.flags = 0;
20964
20965 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20966 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20967 ASSERT_VK_SUCCESS(err);
20968 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20969 ASSERT_VK_SUCCESS(err);
20970 }
20971
20972 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20973 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20974 // Create empty cmd buffer
20975 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20976 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20977
20978 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20979 ASSERT_VK_SUCCESS(err);
20980 err = vkEndCommandBuffer(cmd_buffers[obj]);
20981 ASSERT_VK_SUCCESS(err);
20982
20983 VkSubmitInfo submit_info = {};
20984 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20985 submit_info.commandBufferCount = 1;
20986 submit_info.pCommandBuffers = &cmd_buffers[obj];
20987 // Submit cmd buffer and wait for fence
20988 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20989 ASSERT_VK_SUCCESS(err);
20990 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20991 ASSERT_VK_SUCCESS(err);
20992 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20993 ASSERT_VK_SUCCESS(err);
20994 }
20995 }
20996 m_errorMonitor->VerifyNotFound();
20997 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20998 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20999 vkDestroyFence(m_device->device(), fences[i], nullptr);
21000 }
21001}
21002// This is a positive test. No errors should be generated.
21003TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021004 TEST_DESCRIPTION(
21005 "Two command buffers, each in a separate QueueSubmit call "
21006 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021007
Tony Barbour1fa09702017-03-16 12:09:08 -060021008 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021009 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021010
21011 m_errorMonitor->ExpectSuccess();
21012
21013 VkSemaphore semaphore;
21014 VkSemaphoreCreateInfo semaphore_create_info{};
21015 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21016 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21017
21018 VkCommandPool command_pool;
21019 VkCommandPoolCreateInfo pool_create_info{};
21020 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21021 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21022 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21023 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21024
21025 VkCommandBuffer command_buffer[2];
21026 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21027 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21028 command_buffer_allocate_info.commandPool = command_pool;
21029 command_buffer_allocate_info.commandBufferCount = 2;
21030 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21031 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21032
21033 VkQueue queue = VK_NULL_HANDLE;
21034 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21035
21036 {
21037 VkCommandBufferBeginInfo begin_info{};
21038 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21039 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21040
21041 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 -070021042 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021043
21044 VkViewport viewport{};
21045 viewport.maxDepth = 1.0f;
21046 viewport.minDepth = 0.0f;
21047 viewport.width = 512;
21048 viewport.height = 512;
21049 viewport.x = 0;
21050 viewport.y = 0;
21051 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21052 vkEndCommandBuffer(command_buffer[0]);
21053 }
21054 {
21055 VkCommandBufferBeginInfo begin_info{};
21056 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21057 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21058
21059 VkViewport viewport{};
21060 viewport.maxDepth = 1.0f;
21061 viewport.minDepth = 0.0f;
21062 viewport.width = 512;
21063 viewport.height = 512;
21064 viewport.x = 0;
21065 viewport.y = 0;
21066 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21067 vkEndCommandBuffer(command_buffer[1]);
21068 }
21069 {
21070 VkSubmitInfo submit_info{};
21071 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21072 submit_info.commandBufferCount = 1;
21073 submit_info.pCommandBuffers = &command_buffer[0];
21074 submit_info.signalSemaphoreCount = 1;
21075 submit_info.pSignalSemaphores = &semaphore;
21076 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21077 }
21078 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021079 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021080 VkSubmitInfo submit_info{};
21081 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21082 submit_info.commandBufferCount = 1;
21083 submit_info.pCommandBuffers = &command_buffer[1];
21084 submit_info.waitSemaphoreCount = 1;
21085 submit_info.pWaitSemaphores = &semaphore;
21086 submit_info.pWaitDstStageMask = flags;
21087 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21088 }
21089
21090 vkQueueWaitIdle(m_device->m_queue);
21091
21092 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21093 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21094 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21095
21096 m_errorMonitor->VerifyNotFound();
21097}
21098
21099// This is a positive test. No errors should be generated.
21100TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021101 TEST_DESCRIPTION(
21102 "Two command buffers, each in a separate QueueSubmit call "
21103 "submitted on separate queues, the second having a fence"
21104 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021105
Tony Barbour1fa09702017-03-16 12:09:08 -060021106 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021107 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021108
21109 m_errorMonitor->ExpectSuccess();
21110
21111 VkFence fence;
21112 VkFenceCreateInfo fence_create_info{};
21113 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21114 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21115
21116 VkSemaphore semaphore;
21117 VkSemaphoreCreateInfo semaphore_create_info{};
21118 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21119 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21120
21121 VkCommandPool command_pool;
21122 VkCommandPoolCreateInfo pool_create_info{};
21123 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21124 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21125 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21126 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21127
21128 VkCommandBuffer command_buffer[2];
21129 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21130 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21131 command_buffer_allocate_info.commandPool = command_pool;
21132 command_buffer_allocate_info.commandBufferCount = 2;
21133 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21134 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21135
21136 VkQueue queue = VK_NULL_HANDLE;
21137 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21138
21139 {
21140 VkCommandBufferBeginInfo begin_info{};
21141 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21142 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21143
21144 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 -070021145 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021146
21147 VkViewport viewport{};
21148 viewport.maxDepth = 1.0f;
21149 viewport.minDepth = 0.0f;
21150 viewport.width = 512;
21151 viewport.height = 512;
21152 viewport.x = 0;
21153 viewport.y = 0;
21154 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21155 vkEndCommandBuffer(command_buffer[0]);
21156 }
21157 {
21158 VkCommandBufferBeginInfo begin_info{};
21159 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21160 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21161
21162 VkViewport viewport{};
21163 viewport.maxDepth = 1.0f;
21164 viewport.minDepth = 0.0f;
21165 viewport.width = 512;
21166 viewport.height = 512;
21167 viewport.x = 0;
21168 viewport.y = 0;
21169 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21170 vkEndCommandBuffer(command_buffer[1]);
21171 }
21172 {
21173 VkSubmitInfo submit_info{};
21174 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21175 submit_info.commandBufferCount = 1;
21176 submit_info.pCommandBuffers = &command_buffer[0];
21177 submit_info.signalSemaphoreCount = 1;
21178 submit_info.pSignalSemaphores = &semaphore;
21179 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21180 }
21181 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021182 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021183 VkSubmitInfo submit_info{};
21184 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21185 submit_info.commandBufferCount = 1;
21186 submit_info.pCommandBuffers = &command_buffer[1];
21187 submit_info.waitSemaphoreCount = 1;
21188 submit_info.pWaitSemaphores = &semaphore;
21189 submit_info.pWaitDstStageMask = flags;
21190 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21191 }
21192
21193 vkQueueWaitIdle(m_device->m_queue);
21194
21195 vkDestroyFence(m_device->device(), fence, nullptr);
21196 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21197 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21198 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21199
21200 m_errorMonitor->VerifyNotFound();
21201}
21202
21203// This is a positive test. No errors should be generated.
21204TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021205 TEST_DESCRIPTION(
21206 "Two command buffers, each in a separate QueueSubmit call "
21207 "submitted on separate queues, the second having a fence"
21208 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021209
Tony Barbour1fa09702017-03-16 12:09:08 -060021210 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021211 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021212
21213 m_errorMonitor->ExpectSuccess();
21214
21215 VkFence fence;
21216 VkFenceCreateInfo fence_create_info{};
21217 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21218 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21219
21220 VkSemaphore semaphore;
21221 VkSemaphoreCreateInfo semaphore_create_info{};
21222 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21223 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21224
21225 VkCommandPool command_pool;
21226 VkCommandPoolCreateInfo pool_create_info{};
21227 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21228 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21229 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21230 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21231
21232 VkCommandBuffer command_buffer[2];
21233 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21234 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21235 command_buffer_allocate_info.commandPool = command_pool;
21236 command_buffer_allocate_info.commandBufferCount = 2;
21237 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21238 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21239
21240 VkQueue queue = VK_NULL_HANDLE;
21241 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21242
21243 {
21244 VkCommandBufferBeginInfo begin_info{};
21245 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21246 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21247
21248 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 -070021249 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021250
21251 VkViewport viewport{};
21252 viewport.maxDepth = 1.0f;
21253 viewport.minDepth = 0.0f;
21254 viewport.width = 512;
21255 viewport.height = 512;
21256 viewport.x = 0;
21257 viewport.y = 0;
21258 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21259 vkEndCommandBuffer(command_buffer[0]);
21260 }
21261 {
21262 VkCommandBufferBeginInfo begin_info{};
21263 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21264 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21265
21266 VkViewport viewport{};
21267 viewport.maxDepth = 1.0f;
21268 viewport.minDepth = 0.0f;
21269 viewport.width = 512;
21270 viewport.height = 512;
21271 viewport.x = 0;
21272 viewport.y = 0;
21273 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21274 vkEndCommandBuffer(command_buffer[1]);
21275 }
21276 {
21277 VkSubmitInfo submit_info{};
21278 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21279 submit_info.commandBufferCount = 1;
21280 submit_info.pCommandBuffers = &command_buffer[0];
21281 submit_info.signalSemaphoreCount = 1;
21282 submit_info.pSignalSemaphores = &semaphore;
21283 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21284 }
21285 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021286 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021287 VkSubmitInfo submit_info{};
21288 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21289 submit_info.commandBufferCount = 1;
21290 submit_info.pCommandBuffers = &command_buffer[1];
21291 submit_info.waitSemaphoreCount = 1;
21292 submit_info.pWaitSemaphores = &semaphore;
21293 submit_info.pWaitDstStageMask = flags;
21294 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21295 }
21296
21297 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21298 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21299
21300 vkDestroyFence(m_device->device(), fence, nullptr);
21301 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21302 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21303 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21304
21305 m_errorMonitor->VerifyNotFound();
21306}
21307
21308TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021310 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021311 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021312 return;
21313 }
21314
21315 VkResult err;
21316
21317 m_errorMonitor->ExpectSuccess();
21318
21319 VkQueue q0 = m_device->m_queue;
21320 VkQueue q1 = nullptr;
21321 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21322 ASSERT_NE(q1, nullptr);
21323
21324 // An (empty) command buffer. We must have work in the first submission --
21325 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021326 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021327 VkCommandPool pool;
21328 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21329 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021330 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21331 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021332 VkCommandBuffer cb;
21333 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21334 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021335 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021336 err = vkBeginCommandBuffer(cb, &cbbi);
21337 ASSERT_VK_SUCCESS(err);
21338 err = vkEndCommandBuffer(cb);
21339 ASSERT_VK_SUCCESS(err);
21340
21341 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021342 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021343 VkSemaphore s;
21344 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21345 ASSERT_VK_SUCCESS(err);
21346
21347 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021348 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021349
21350 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21351 ASSERT_VK_SUCCESS(err);
21352
21353 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021354 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021355 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021356
21357 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21358 ASSERT_VK_SUCCESS(err);
21359
21360 // Wait for q0 idle
21361 err = vkQueueWaitIdle(q0);
21362 ASSERT_VK_SUCCESS(err);
21363
21364 // Command buffer should have been completed (it was on q0); reset the pool.
21365 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21366
21367 m_errorMonitor->VerifyNotFound();
21368
21369 // Force device completely idle and clean up resources
21370 vkDeviceWaitIdle(m_device->device());
21371 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21372 vkDestroySemaphore(m_device->device(), s, nullptr);
21373}
21374
21375// This is a positive test. No errors should be generated.
21376TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021377 TEST_DESCRIPTION(
21378 "Two command buffers, each in a separate QueueSubmit call "
21379 "submitted on separate queues, the second having a fence, "
21380 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021381
Tony Barbour1fa09702017-03-16 12:09:08 -060021382 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021383 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021384
21385 m_errorMonitor->ExpectSuccess();
21386
Tony Barbour1fa09702017-03-16 12:09:08 -060021387 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021388 VkFence fence;
21389 VkFenceCreateInfo fence_create_info{};
21390 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21391 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21392
21393 VkSemaphore semaphore;
21394 VkSemaphoreCreateInfo semaphore_create_info{};
21395 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21396 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21397
21398 VkCommandPool command_pool;
21399 VkCommandPoolCreateInfo pool_create_info{};
21400 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21401 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21402 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21403 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21404
21405 VkCommandBuffer command_buffer[2];
21406 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21407 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21408 command_buffer_allocate_info.commandPool = command_pool;
21409 command_buffer_allocate_info.commandBufferCount = 2;
21410 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21411 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21412
21413 VkQueue queue = VK_NULL_HANDLE;
21414 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21415
21416 {
21417 VkCommandBufferBeginInfo begin_info{};
21418 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21419 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21420
21421 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 -070021422 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021423
21424 VkViewport viewport{};
21425 viewport.maxDepth = 1.0f;
21426 viewport.minDepth = 0.0f;
21427 viewport.width = 512;
21428 viewport.height = 512;
21429 viewport.x = 0;
21430 viewport.y = 0;
21431 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21432 vkEndCommandBuffer(command_buffer[0]);
21433 }
21434 {
21435 VkCommandBufferBeginInfo begin_info{};
21436 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21437 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21438
21439 VkViewport viewport{};
21440 viewport.maxDepth = 1.0f;
21441 viewport.minDepth = 0.0f;
21442 viewport.width = 512;
21443 viewport.height = 512;
21444 viewport.x = 0;
21445 viewport.y = 0;
21446 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21447 vkEndCommandBuffer(command_buffer[1]);
21448 }
21449 {
21450 VkSubmitInfo submit_info{};
21451 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21452 submit_info.commandBufferCount = 1;
21453 submit_info.pCommandBuffers = &command_buffer[0];
21454 submit_info.signalSemaphoreCount = 1;
21455 submit_info.pSignalSemaphores = &semaphore;
21456 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21457 }
21458 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021459 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021460 VkSubmitInfo submit_info{};
21461 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21462 submit_info.commandBufferCount = 1;
21463 submit_info.pCommandBuffers = &command_buffer[1];
21464 submit_info.waitSemaphoreCount = 1;
21465 submit_info.pWaitSemaphores = &semaphore;
21466 submit_info.pWaitDstStageMask = flags;
21467 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21468 }
21469
21470 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21471
21472 vkDestroyFence(m_device->device(), fence, nullptr);
21473 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21474 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21475 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21476
21477 m_errorMonitor->VerifyNotFound();
21478}
21479
21480// This is a positive test. No errors should be generated.
21481TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021482 TEST_DESCRIPTION(
21483 "Two command buffers, each in a separate QueueSubmit call "
21484 "on the same queue, sharing a signal/wait semaphore, the "
21485 "second having a fence, "
21486 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021487
21488 m_errorMonitor->ExpectSuccess();
21489
Tony Barbour1fa09702017-03-16 12:09:08 -060021490 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021491 VkFence fence;
21492 VkFenceCreateInfo fence_create_info{};
21493 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21494 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21495
21496 VkSemaphore semaphore;
21497 VkSemaphoreCreateInfo semaphore_create_info{};
21498 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21499 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21500
21501 VkCommandPool command_pool;
21502 VkCommandPoolCreateInfo pool_create_info{};
21503 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21504 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21505 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21506 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21507
21508 VkCommandBuffer command_buffer[2];
21509 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21510 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21511 command_buffer_allocate_info.commandPool = command_pool;
21512 command_buffer_allocate_info.commandBufferCount = 2;
21513 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21514 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21515
21516 {
21517 VkCommandBufferBeginInfo begin_info{};
21518 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21519 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21520
21521 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 -070021522 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021523
21524 VkViewport viewport{};
21525 viewport.maxDepth = 1.0f;
21526 viewport.minDepth = 0.0f;
21527 viewport.width = 512;
21528 viewport.height = 512;
21529 viewport.x = 0;
21530 viewport.y = 0;
21531 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21532 vkEndCommandBuffer(command_buffer[0]);
21533 }
21534 {
21535 VkCommandBufferBeginInfo begin_info{};
21536 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21537 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21538
21539 VkViewport viewport{};
21540 viewport.maxDepth = 1.0f;
21541 viewport.minDepth = 0.0f;
21542 viewport.width = 512;
21543 viewport.height = 512;
21544 viewport.x = 0;
21545 viewport.y = 0;
21546 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21547 vkEndCommandBuffer(command_buffer[1]);
21548 }
21549 {
21550 VkSubmitInfo submit_info{};
21551 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21552 submit_info.commandBufferCount = 1;
21553 submit_info.pCommandBuffers = &command_buffer[0];
21554 submit_info.signalSemaphoreCount = 1;
21555 submit_info.pSignalSemaphores = &semaphore;
21556 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21557 }
21558 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021559 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021560 VkSubmitInfo submit_info{};
21561 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21562 submit_info.commandBufferCount = 1;
21563 submit_info.pCommandBuffers = &command_buffer[1];
21564 submit_info.waitSemaphoreCount = 1;
21565 submit_info.pWaitSemaphores = &semaphore;
21566 submit_info.pWaitDstStageMask = flags;
21567 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21568 }
21569
21570 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21571
21572 vkDestroyFence(m_device->device(), fence, nullptr);
21573 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21574 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21575 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21576
21577 m_errorMonitor->VerifyNotFound();
21578}
21579
21580// This is a positive test. No errors should be generated.
21581TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021582 TEST_DESCRIPTION(
21583 "Two command buffers, each in a separate QueueSubmit call "
21584 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21585 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021586
21587 m_errorMonitor->ExpectSuccess();
21588
Tony Barbour1fa09702017-03-16 12:09:08 -060021589 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021590 VkFence fence;
21591 VkFenceCreateInfo fence_create_info{};
21592 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21593 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21594
21595 VkCommandPool command_pool;
21596 VkCommandPoolCreateInfo pool_create_info{};
21597 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21598 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21599 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21600 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21601
21602 VkCommandBuffer command_buffer[2];
21603 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21604 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21605 command_buffer_allocate_info.commandPool = command_pool;
21606 command_buffer_allocate_info.commandBufferCount = 2;
21607 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21608 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21609
21610 {
21611 VkCommandBufferBeginInfo begin_info{};
21612 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21613 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21614
21615 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 -070021616 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021617
21618 VkViewport viewport{};
21619 viewport.maxDepth = 1.0f;
21620 viewport.minDepth = 0.0f;
21621 viewport.width = 512;
21622 viewport.height = 512;
21623 viewport.x = 0;
21624 viewport.y = 0;
21625 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21626 vkEndCommandBuffer(command_buffer[0]);
21627 }
21628 {
21629 VkCommandBufferBeginInfo begin_info{};
21630 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21631 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21632
21633 VkViewport viewport{};
21634 viewport.maxDepth = 1.0f;
21635 viewport.minDepth = 0.0f;
21636 viewport.width = 512;
21637 viewport.height = 512;
21638 viewport.x = 0;
21639 viewport.y = 0;
21640 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21641 vkEndCommandBuffer(command_buffer[1]);
21642 }
21643 {
21644 VkSubmitInfo submit_info{};
21645 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21646 submit_info.commandBufferCount = 1;
21647 submit_info.pCommandBuffers = &command_buffer[0];
21648 submit_info.signalSemaphoreCount = 0;
21649 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21650 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21651 }
21652 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021653 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021654 VkSubmitInfo submit_info{};
21655 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21656 submit_info.commandBufferCount = 1;
21657 submit_info.pCommandBuffers = &command_buffer[1];
21658 submit_info.waitSemaphoreCount = 0;
21659 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21660 submit_info.pWaitDstStageMask = flags;
21661 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21662 }
21663
21664 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21665
21666 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21667 ASSERT_VK_SUCCESS(err);
21668
21669 vkDestroyFence(m_device->device(), fence, nullptr);
21670 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21671 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21672
21673 m_errorMonitor->VerifyNotFound();
21674}
21675
21676// This is a positive test. No errors should be generated.
21677TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021678 TEST_DESCRIPTION(
21679 "Two command buffers, each in a separate QueueSubmit call "
21680 "on the same queue, the second having a fence, followed "
21681 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021682
21683 m_errorMonitor->ExpectSuccess();
21684
Tony Barbour1fa09702017-03-16 12:09:08 -060021685 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021686 VkFence fence;
21687 VkFenceCreateInfo fence_create_info{};
21688 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21689 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21690
21691 VkCommandPool command_pool;
21692 VkCommandPoolCreateInfo pool_create_info{};
21693 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21694 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21695 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21696 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21697
21698 VkCommandBuffer command_buffer[2];
21699 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21700 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21701 command_buffer_allocate_info.commandPool = command_pool;
21702 command_buffer_allocate_info.commandBufferCount = 2;
21703 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21704 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21705
21706 {
21707 VkCommandBufferBeginInfo begin_info{};
21708 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21709 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21710
21711 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 -070021712 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021713
21714 VkViewport viewport{};
21715 viewport.maxDepth = 1.0f;
21716 viewport.minDepth = 0.0f;
21717 viewport.width = 512;
21718 viewport.height = 512;
21719 viewport.x = 0;
21720 viewport.y = 0;
21721 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21722 vkEndCommandBuffer(command_buffer[0]);
21723 }
21724 {
21725 VkCommandBufferBeginInfo begin_info{};
21726 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21727 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21728
21729 VkViewport viewport{};
21730 viewport.maxDepth = 1.0f;
21731 viewport.minDepth = 0.0f;
21732 viewport.width = 512;
21733 viewport.height = 512;
21734 viewport.x = 0;
21735 viewport.y = 0;
21736 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21737 vkEndCommandBuffer(command_buffer[1]);
21738 }
21739 {
21740 VkSubmitInfo submit_info{};
21741 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21742 submit_info.commandBufferCount = 1;
21743 submit_info.pCommandBuffers = &command_buffer[0];
21744 submit_info.signalSemaphoreCount = 0;
21745 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21746 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21747 }
21748 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021749 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021750 VkSubmitInfo submit_info{};
21751 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21752 submit_info.commandBufferCount = 1;
21753 submit_info.pCommandBuffers = &command_buffer[1];
21754 submit_info.waitSemaphoreCount = 0;
21755 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21756 submit_info.pWaitDstStageMask = flags;
21757 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21758 }
21759
21760 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21761
21762 vkDestroyFence(m_device->device(), fence, nullptr);
21763 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21764 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21765
21766 m_errorMonitor->VerifyNotFound();
21767}
21768
21769// This is a positive test. No errors should be generated.
21770TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021771 TEST_DESCRIPTION(
21772 "Two command buffers each in a separate SubmitInfo sent in a single "
21773 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021774 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021775
21776 m_errorMonitor->ExpectSuccess();
21777
21778 VkFence fence;
21779 VkFenceCreateInfo fence_create_info{};
21780 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21781 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21782
21783 VkSemaphore semaphore;
21784 VkSemaphoreCreateInfo semaphore_create_info{};
21785 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21786 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21787
21788 VkCommandPool command_pool;
21789 VkCommandPoolCreateInfo pool_create_info{};
21790 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21791 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21792 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21793 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21794
21795 VkCommandBuffer command_buffer[2];
21796 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21797 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21798 command_buffer_allocate_info.commandPool = command_pool;
21799 command_buffer_allocate_info.commandBufferCount = 2;
21800 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21801 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21802
21803 {
21804 VkCommandBufferBeginInfo begin_info{};
21805 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21806 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21807
21808 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 -070021809 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021810
21811 VkViewport viewport{};
21812 viewport.maxDepth = 1.0f;
21813 viewport.minDepth = 0.0f;
21814 viewport.width = 512;
21815 viewport.height = 512;
21816 viewport.x = 0;
21817 viewport.y = 0;
21818 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21819 vkEndCommandBuffer(command_buffer[0]);
21820 }
21821 {
21822 VkCommandBufferBeginInfo begin_info{};
21823 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21824 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21825
21826 VkViewport viewport{};
21827 viewport.maxDepth = 1.0f;
21828 viewport.minDepth = 0.0f;
21829 viewport.width = 512;
21830 viewport.height = 512;
21831 viewport.x = 0;
21832 viewport.y = 0;
21833 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21834 vkEndCommandBuffer(command_buffer[1]);
21835 }
21836 {
21837 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021838 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021839
21840 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21841 submit_info[0].pNext = NULL;
21842 submit_info[0].commandBufferCount = 1;
21843 submit_info[0].pCommandBuffers = &command_buffer[0];
21844 submit_info[0].signalSemaphoreCount = 1;
21845 submit_info[0].pSignalSemaphores = &semaphore;
21846 submit_info[0].waitSemaphoreCount = 0;
21847 submit_info[0].pWaitSemaphores = NULL;
21848 submit_info[0].pWaitDstStageMask = 0;
21849
21850 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21851 submit_info[1].pNext = NULL;
21852 submit_info[1].commandBufferCount = 1;
21853 submit_info[1].pCommandBuffers = &command_buffer[1];
21854 submit_info[1].waitSemaphoreCount = 1;
21855 submit_info[1].pWaitSemaphores = &semaphore;
21856 submit_info[1].pWaitDstStageMask = flags;
21857 submit_info[1].signalSemaphoreCount = 0;
21858 submit_info[1].pSignalSemaphores = NULL;
21859 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21860 }
21861
21862 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21863
21864 vkDestroyFence(m_device->device(), fence, nullptr);
21865 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21866 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21867 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21868
21869 m_errorMonitor->VerifyNotFound();
21870}
21871
21872TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21873 m_errorMonitor->ExpectSuccess();
21874
Tony Barbour1fa09702017-03-16 12:09:08 -060021875 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21877
Tony Barbour552f6c02016-12-21 14:34:07 -070021878 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021879
21880 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21881 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21882 m_errorMonitor->VerifyNotFound();
21883 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21884 m_errorMonitor->VerifyNotFound();
21885 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21886 m_errorMonitor->VerifyNotFound();
21887
21888 m_commandBuffer->EndCommandBuffer();
21889 m_errorMonitor->VerifyNotFound();
21890}
21891
21892TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021893 TEST_DESCRIPTION(
21894 "Positive test where we create a renderpass with an "
21895 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21896 "has a valid layout, and a second subpass then uses a "
21897 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021898 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021899 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021900 auto depth_format = find_depth_stencil_format(m_device);
21901 if (!depth_format) {
21902 printf(" No Depth + Stencil format found. Skipped.\n");
21903 return;
21904 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021905
21906 VkAttachmentReference attach[2] = {};
21907 attach[0].attachment = 0;
21908 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21909 attach[1].attachment = 0;
21910 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21911 VkSubpassDescription subpasses[2] = {};
21912 // First subpass clears DS attach on load
21913 subpasses[0].pDepthStencilAttachment = &attach[0];
21914 // 2nd subpass reads in DS as input attachment
21915 subpasses[1].inputAttachmentCount = 1;
21916 subpasses[1].pInputAttachments = &attach[1];
21917 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021918 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021919 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21920 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21921 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21922 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21923 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21924 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21925 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21926 VkRenderPassCreateInfo rpci = {};
21927 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21928 rpci.attachmentCount = 1;
21929 rpci.pAttachments = &attach_desc;
21930 rpci.subpassCount = 2;
21931 rpci.pSubpasses = subpasses;
21932
21933 // Now create RenderPass and verify no errors
21934 VkRenderPass rp;
21935 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21936 m_errorMonitor->VerifyNotFound();
21937
21938 vkDestroyRenderPass(m_device->device(), rp, NULL);
21939}
21940
Tobin Ehlis01103de2017-02-16 13:22:47 -070021941TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21942 TEST_DESCRIPTION(
21943 "Create a render pass with depth-stencil attachment where layout transition "
21944 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21945 "transition has correctly occurred at queue submit time with no validation errors.");
21946
Tony Barbour1fa09702017-03-16 12:09:08 -060021947 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021948 auto depth_format = find_depth_stencil_format(m_device);
21949 if (!depth_format) {
21950 printf(" No Depth + Stencil format found. Skipped.\n");
21951 return;
21952 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021953 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021954 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021955 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21956 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021957 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021958 return;
21959 }
21960
21961 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021962 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21963
21964 // A renderpass with one depth/stencil attachment.
21965 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021966 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021967 VK_SAMPLE_COUNT_1_BIT,
21968 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21969 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21970 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21971 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21972 VK_IMAGE_LAYOUT_UNDEFINED,
21973 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21974
21975 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21976
21977 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21978
21979 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21980
21981 VkRenderPass rp;
21982 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21983 ASSERT_VK_SUCCESS(err);
21984 // A compatible ds image.
21985 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021986 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 -070021987 ASSERT_TRUE(image.initialized());
21988
21989 VkImageViewCreateInfo ivci = {
21990 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21991 nullptr,
21992 0,
21993 image.handle(),
21994 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021995 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021996 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21997 VK_COMPONENT_SWIZZLE_IDENTITY},
21998 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21999 };
22000 VkImageView view;
22001 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
22002 ASSERT_VK_SUCCESS(err);
22003
22004 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22005 VkFramebuffer fb;
22006 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22007 ASSERT_VK_SUCCESS(err);
22008
22009 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22010 m_commandBuffer->BeginCommandBuffer();
22011 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22012 vkCmdEndRenderPass(m_commandBuffer->handle());
22013 m_commandBuffer->EndCommandBuffer();
22014 QueueCommandBuffer(false);
22015 m_errorMonitor->VerifyNotFound();
22016
22017 // Cleanup
22018 vkDestroyImageView(m_device->device(), view, NULL);
22019 vkDestroyRenderPass(m_device->device(), rp, NULL);
22020 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22021}
22022
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022023TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022024 TEST_DESCRIPTION(
22025 "Test that pipeline validation accepts matrices passed "
22026 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022027 m_errorMonitor->ExpectSuccess();
22028
Tony Barbour1fa09702017-03-16 12:09:08 -060022029 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022030 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22031
22032 VkVertexInputBindingDescription input_binding;
22033 memset(&input_binding, 0, sizeof(input_binding));
22034
22035 VkVertexInputAttributeDescription input_attribs[2];
22036 memset(input_attribs, 0, sizeof(input_attribs));
22037
22038 for (int i = 0; i < 2; i++) {
22039 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22040 input_attribs[i].location = i;
22041 }
22042
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022043 char const *vsSource =
22044 "#version 450\n"
22045 "\n"
22046 "layout(location=0) in mat2x4 x;\n"
22047 "out gl_PerVertex {\n"
22048 " vec4 gl_Position;\n"
22049 "};\n"
22050 "void main(){\n"
22051 " gl_Position = x[0] + x[1];\n"
22052 "}\n";
22053 char const *fsSource =
22054 "#version 450\n"
22055 "\n"
22056 "layout(location=0) out vec4 color;\n"
22057 "void main(){\n"
22058 " color = vec4(1);\n"
22059 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022060
22061 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22062 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22063
22064 VkPipelineObj pipe(m_device);
22065 pipe.AddColorAttachment();
22066 pipe.AddShader(&vs);
22067 pipe.AddShader(&fs);
22068
22069 pipe.AddVertexInputBindings(&input_binding, 1);
22070 pipe.AddVertexInputAttribs(input_attribs, 2);
22071
22072 VkDescriptorSetObj descriptorSet(m_device);
22073 descriptorSet.AppendDummy();
22074 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22075
22076 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22077
22078 /* expect success */
22079 m_errorMonitor->VerifyNotFound();
22080}
22081
22082TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22083 m_errorMonitor->ExpectSuccess();
22084
Tony Barbour1fa09702017-03-16 12:09:08 -060022085 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022086 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22087
22088 VkVertexInputBindingDescription input_binding;
22089 memset(&input_binding, 0, sizeof(input_binding));
22090
22091 VkVertexInputAttributeDescription input_attribs[2];
22092 memset(input_attribs, 0, sizeof(input_attribs));
22093
22094 for (int i = 0; i < 2; i++) {
22095 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22096 input_attribs[i].location = i;
22097 }
22098
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022099 char const *vsSource =
22100 "#version 450\n"
22101 "\n"
22102 "layout(location=0) in vec4 x[2];\n"
22103 "out gl_PerVertex {\n"
22104 " vec4 gl_Position;\n"
22105 "};\n"
22106 "void main(){\n"
22107 " gl_Position = x[0] + x[1];\n"
22108 "}\n";
22109 char const *fsSource =
22110 "#version 450\n"
22111 "\n"
22112 "layout(location=0) out vec4 color;\n"
22113 "void main(){\n"
22114 " color = vec4(1);\n"
22115 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022116
22117 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22118 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22119
22120 VkPipelineObj pipe(m_device);
22121 pipe.AddColorAttachment();
22122 pipe.AddShader(&vs);
22123 pipe.AddShader(&fs);
22124
22125 pipe.AddVertexInputBindings(&input_binding, 1);
22126 pipe.AddVertexInputAttribs(input_attribs, 2);
22127
22128 VkDescriptorSetObj descriptorSet(m_device);
22129 descriptorSet.AppendDummy();
22130 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22131
22132 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22133
22134 m_errorMonitor->VerifyNotFound();
22135}
22136
22137TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022138 TEST_DESCRIPTION(
22139 "Test that pipeline validation accepts consuming a vertex attribute "
22140 "through multiple vertex shader inputs, each consuming a different "
22141 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022142 m_errorMonitor->ExpectSuccess();
22143
Tony Barbour1fa09702017-03-16 12:09:08 -060022144 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22146
22147 VkVertexInputBindingDescription input_binding;
22148 memset(&input_binding, 0, sizeof(input_binding));
22149
22150 VkVertexInputAttributeDescription input_attribs[3];
22151 memset(input_attribs, 0, sizeof(input_attribs));
22152
22153 for (int i = 0; i < 3; i++) {
22154 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22155 input_attribs[i].location = i;
22156 }
22157
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022158 char const *vsSource =
22159 "#version 450\n"
22160 "\n"
22161 "layout(location=0) in vec4 x;\n"
22162 "layout(location=1) in vec3 y1;\n"
22163 "layout(location=1, component=3) in float y2;\n"
22164 "layout(location=2) in vec4 z;\n"
22165 "out gl_PerVertex {\n"
22166 " vec4 gl_Position;\n"
22167 "};\n"
22168 "void main(){\n"
22169 " gl_Position = x + vec4(y1, y2) + z;\n"
22170 "}\n";
22171 char const *fsSource =
22172 "#version 450\n"
22173 "\n"
22174 "layout(location=0) out vec4 color;\n"
22175 "void main(){\n"
22176 " color = vec4(1);\n"
22177 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022178
22179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22181
22182 VkPipelineObj pipe(m_device);
22183 pipe.AddColorAttachment();
22184 pipe.AddShader(&vs);
22185 pipe.AddShader(&fs);
22186
22187 pipe.AddVertexInputBindings(&input_binding, 1);
22188 pipe.AddVertexInputAttribs(input_attribs, 3);
22189
22190 VkDescriptorSetObj descriptorSet(m_device);
22191 descriptorSet.AppendDummy();
22192 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22193
22194 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22195
22196 m_errorMonitor->VerifyNotFound();
22197}
22198
22199TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22200 m_errorMonitor->ExpectSuccess();
22201
Tony Barbour1fa09702017-03-16 12:09:08 -060022202 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022203 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22204
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022205 char const *vsSource =
22206 "#version 450\n"
22207 "out gl_PerVertex {\n"
22208 " vec4 gl_Position;\n"
22209 "};\n"
22210 "void main(){\n"
22211 " gl_Position = vec4(0);\n"
22212 "}\n";
22213 char const *fsSource =
22214 "#version 450\n"
22215 "\n"
22216 "layout(location=0) out vec4 color;\n"
22217 "void main(){\n"
22218 " color = vec4(1);\n"
22219 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022220
22221 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22222 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22223
22224 VkPipelineObj pipe(m_device);
22225 pipe.AddColorAttachment();
22226 pipe.AddShader(&vs);
22227 pipe.AddShader(&fs);
22228
22229 VkDescriptorSetObj descriptorSet(m_device);
22230 descriptorSet.AppendDummy();
22231 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22232
22233 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22234
22235 m_errorMonitor->VerifyNotFound();
22236}
22237
22238TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022239 TEST_DESCRIPTION(
22240 "Test that pipeline validation accepts the relaxed type matching rules "
22241 "set out in 14.1.3: fundamental type must match, and producer side must "
22242 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022243 m_errorMonitor->ExpectSuccess();
22244
22245 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22246
Tony Barbour1fa09702017-03-16 12:09:08 -060022247 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022248 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22249
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022250 char const *vsSource =
22251 "#version 450\n"
22252 "out gl_PerVertex {\n"
22253 " vec4 gl_Position;\n"
22254 "};\n"
22255 "layout(location=0) out vec3 x;\n"
22256 "layout(location=1) out ivec3 y;\n"
22257 "layout(location=2) out vec3 z;\n"
22258 "void main(){\n"
22259 " gl_Position = vec4(0);\n"
22260 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22261 "}\n";
22262 char const *fsSource =
22263 "#version 450\n"
22264 "\n"
22265 "layout(location=0) out vec4 color;\n"
22266 "layout(location=0) in float x;\n"
22267 "layout(location=1) flat in int y;\n"
22268 "layout(location=2) in vec2 z;\n"
22269 "void main(){\n"
22270 " color = vec4(1 + x + y + z.x);\n"
22271 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022272
22273 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22274 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22275
22276 VkPipelineObj pipe(m_device);
22277 pipe.AddColorAttachment();
22278 pipe.AddShader(&vs);
22279 pipe.AddShader(&fs);
22280
22281 VkDescriptorSetObj descriptorSet(m_device);
22282 descriptorSet.AppendDummy();
22283 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22284
22285 VkResult err = VK_SUCCESS;
22286 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22287 ASSERT_VK_SUCCESS(err);
22288
22289 m_errorMonitor->VerifyNotFound();
22290}
22291
22292TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022293 TEST_DESCRIPTION(
22294 "Test that pipeline validation accepts per-vertex variables "
22295 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022296 m_errorMonitor->ExpectSuccess();
22297
Tony Barbour1fa09702017-03-16 12:09:08 -060022298 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22300
22301 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022302 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022303 return;
22304 }
22305
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022306 char const *vsSource =
22307 "#version 450\n"
22308 "void main(){}\n";
22309 char const *tcsSource =
22310 "#version 450\n"
22311 "layout(location=0) out int x[];\n"
22312 "layout(vertices=3) out;\n"
22313 "void main(){\n"
22314 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22315 " gl_TessLevelInner[0] = 1;\n"
22316 " x[gl_InvocationID] = gl_InvocationID;\n"
22317 "}\n";
22318 char const *tesSource =
22319 "#version 450\n"
22320 "layout(triangles, equal_spacing, cw) in;\n"
22321 "layout(location=0) in int x[];\n"
22322 "out gl_PerVertex { vec4 gl_Position; };\n"
22323 "void main(){\n"
22324 " gl_Position.xyz = gl_TessCoord;\n"
22325 " gl_Position.w = x[0] + x[1] + x[2];\n"
22326 "}\n";
22327 char const *fsSource =
22328 "#version 450\n"
22329 "layout(location=0) out vec4 color;\n"
22330 "void main(){\n"
22331 " color = vec4(1);\n"
22332 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022333
22334 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22335 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22336 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22337 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22338
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022339 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22340 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022341
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022342 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022343
22344 VkPipelineObj pipe(m_device);
22345 pipe.SetInputAssembly(&iasci);
22346 pipe.SetTessellation(&tsci);
22347 pipe.AddColorAttachment();
22348 pipe.AddShader(&vs);
22349 pipe.AddShader(&tcs);
22350 pipe.AddShader(&tes);
22351 pipe.AddShader(&fs);
22352
22353 VkDescriptorSetObj descriptorSet(m_device);
22354 descriptorSet.AppendDummy();
22355 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22356
22357 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22358
22359 m_errorMonitor->VerifyNotFound();
22360}
22361
22362TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022363 TEST_DESCRIPTION(
22364 "Test that pipeline validation accepts a user-defined "
22365 "interface block passed into the geometry shader. This "
22366 "is interesting because the 'extra' array level is not "
22367 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022368 m_errorMonitor->ExpectSuccess();
22369
Tony Barbour1fa09702017-03-16 12:09:08 -060022370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022371 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22372
22373 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022374 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022375 return;
22376 }
22377
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022378 char const *vsSource =
22379 "#version 450\n"
22380 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22381 "void main(){\n"
22382 " vs_out.x = vec4(1);\n"
22383 "}\n";
22384 char const *gsSource =
22385 "#version 450\n"
22386 "layout(triangles) in;\n"
22387 "layout(triangle_strip, max_vertices=3) out;\n"
22388 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22389 "out gl_PerVertex { vec4 gl_Position; };\n"
22390 "void main() {\n"
22391 " gl_Position = gs_in[0].x;\n"
22392 " EmitVertex();\n"
22393 "}\n";
22394 char const *fsSource =
22395 "#version 450\n"
22396 "layout(location=0) out vec4 color;\n"
22397 "void main(){\n"
22398 " color = vec4(1);\n"
22399 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022400
22401 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22402 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22403 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22404
22405 VkPipelineObj pipe(m_device);
22406 pipe.AddColorAttachment();
22407 pipe.AddShader(&vs);
22408 pipe.AddShader(&gs);
22409 pipe.AddShader(&fs);
22410
22411 VkDescriptorSetObj descriptorSet(m_device);
22412 descriptorSet.AppendDummy();
22413 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22414
22415 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22416
22417 m_errorMonitor->VerifyNotFound();
22418}
22419
22420TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022421 TEST_DESCRIPTION(
22422 "Test that pipeline validation accepts basic use of 64bit vertex "
22423 "attributes. This is interesting because they consume multiple "
22424 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022425 m_errorMonitor->ExpectSuccess();
22426
Tony Barbour1fa09702017-03-16 12:09:08 -060022427 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22429
22430 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022431 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022432 return;
22433 }
22434
22435 VkVertexInputBindingDescription input_bindings[1];
22436 memset(input_bindings, 0, sizeof(input_bindings));
22437
22438 VkVertexInputAttributeDescription input_attribs[4];
22439 memset(input_attribs, 0, sizeof(input_attribs));
22440 input_attribs[0].location = 0;
22441 input_attribs[0].offset = 0;
22442 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22443 input_attribs[1].location = 2;
22444 input_attribs[1].offset = 32;
22445 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22446 input_attribs[2].location = 4;
22447 input_attribs[2].offset = 64;
22448 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22449 input_attribs[3].location = 6;
22450 input_attribs[3].offset = 96;
22451 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22452
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022453 char const *vsSource =
22454 "#version 450\n"
22455 "\n"
22456 "layout(location=0) in dmat4 x;\n"
22457 "out gl_PerVertex {\n"
22458 " vec4 gl_Position;\n"
22459 "};\n"
22460 "void main(){\n"
22461 " gl_Position = vec4(x[0][0]);\n"
22462 "}\n";
22463 char const *fsSource =
22464 "#version 450\n"
22465 "\n"
22466 "layout(location=0) out vec4 color;\n"
22467 "void main(){\n"
22468 " color = vec4(1);\n"
22469 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022470
22471 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22472 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22473
22474 VkPipelineObj pipe(m_device);
22475 pipe.AddColorAttachment();
22476 pipe.AddShader(&vs);
22477 pipe.AddShader(&fs);
22478
22479 pipe.AddVertexInputBindings(input_bindings, 1);
22480 pipe.AddVertexInputAttribs(input_attribs, 4);
22481
22482 VkDescriptorSetObj descriptorSet(m_device);
22483 descriptorSet.AppendDummy();
22484 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22485
22486 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22487
22488 m_errorMonitor->VerifyNotFound();
22489}
22490
22491TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22492 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22493 m_errorMonitor->ExpectSuccess();
22494
Tony Barbour1fa09702017-03-16 12:09:08 -060022495 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022496
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022497 char const *vsSource =
22498 "#version 450\n"
22499 "\n"
22500 "out gl_PerVertex {\n"
22501 " vec4 gl_Position;\n"
22502 "};\n"
22503 "void main(){\n"
22504 " gl_Position = vec4(1);\n"
22505 "}\n";
22506 char const *fsSource =
22507 "#version 450\n"
22508 "\n"
22509 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22510 "layout(location=0) out vec4 color;\n"
22511 "void main() {\n"
22512 " color = subpassLoad(x);\n"
22513 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022514
22515 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22516 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22517
22518 VkPipelineObj pipe(m_device);
22519 pipe.AddShader(&vs);
22520 pipe.AddShader(&fs);
22521 pipe.AddColorAttachment();
22522 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22523
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022524 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22525 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022526 VkDescriptorSetLayout dsl;
22527 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22528 ASSERT_VK_SUCCESS(err);
22529
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022530 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022531 VkPipelineLayout pl;
22532 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22533 ASSERT_VK_SUCCESS(err);
22534
22535 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022536 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22537 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22538 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22539 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22540 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 -060022541 };
22542 VkAttachmentReference color = {
22543 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22544 };
22545 VkAttachmentReference input = {
22546 1, VK_IMAGE_LAYOUT_GENERAL,
22547 };
22548
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022549 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022550
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022551 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022552 VkRenderPass rp;
22553 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22554 ASSERT_VK_SUCCESS(err);
22555
22556 // should be OK. would go wrong here if it's going to...
22557 pipe.CreateVKPipeline(pl, rp);
22558
22559 m_errorMonitor->VerifyNotFound();
22560
22561 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22562 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22563 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22564}
22565
22566TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022567 TEST_DESCRIPTION(
22568 "Test that pipeline validation accepts a compute pipeline which declares a "
22569 "descriptor-backed resource which is not provided, but the shader does not "
22570 "statically use it. This is interesting because it requires compute pipelines "
22571 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022572 m_errorMonitor->ExpectSuccess();
22573
Tony Barbour1fa09702017-03-16 12:09:08 -060022574 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022575
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022576 char const *csSource =
22577 "#version 450\n"
22578 "\n"
22579 "layout(local_size_x=1) in;\n"
22580 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22581 "void main(){\n"
22582 " // x is not used.\n"
22583 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022584
22585 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22586
22587 VkDescriptorSetObj descriptorSet(m_device);
22588 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22589
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022590 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22591 nullptr,
22592 0,
22593 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22594 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22595 descriptorSet.GetPipelineLayout(),
22596 VK_NULL_HANDLE,
22597 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022598
22599 VkPipeline pipe;
22600 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22601
22602 m_errorMonitor->VerifyNotFound();
22603
22604 if (err == VK_SUCCESS) {
22605 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22606 }
22607}
22608
22609TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022610 TEST_DESCRIPTION(
22611 "Test that pipeline validation accepts a shader consuming only the "
22612 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022613 m_errorMonitor->ExpectSuccess();
22614
Tony Barbour1fa09702017-03-16 12:09:08 -060022615 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022616
22617 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022618 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22619 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22620 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022621 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022622 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022623 VkDescriptorSetLayout dsl;
22624 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22625 ASSERT_VK_SUCCESS(err);
22626
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022627 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022628 VkPipelineLayout pl;
22629 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22630 ASSERT_VK_SUCCESS(err);
22631
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022632 char const *csSource =
22633 "#version 450\n"
22634 "\n"
22635 "layout(local_size_x=1) in;\n"
22636 "layout(set=0, binding=0) uniform sampler s;\n"
22637 "layout(set=0, binding=1) uniform texture2D t;\n"
22638 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22639 "void main() {\n"
22640 " x = texture(sampler2D(t, s), vec2(0));\n"
22641 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022642 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22643
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022644 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22645 nullptr,
22646 0,
22647 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22648 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22649 pl,
22650 VK_NULL_HANDLE,
22651 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022652
22653 VkPipeline pipe;
22654 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22655
22656 m_errorMonitor->VerifyNotFound();
22657
22658 if (err == VK_SUCCESS) {
22659 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22660 }
22661
22662 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22663 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22664}
22665
22666TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022667 TEST_DESCRIPTION(
22668 "Test that pipeline validation accepts a shader consuming only the "
22669 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022670 m_errorMonitor->ExpectSuccess();
22671
Tony Barbour1fa09702017-03-16 12:09:08 -060022672 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022673
22674 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022675 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22676 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22677 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022678 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022679 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022680 VkDescriptorSetLayout dsl;
22681 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22682 ASSERT_VK_SUCCESS(err);
22683
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022684 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022685 VkPipelineLayout pl;
22686 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22687 ASSERT_VK_SUCCESS(err);
22688
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022689 char const *csSource =
22690 "#version 450\n"
22691 "\n"
22692 "layout(local_size_x=1) in;\n"
22693 "layout(set=0, binding=0) uniform texture2D t;\n"
22694 "layout(set=0, binding=1) uniform sampler s;\n"
22695 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22696 "void main() {\n"
22697 " x = texture(sampler2D(t, s), vec2(0));\n"
22698 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022699 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22700
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022701 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22702 nullptr,
22703 0,
22704 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22705 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22706 pl,
22707 VK_NULL_HANDLE,
22708 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022709
22710 VkPipeline pipe;
22711 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22712
22713 m_errorMonitor->VerifyNotFound();
22714
22715 if (err == VK_SUCCESS) {
22716 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22717 }
22718
22719 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22720 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22721}
22722
22723TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022724 TEST_DESCRIPTION(
22725 "Test that pipeline validation accepts a shader consuming "
22726 "both the sampler and the image of a combined image+sampler "
22727 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022728 m_errorMonitor->ExpectSuccess();
22729
Tony Barbour1fa09702017-03-16 12:09:08 -060022730 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022731
22732 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022733 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22734 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022735 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022736 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022737 VkDescriptorSetLayout dsl;
22738 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22739 ASSERT_VK_SUCCESS(err);
22740
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022741 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022742 VkPipelineLayout pl;
22743 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22744 ASSERT_VK_SUCCESS(err);
22745
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022746 char const *csSource =
22747 "#version 450\n"
22748 "\n"
22749 "layout(local_size_x=1) in;\n"
22750 "layout(set=0, binding=0) uniform texture2D t;\n"
22751 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22752 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22753 "void main() {\n"
22754 " x = texture(sampler2D(t, s), vec2(0));\n"
22755 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022756 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22757
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022758 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22759 nullptr,
22760 0,
22761 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22762 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22763 pl,
22764 VK_NULL_HANDLE,
22765 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022766
22767 VkPipeline pipe;
22768 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22769
22770 m_errorMonitor->VerifyNotFound();
22771
22772 if (err == VK_SUCCESS) {
22773 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22774 }
22775
22776 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22777 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22778}
22779
Tony Barbour3ed87a02017-03-15 16:19:02 -060022780TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022781 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22782
Tony Barbour3ed87a02017-03-15 16:19:02 -060022783 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022784 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022785
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022786 // Ensure that extension is available and enabled.
22787 uint32_t extension_count = 0;
22788 bool supports_maintenance1_extension = false;
22789 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22790 ASSERT_VK_SUCCESS(err);
22791 if (extension_count > 0) {
22792 std::vector<VkExtensionProperties> available_extensions(extension_count);
22793
22794 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22795 ASSERT_VK_SUCCESS(err);
22796 for (const auto &extension_props : available_extensions) {
22797 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22798 supports_maintenance1_extension = true;
22799 }
22800 }
22801 }
22802
22803 // Proceed if extension is supported by hardware
22804 if (!supports_maintenance1_extension) {
22805 printf(" Maintenance1 Extension not supported, skipping tests\n");
22806 return;
22807 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022808
22809 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022810 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022811 VkCommandBuffer cmd_buf;
22812 VkCommandBufferAllocateInfo alloc_info;
22813 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22814 alloc_info.pNext = NULL;
22815 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022816 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022817 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22818 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22819
22820 VkCommandBufferBeginInfo cb_binfo;
22821 cb_binfo.pNext = NULL;
22822 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22823 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22824 cb_binfo.flags = 0;
22825 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22826 // Set Negative height, should give error if Maintenance 1 is not enabled
22827 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22828 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22829 vkEndCommandBuffer(cmd_buf);
22830
22831 m_errorMonitor->VerifyNotFound();
22832}
22833
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022834TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22835 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22836
Tony Barbour1fa09702017-03-16 12:09:08 -060022837 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022838
22839 // Positive test to check parameter_validation and unique_objects support
22840 // for NV_dedicated_allocation
22841 uint32_t extension_count = 0;
22842 bool supports_nv_dedicated_allocation = false;
22843 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22844 ASSERT_VK_SUCCESS(err);
22845
22846 if (extension_count > 0) {
22847 std::vector<VkExtensionProperties> available_extensions(extension_count);
22848
22849 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22850 ASSERT_VK_SUCCESS(err);
22851
22852 for (const auto &extension_props : available_extensions) {
22853 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22854 supports_nv_dedicated_allocation = true;
22855 }
22856 }
22857 }
22858
22859 if (supports_nv_dedicated_allocation) {
22860 m_errorMonitor->ExpectSuccess();
22861
22862 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22863 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22864 dedicated_buffer_create_info.pNext = nullptr;
22865 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22866
22867 uint32_t queue_family_index = 0;
22868 VkBufferCreateInfo buffer_create_info = {};
22869 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22870 buffer_create_info.pNext = &dedicated_buffer_create_info;
22871 buffer_create_info.size = 1024;
22872 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22873 buffer_create_info.queueFamilyIndexCount = 1;
22874 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22875
22876 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022877 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022878 ASSERT_VK_SUCCESS(err);
22879
22880 VkMemoryRequirements memory_reqs;
22881 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22882
22883 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22884 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22885 dedicated_memory_info.pNext = nullptr;
22886 dedicated_memory_info.buffer = buffer;
22887 dedicated_memory_info.image = VK_NULL_HANDLE;
22888
22889 VkMemoryAllocateInfo memory_info = {};
22890 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22891 memory_info.pNext = &dedicated_memory_info;
22892 memory_info.allocationSize = memory_reqs.size;
22893
22894 bool pass;
22895 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22896 ASSERT_TRUE(pass);
22897
22898 VkDeviceMemory buffer_memory;
22899 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22900 ASSERT_VK_SUCCESS(err);
22901
22902 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22903 ASSERT_VK_SUCCESS(err);
22904
22905 vkDestroyBuffer(m_device->device(), buffer, NULL);
22906 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22907
22908 m_errorMonitor->VerifyNotFound();
22909 }
22910}
22911
22912TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22913 VkResult err;
22914
22915 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22916
Tony Barbour1fa09702017-03-16 12:09:08 -060022917 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022918 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22919
22920 std::vector<const char *> device_extension_names;
22921 auto features = m_device->phy().features();
22922 // Artificially disable support for non-solid fill modes
22923 features.fillModeNonSolid = false;
22924 // The sacrificial device object
22925 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22926
22927 VkRenderpassObj render_pass(&test_device);
22928
22929 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22930 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22931 pipeline_layout_ci.setLayoutCount = 0;
22932 pipeline_layout_ci.pSetLayouts = NULL;
22933
22934 VkPipelineLayout pipeline_layout;
22935 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22936 ASSERT_VK_SUCCESS(err);
22937
22938 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22939 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22940 rs_ci.pNext = nullptr;
22941 rs_ci.lineWidth = 1.0f;
22942 rs_ci.rasterizerDiscardEnable = true;
22943
22944 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22945 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22946
22947 // Set polygonMode=FILL. No error is expected
22948 m_errorMonitor->ExpectSuccess();
22949 {
22950 VkPipelineObj pipe(&test_device);
22951 pipe.AddShader(&vs);
22952 pipe.AddShader(&fs);
22953 pipe.AddColorAttachment();
22954 // Set polygonMode to a good value
22955 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22956 pipe.SetRasterization(&rs_ci);
22957 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22958 }
22959 m_errorMonitor->VerifyNotFound();
22960
22961 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
22962}
22963
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022964#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022965TEST_F(VkPositiveLayerTest, LongFenceChain)
22966{
22967 m_errorMonitor->ExpectSuccess();
22968
Tony Barbour1fa09702017-03-16 12:09:08 -060022969 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022970 VkResult err;
22971
22972 std::vector<VkFence> fences;
22973
22974 const int chainLength = 32768;
22975
22976 for (int i = 0; i < chainLength; i++) {
22977 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
22978 VkFence fence;
22979 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
22980 ASSERT_VK_SUCCESS(err);
22981
22982 fences.push_back(fence);
22983
22984 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
22985 0, nullptr, 0, nullptr };
22986 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
22987 ASSERT_VK_SUCCESS(err);
22988
22989 }
22990
22991 // BOOM, stack overflow.
22992 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
22993
22994 for (auto fence : fences)
22995 vkDestroyFence(m_device->device(), fence, nullptr);
22996
22997 m_errorMonitor->VerifyNotFound();
22998}
22999#endif
23000
Cody Northrop1242dfd2016-07-13 17:24:59 -060023001#if defined(ANDROID) && defined(VALIDATION_APK)
23002static bool initialized = false;
23003static bool active = false;
23004
23005// Convert Intents to argv
23006// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023007std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023008 std::vector<std::string> args;
23009 JavaVM &vm = *app.activity->vm;
23010 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023011 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023012
23013 JNIEnv &env = *p_env;
23014 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023015 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023016 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023017 jmethodID get_string_extra_method =
23018 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023019 jvalue get_string_extra_args;
23020 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023021 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023022
23023 std::string args_str;
23024 if (extra_str) {
23025 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23026 args_str = extra_utf;
23027 env.ReleaseStringUTFChars(extra_str, extra_utf);
23028 env.DeleteLocalRef(extra_str);
23029 }
23030
23031 env.DeleteLocalRef(get_string_extra_args.l);
23032 env.DeleteLocalRef(intent);
23033 vm.DetachCurrentThread();
23034
23035 // split args_str
23036 std::stringstream ss(args_str);
23037 std::string arg;
23038 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023039 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023040 }
23041
23042 return args;
23043}
23044
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023045static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023046
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023047static void processCommand(struct android_app *app, int32_t cmd) {
23048 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023049 case APP_CMD_INIT_WINDOW: {
23050 if (app->window) {
23051 initialized = true;
23052 }
23053 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023054 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023055 case APP_CMD_GAINED_FOCUS: {
23056 active = true;
23057 break;
23058 }
23059 case APP_CMD_LOST_FOCUS: {
23060 active = false;
23061 break;
23062 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023063 }
23064}
23065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023066void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023067 app_dummy();
23068
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023069 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023070
23071 int vulkanSupport = InitVulkan();
23072 if (vulkanSupport == 0) {
23073 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23074 return;
23075 }
23076
23077 app->onAppCmd = processCommand;
23078 app->onInputEvent = processInput;
23079
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023080 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023081 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023082 struct android_poll_source *source;
23083 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023084 if (source) {
23085 source->process(app, source);
23086 }
23087
23088 if (app->destroyRequested != 0) {
23089 VkTestFramework::Finish();
23090 return;
23091 }
23092 }
23093
23094 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023095 // Use the following key to send arguments to gtest, i.e.
23096 // --es args "--gtest_filter=-VkLayerTest.foo"
23097 const char key[] = "args";
23098 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023099
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023100 std::string filter = "";
23101 if (args.size() > 0) {
23102 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23103 filter += args[0];
23104 } else {
23105 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23106 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023108 int argc = 2;
23109 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23110 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023111
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023112 // Route output to files until we can override the gtest output
23113 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23114 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023116 ::testing::InitGoogleTest(&argc, argv);
23117 VkTestFramework::InitArgs(&argc, argv);
23118 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023120 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023121
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023122 if (result != 0) {
23123 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23124 } else {
23125 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23126 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023127
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023128 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023129
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023130 fclose(stdout);
23131 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023132
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023133 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023134 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023135 }
23136 }
23137}
23138#endif
23139
Tony Barbour300a6082015-04-07 13:44:53 -060023140int main(int argc, char **argv) {
23141 int result;
23142
Cody Northrop8e54a402016-03-08 22:25:52 -070023143#ifdef ANDROID
23144 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023145 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023146#endif
23147
Tony Barbour300a6082015-04-07 13:44:53 -060023148 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023149 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023150
23151 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23152
23153 result = RUN_ALL_TESTS();
23154
Tony Barbour6918cd52015-04-09 12:58:51 -060023155 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023156 return result;
23157}