blob: 966b5564db130c899bb331b8de909cccb6803521 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060038#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060039#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070040
41#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060042#include <limits.h>
43#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
49//--------------------------------------------------------------------------------------
50// Mesh and VertexFormat Data
51//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070052struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070053 float posX, posY, posZ, posW; // Position data
54 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055};
56
Karl Schultz6addd812016-02-02 17:17:23 -070057#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050058
59typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070060 BsoFailNone = 0x00000000,
61 BsoFailLineWidth = 0x00000001,
62 BsoFailDepthBias = 0x00000002,
63 BsoFailViewport = 0x00000004,
64 BsoFailScissor = 0x00000008,
65 BsoFailBlend = 0x00000010,
66 BsoFailDepthBounds = 0x00000020,
67 BsoFailStencilReadMask = 0x00000040,
68 BsoFailStencilWriteMask = 0x00000080,
69 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060070 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060071 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072} BsoFailSelect;
73
74struct vktriangle_vs_uniform {
75 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070076 float mvp[4][4];
77 float position[3][4];
78 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050079};
80
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070081static const char bindStateVertShaderText[] =
82 "#version 450\n"
83 "vec2 vertices[3];\n"
84 "out gl_PerVertex {\n"
85 " vec4 gl_Position;\n"
86 "};\n"
87 "void main() {\n"
88 " vertices[0] = vec2(-1.0, -1.0);\n"
89 " vertices[1] = vec2( 1.0, -1.0);\n"
90 " vertices[2] = vec2( 0.0, 1.0);\n"
91 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
92 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050093
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070094static const char bindStateFragShaderText[] =
95 "#version 450\n"
96 "\n"
97 "layout(location = 0) out vec4 uFragColor;\n"
98 "void main(){\n"
99 " uFragColor = vec4(0,1,0,1);\n"
100 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500101
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600102static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
103 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
104 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600105
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600106// ErrorMonitor Usage:
107//
Dave Houltonfbf52152017-01-06 12:55:29 -0700108// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600109// encountered log messages, or a validation error enum identifying
110// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
111// will match all log messages. logMsg will return true for skipCall
112// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600113//
Dave Houltonfbf52152017-01-06 12:55:29 -0700114// Call VerifyFound to determine if all desired failure messages
115// were encountered. Call VerifyNotFound to determine if any unexpected
116// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600117class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700118 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700119 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700120 test_platform_thread_create_mutex(&mutex_);
121 test_platform_thread_lock_mutex(&mutex_);
122 Reset();
123 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600124 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125
Dave Houltonfbf52152017-01-06 12:55:29 -0700126 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600127
Dave Houltonfbf52152017-01-06 12:55:29 -0700128 // Set monitor to pristine state
129 void Reset() {
130 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
131 bailout_ = NULL;
132 message_found_ = VK_FALSE;
133 failure_message_strings_.clear();
134 desired_message_strings_.clear();
135 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700136 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700137 other_messages_.clear();
138 message_outstanding_count_ = 0;
139 }
140
141 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700142 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700143 test_platform_thread_lock_mutex(&mutex_);
144 desired_message_strings_.insert(msgString);
145 message_flags_ |= msgFlags;
146 message_outstanding_count_++;
147 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600148 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700150 // ErrorMonitor will look for an error message containing the specified string(s)
151 template <typename Iter>
152 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
153 for (; iter != end; ++iter) {
154 SetDesiredFailureMsg(msgFlags, *iter);
155 }
156 }
157
Dave Houltonfbf52152017-01-06 12:55:29 -0700158 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700159 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700160 test_platform_thread_lock_mutex(&mutex_);
161 desired_message_ids_.insert(msg_id);
162 message_flags_ |= msgFlags;
163 message_outstanding_count_++;
164 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600165 }
166
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700167 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
168 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
169 // function and its definition.
170 void SetUnexpectedError(const char *const msg) {
171 test_platform_thread_lock_mutex(&mutex_);
172
173 ignore_message_strings_.emplace_back(msg);
174
175 test_platform_thread_unlock_mutex(&mutex_);
176 }
177
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700178 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600179 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700180 test_platform_thread_lock_mutex(&mutex_);
181 if (bailout_ != NULL) {
182 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600183 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600184 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600185 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600186
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700187 if (!IgnoreMessage(errorString)) {
188 for (auto desired_msg : desired_message_strings_) {
189 if (desired_msg.length() == 0) {
190 // An empty desired_msg string "" indicates a positive test - not expecting an error.
191 // Return true to avoid calling layers/driver with this error.
192 // And don't erase the "" string, so it remains if another error is found.
193 result = VK_TRUE;
194 found_expected = true;
195 message_found_ = VK_TRUE;
196 failure_message_strings_.insert(errorString);
197 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600198 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700199 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700200 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700201 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700202 result = VK_TRUE;
203 // We only want one match for each expected error so remove from set here
204 // Since we're about the break the loop it's ok to remove from set we're iterating over
205 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600206 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600207 }
208 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700209 for (auto desired_id : desired_message_ids_) {
210 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
211 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
212 // Return true to avoid calling layers/driver with this error.
213 result = VK_TRUE;
214 } else if (desired_id == message_code) {
215 // Double-check that the string matches the error enum
216 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
217 found_expected = true;
218 message_outstanding_count_--;
219 result = VK_TRUE;
220 message_found_ = VK_TRUE;
221 desired_message_ids_.erase(desired_id);
222 break;
223 } else {
224 // Treat this message as a regular unexpected error, but print a warning jic
225 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
226 errorString.c_str(), desired_id, validation_error_map[desired_id]);
227 }
228 }
229 }
230
231 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600232 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700233 other_messages_.push_back(errorString);
234 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600235 }
236
Dave Houltonfbf52152017-01-06 12:55:29 -0700237 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600238 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600239 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600240
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600241 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
242
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700243 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600244
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700245 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600246
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700247 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700248
249 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600250
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600251 void DumpFailureMsgs(void) const {
252 vector<string> otherMsgs = GetOtherFailureMsgs();
253 if (otherMsgs.size()) {
254 cout << "Other error messages logged for this test were:" << endl;
255 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
256 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600257 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600258 }
259 }
260
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600261 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200262
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600263 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700264 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600265 // Match ANY message matching specified type
266 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700267 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200268 }
269
270 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600271 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700272 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600273 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700274 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700275 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600276 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700277 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700278 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600279 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200280 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700281 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200282 }
283
284 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600285 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700286 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600287 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700289 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600290 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200291 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700292 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200293 }
294
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700295 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700296 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
297 // function and its definition.
298 bool IgnoreMessage(std::string const &msg) const {
299 if (ignore_message_strings_.empty()) {
300 return false;
301 }
302
303 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
304 return msg.find(str) != std::string::npos;
305 }) != ignore_message_strings_.end();
306 }
307
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700308 VkFlags message_flags_;
309 std::unordered_set<uint32_t> desired_message_ids_;
310 std::unordered_set<string> desired_message_strings_;
311 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700313 vector<string> other_messages_;
314 test_platform_thread_mutex mutex_;
315 bool *bailout_;
316 VkBool32 message_found_;
317 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600318};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500319
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600320static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
321 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
322 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600323 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
324 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600325 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600326 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600327 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600328}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500329
Karl Schultz6addd812016-02-02 17:17:23 -0700330class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700331 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600332 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
333 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700334 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600335 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
336 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700337 }
Tony Barbour300a6082015-04-07 13:44:53 -0600338
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600339 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
340 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700341 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600342 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700343 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600344 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700345 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600346 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
347 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
348 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700349 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
350 }
351 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
352 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
353 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600354 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
355 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
356 InitState(features, flags);
357 }
358
Karl Schultz6addd812016-02-02 17:17:23 -0700359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700360 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700361 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600362 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600363 std::vector<const char *> instance_layer_names;
364 std::vector<const char *> instance_extension_names;
365 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600366
367 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700368 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600369 /*
370 * Since CreateDbgMsgCallback is an instance level extension call
371 * any extension / layer that utilizes that feature also needs
372 * to be enabled at create instance time.
373 */
Karl Schultz6addd812016-02-02 17:17:23 -0700374 // Use Threading layer first to protect others from
375 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700376 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600377 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800378 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700379 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600380 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700381 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600382
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 if (m_enableWSI) {
384 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
385 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
386#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
387#if defined(VK_USE_PLATFORM_ANDROID_KHR)
388 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700389#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600390#if defined(VK_USE_PLATFORM_MIR_KHR)
391 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700392#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600393#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
394 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700395#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600396#if defined(VK_USE_PLATFORM_WIN32_KHR)
397 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700398#endif // VK_USE_PLATFORM_WIN32_KHR
399#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600400#if defined(VK_USE_PLATFORM_XCB_KHR)
401 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
402#elif defined(VK_USE_PLATFORM_XLIB_KHR)
403 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405 }
406
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600407 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600408 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 this->app_info.pApplicationName = "layer_tests";
410 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600411 this->app_info.pEngineName = "unittest";
412 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600413 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600414
Tony Barbour15524c32015-04-29 17:34:29 -0600415 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600416 }
417
418 virtual void TearDown() {
419 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600420 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600421 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600422 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600423
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600424 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600425};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600427void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428 // Create identity matrix
429 int i;
430 struct vktriangle_vs_uniform data;
431
432 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700433 glm::mat4 View = glm::mat4(1.0f);
434 glm::mat4 Model = glm::mat4(1.0f);
435 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700437 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500438
439 memcpy(&data.mvp, &MVP[0][0], matrixSize);
440
Karl Schultz6addd812016-02-02 17:17:23 -0700441 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 };
444
Karl Schultz6addd812016-02-02 17:17:23 -0700445 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 data.position[i][0] = tri_data[i].posX;
447 data.position[i][1] = tri_data[i].posY;
448 data.position[i][2] = tri_data[i].posZ;
449 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700450 data.color[i][0] = tri_data[i].r;
451 data.color[i][1] = tri_data[i].g;
452 data.color[i][2] = tri_data[i].b;
453 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454 }
455
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 ASSERT_NO_FATAL_FAILURE(InitViewport());
457
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200458 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
459 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Karl Schultz6addd812016-02-02 17:17:23 -0700461 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600462 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500463
464 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800465 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500466 pipelineobj.AddShader(&vs);
467 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600468 if (failMask & BsoFailLineWidth) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600470 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600471 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600472 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
473 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600474 }
475 if (failMask & BsoFailDepthBias) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600477 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600478 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600479 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600480 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600481 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600482 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700483 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700484 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600485 if (failMask & BsoFailViewport) {
486 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
487 }
488 if (failMask & BsoFailScissor) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
490 }
491 if (failMask & BsoFailBlend) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 VkPipelineColorBlendAttachmentState att_state = {};
494 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
495 att_state.blendEnable = VK_TRUE;
496 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
498 if (failMask & BsoFailDepthBounds) {
499 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
500 }
501 if (failMask & BsoFailStencilReadMask) {
502 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
503 }
504 if (failMask & BsoFailStencilWriteMask) {
505 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
506 }
507 if (failMask & BsoFailStencilReference) {
508 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
509 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510
511 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600512 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513
514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700515 m_commandBuffer->BeginCommandBuffer();
516 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517
Tony Barbourfe3351b2015-07-28 10:17:20 -0600518 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500519
520 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600521 if (failMask & BsoFailIndexBuffer) {
522 // Use DrawIndexed w/o an index buffer bound
523 DrawIndexed(3, 1, 0, 0, 0);
524 } else {
525 Draw(3, 1, 0, 0);
526 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500527
Mark Muellerd4914412016-06-13 17:52:06 -0600528 if (failMask & BsoFailCmdClearAttachments) {
529 VkClearAttachment color_attachment = {};
530 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700531 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600532 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
533
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600534 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600535 }
536
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500537 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700538 m_commandBuffer->EndRenderPass();
539 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600540 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500541}
542
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600543void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
544 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500545 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600546 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500547 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600548 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500549 }
550
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700552 // Make sure depthWriteEnable is set so that Depth fail test will work
553 // correctly
554 // Make sure stencilTestEnable is set so that Stencil fail test will work
555 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600556 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800557 stencil.failOp = VK_STENCIL_OP_KEEP;
558 stencil.passOp = VK_STENCIL_OP_KEEP;
559 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
560 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600561
562 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
563 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600564 ds_ci.pNext = NULL;
565 ds_ci.depthTestEnable = VK_FALSE;
566 ds_ci.depthWriteEnable = VK_TRUE;
567 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
568 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600569 if (failMask & BsoFailDepthBounds) {
570 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600571 ds_ci.maxDepthBounds = 0.0f;
572 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600573 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600574 ds_ci.stencilTestEnable = VK_TRUE;
575 ds_ci.front = stencil;
576 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600577
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600578 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600579 pipelineobj.SetViewport(m_viewports);
580 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800581 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600582 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600583 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800584 commandBuffer->BindPipeline(pipelineobj);
585 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500586}
587
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600588class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700589 public:
590 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600591};
592
Ian Elliott2c1daf52016-05-12 09:41:46 -0600593class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700594 public:
595 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600596 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600597};
598
Mark Muellerdfe37552016-07-07 14:47:42 -0600599class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700600 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600601 enum eTestEnFlags {
602 eDoubleDelete,
603 eInvalidDeviceOffset,
604 eInvalidMemoryOffset,
605 eBindNullBuffer,
606 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600607 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600608 };
609
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600610 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600611
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600612 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
613 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600614 return true;
615 }
616 VkDeviceSize offset_limit = 0;
617 if (eInvalidMemoryOffset == aTestFlag) {
618 VkBuffer vulkanBuffer;
619 VkBufferCreateInfo buffer_create_info = {};
620 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
621 buffer_create_info.size = 32;
622 buffer_create_info.usage = aBufferUsage;
623
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600625 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600628 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
629 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
631 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600632 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600634 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600635 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600636 }
637 if (eOffsetAlignment < offset_limit) {
638 return true;
639 }
640 return false;
641 }
642
643 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600644 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
645 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600646 if (eBindNullBuffer == aTestFlag) {
647 VulkanMemory = 0;
648 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
649 } else {
650 VkBufferCreateInfo buffer_create_info = {};
651 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
652 buffer_create_info.size = 32;
653 buffer_create_info.usage = aBufferUsage;
654
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600656
657 CreateCurrent = true;
658
659 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600660 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600661
662 VkMemoryAllocateInfo memory_allocate_info = {};
663 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800664 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
666 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (!pass) {
668 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
669 return;
670 }
671
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600673 AllocateCurrent = true;
674 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
676 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677 BoundCurrent = true;
678
679 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
680 }
681 }
682
683 ~VkBufferTest() {
684 if (CreateCurrent) {
685 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
686 }
687 if (AllocateCurrent) {
688 if (InvalidDeleteEn) {
689 union {
690 VkDeviceMemory device_memory;
691 unsigned long long index_access;
692 } bad_index;
693
694 bad_index.device_memory = VulkanMemory;
695 bad_index.index_access++;
696
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600697 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 }
699 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
700 }
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600704
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600705 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600706
707 void TestDoubleDestroy() {
708 // Destroy the buffer but leave the flag set, which will cause
709 // the buffer to be destroyed again in the destructor.
710 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
711 }
712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700713 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600714 bool AllocateCurrent;
715 bool BoundCurrent;
716 bool CreateCurrent;
717 bool InvalidDeleteEn;
718
719 VkBuffer VulkanBuffer;
720 VkDevice VulkanDevice;
721 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600722};
723
724class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700725 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600727 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 : BoundCurrent(false),
729 AttributeCount(aAttributeCount),
730 BindingCount(aBindingCount),
731 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600732 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600733 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
734 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700735 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600736
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
738 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600739
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600740 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
741 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
742 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
743 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
744 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600745
746 unsigned i = 0;
747 do {
748 VertexInputAttributeDescription[i].binding = BindId;
749 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600750 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
751 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600752 i++;
753 } while (AttributeCount < i);
754
755 i = 0;
756 do {
757 VertexInputBindingDescription[i].binding = BindId;
758 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600759 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760 i++;
761 } while (BindingCount < i);
762 }
763
764 ~VkVerticesObj() {
765 if (VertexInputAttributeDescription) {
766 delete[] VertexInputAttributeDescription;
767 }
768 if (VertexInputBindingDescription) {
769 delete[] VertexInputBindingDescription;
770 }
771 }
772
773 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
775 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600776 return true;
777 }
778
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600779 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600780 VkDeviceSize *offsetList;
781 unsigned offsetCount;
782
783 if (aOffsetCount) {
784 offsetList = aOffsetList;
785 offsetCount = aOffsetCount;
786 } else {
787 offsetList = new VkDeviceSize[1]();
788 offsetCount = 1;
789 }
790
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600791 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600792 BoundCurrent = true;
793
794 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600796 }
797 }
798
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700799 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600800 static uint32_t BindIdGenerator;
801
802 bool BoundCurrent;
803 unsigned AttributeCount;
804 unsigned BindingCount;
805 uint32_t BindId;
806
807 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
808 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
809 VkVertexInputBindingDescription *VertexInputBindingDescription;
810 VkConstantBufferObj VulkanMemoryBuffer;
811};
812
813uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500814// ********************************************************************************************************************
815// ********************************************************************************************************************
816// ********************************************************************************************************************
817// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600818TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700819 TEST_DESCRIPTION(
820 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
821 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600822
Tony Barbour1fa09702017-03-16 12:09:08 -0600823 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600826 // Specify NULL for a pointer to a handle
827 // Expected to trigger an error with
828 // parameter_validation::validate_required_pointer
829 vkGetPhysicalDeviceFeatures(gpu(), NULL);
830 m_errorMonitor->VerifyFound();
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
833 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for pointer to array count
835 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600836 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify 0 for a required array count
841 // Expected to trigger an error with parameter_validation::validate_array
842 VkViewport view_port = {};
843 m_commandBuffer->SetViewport(0, 0, &view_port);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a required array
848 // Expected to trigger an error with parameter_validation::validate_array
849 m_commandBuffer->SetViewport(0, 1, NULL);
850 m_errorMonitor->VerifyFound();
851
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600853 // Specify VK_NULL_HANDLE for a required handle
854 // Expected to trigger an error with
855 // parameter_validation::validate_required_handle
856 vkUnmapMemory(device(), VK_NULL_HANDLE);
857 m_errorMonitor->VerifyFound();
858
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
860 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify VK_NULL_HANDLE for a required handle array entry
862 // Expected to trigger an error with
863 // parameter_validation::validate_required_handle_array
864 VkFence fence = VK_NULL_HANDLE;
865 vkResetFences(device(), 1, &fence);
866 m_errorMonitor->VerifyFound();
867
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600869 // Specify NULL for a required struct pointer
870 // Expected to trigger an error with
871 // parameter_validation::validate_struct_type
872 VkDeviceMemory memory = VK_NULL_HANDLE;
873 vkAllocateMemory(device(), NULL, NULL, &memory);
874 m_errorMonitor->VerifyFound();
875
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600877 // Specify 0 for a required VkFlags parameter
878 // Expected to trigger an error with parameter_validation::validate_flags
879 m_commandBuffer->SetStencilReference(0, 0);
880 m_errorMonitor->VerifyFound();
881
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600883 // Specify 0 for a required VkFlags array entry
884 // Expected to trigger an error with
885 // parameter_validation::validate_flags_array
886 VkSemaphore semaphore = VK_NULL_HANDLE;
887 VkPipelineStageFlags stageFlags = 0;
888 VkSubmitInfo submitInfo = {};
889 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
890 submitInfo.waitSemaphoreCount = 1;
891 submitInfo.pWaitSemaphores = &semaphore;
892 submitInfo.pWaitDstStageMask = &stageFlags;
893 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
894 m_errorMonitor->VerifyFound();
895}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600896
Dustin Gravesfce74c02016-05-10 11:42:58 -0600897TEST_F(VkLayerTest, ReservedParameter) {
898 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
899
Tony Barbour1fa09702017-03-16 12:09:08 -0600900 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600901
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600903 // Specify 0 for a reserved VkFlags parameter
904 // Expected to trigger an error with
905 // parameter_validation::validate_reserved_flags
906 VkEvent event_handle = VK_NULL_HANDLE;
907 VkEventCreateInfo event_info = {};
908 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
909 event_info.flags = 1;
910 vkCreateEvent(device(), &event_info, NULL, &event_handle);
911 m_errorMonitor->VerifyFound();
912}
913
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600914TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700915 TEST_DESCRIPTION(
916 "Specify an invalid VkStructureType for a Vulkan "
917 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918
Tony Barbour1fa09702017-03-16 12:09:08 -0600919 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600922 // Zero struct memory, effectively setting sType to
923 // VK_STRUCTURE_TYPE_APPLICATION_INFO
924 // Expected to trigger an error with
925 // parameter_validation::validate_struct_type
926 VkMemoryAllocateInfo alloc_info = {};
927 VkDeviceMemory memory = VK_NULL_HANDLE;
928 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
929 m_errorMonitor->VerifyFound();
930
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600932 // Zero struct memory, effectively setting sType to
933 // VK_STRUCTURE_TYPE_APPLICATION_INFO
934 // Expected to trigger an error with
935 // parameter_validation::validate_struct_type_array
936 VkSubmitInfo submit_info = {};
937 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
938 m_errorMonitor->VerifyFound();
939}
940
941TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943
Tony Barbour1fa09702017-03-16 12:09:08 -0600944 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600948 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600949 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600950 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600951 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600952 // Zero-initialization will provide the correct sType
953 VkApplicationInfo app_info = {};
954 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
955 event_alloc_info.pNext = &app_info;
956 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
957 m_errorMonitor->VerifyFound();
958
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
960 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600961 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
962 // a function that has allowed pNext structure types and specify
963 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600965 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600966 VkMemoryAllocateInfo memory_alloc_info = {};
967 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
968 memory_alloc_info.pNext = &app_info;
969 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600970 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600971}
Dustin Graves5d33d532016-05-09 16:21:12 -0600972
973TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600975
Tony Barbour1fa09702017-03-16 12:09:08 -0600976 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600977
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
979 "does not fall within the begin..end "
980 "range of the core VkFormat "
981 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600982 // Specify an invalid VkFormat value
983 // Expected to trigger an error with
984 // parameter_validation::validate_ranged_enum
985 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600986 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600987 m_errorMonitor->VerifyFound();
988
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990 // Specify an invalid VkFlags bitmask value
991 // Expected to trigger an error with parameter_validation::validate_flags
992 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600993 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
994 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600995 m_errorMonitor->VerifyFound();
996
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600998 // Specify an invalid VkFlags array entry
999 // Expected to trigger an error with
1000 // parameter_validation::validate_flags_array
1001 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001002 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 VkSubmitInfo submit_info = {};
1004 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1005 submit_info.waitSemaphoreCount = 1;
1006 submit_info.pWaitSemaphores = &semaphore;
1007 submit_info.pWaitDstStageMask = &stage_flags;
1008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1009 m_errorMonitor->VerifyFound();
1010
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001012 // Specify an invalid VkBool32 value
1013 // Expected to trigger a warning with
1014 // parameter_validation::validate_bool32
1015 VkSampler sampler = VK_NULL_HANDLE;
1016 VkSamplerCreateInfo sampler_info = {};
1017 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1018 sampler_info.pNext = NULL;
1019 sampler_info.magFilter = VK_FILTER_NEAREST;
1020 sampler_info.minFilter = VK_FILTER_NEAREST;
1021 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1022 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1023 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1024 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1025 sampler_info.mipLodBias = 1.0;
1026 sampler_info.maxAnisotropy = 1;
1027 sampler_info.compareEnable = VK_FALSE;
1028 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1029 sampler_info.minLod = 1.0;
1030 sampler_info.maxLod = 1.0;
1031 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1032 sampler_info.unnormalizedCoordinates = VK_FALSE;
1033 // Not VK_TRUE or VK_FALSE
1034 sampler_info.anisotropyEnable = 3;
1035 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1036 m_errorMonitor->VerifyFound();
1037}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001038
1039TEST_F(VkLayerTest, FailedReturnValue) {
1040 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1041
Tony Barbour1fa09702017-03-16 12:09:08 -06001042 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001043
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001044 // Find an unsupported image format
1045 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1046 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1047 VkFormat format = static_cast<VkFormat>(f);
1048 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001049 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 unsupported = format;
1051 break;
1052 }
1053 }
1054
1055 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1057 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001058 // Specify an unsupported VkFormat value to generate a
1059 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1060 // Expected to trigger a warning from
1061 // parameter_validation::validate_result
1062 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001063 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1064 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1066 m_errorMonitor->VerifyFound();
1067 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001068}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001069
1070TEST_F(VkLayerTest, UpdateBufferAlignment) {
1071 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073
Tony Barbour1fa09702017-03-16 12:09:08 -06001074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001075
1076 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1077 vk_testing::Buffer buffer;
1078 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1079
Tony Barbour552f6c02016-12-21 14:34:07 -07001080 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001081 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001083 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1084 m_errorMonitor->VerifyFound();
1085
1086 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1089 m_errorMonitor->VerifyFound();
1090
1091 // Introduce failure by using dataSize that is < 0
1092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1095 m_errorMonitor->VerifyFound();
1096
1097 // Introduce failure by using dataSize that is > 65536
1098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001099 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1101 m_errorMonitor->VerifyFound();
1102
Tony Barbour552f6c02016-12-21 14:34:07 -07001103 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104}
1105
1106TEST_F(VkLayerTest, FillBufferAlignment) {
1107 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1108
Tony Barbour1fa09702017-03-16 12:09:08 -06001109 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001110
1111 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1112 vk_testing::Buffer buffer;
1113 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1114
Tony Barbour552f6c02016-12-21 14:34:07 -07001115 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001116
1117 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
1122 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001124 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1125 m_errorMonitor->VerifyFound();
1126
1127 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001129 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1130 m_errorMonitor->VerifyFound();
1131
Tony Barbour552f6c02016-12-21 14:34:07 -07001132 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001133}
Dustin Graves40f35822016-06-23 11:12:53 -06001134
Cortd889ff92016-07-27 09:51:27 -07001135TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1136 VkResult err;
1137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001138 TEST_DESCRIPTION(
1139 "Attempt to use a non-solid polygon fill mode in a "
1140 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001141
Tony Barbour1fa09702017-03-16 12:09:08 -06001142 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1144
1145 std::vector<const char *> device_extension_names;
1146 auto features = m_device->phy().features();
1147 // Artificially disable support for non-solid fill modes
1148 features.fillModeNonSolid = false;
1149 // The sacrificial device object
1150 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1151
1152 VkRenderpassObj render_pass(&test_device);
1153
1154 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1155 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1156 pipeline_layout_ci.setLayoutCount = 0;
1157 pipeline_layout_ci.pSetLayouts = NULL;
1158
1159 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001160 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001161 ASSERT_VK_SUCCESS(err);
1162
1163 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1164 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1165 rs_ci.pNext = nullptr;
1166 rs_ci.lineWidth = 1.0f;
1167 rs_ci.rasterizerDiscardEnable = true;
1168
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001169 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1170 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001171
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001172 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1174 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001175 {
1176 VkPipelineObj pipe(&test_device);
1177 pipe.AddShader(&vs);
1178 pipe.AddShader(&fs);
1179 pipe.AddColorAttachment();
1180 // Introduce failure by setting unsupported polygon mode
1181 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1182 pipe.SetRasterization(&rs_ci);
1183 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1184 }
1185 m_errorMonitor->VerifyFound();
1186
1187 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
Cortd889ff92016-07-27 09:51:27 -07001202 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1203}
1204
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001205#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001206TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001207{
1208 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001209 VkFenceCreateInfo fenceInfo = {};
1210 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1211 fenceInfo.pNext = NULL;
1212 fenceInfo.flags = 0;
1213
Mike Weiblencce7ec72016-10-17 19:33:05 -06001214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001215
Tony Barbour1fa09702017-03-16 12:09:08 -06001216 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001217
1218 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1219 vk_testing::Buffer buffer;
1220 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001221
Tony Barbourfe3351b2015-07-28 10:17:20 -06001222 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001223 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001224 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001225
1226 testFence.init(*m_device, fenceInfo);
1227
1228 // Bypass framework since it does the waits automatically
1229 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242 ASSERT_VK_SUCCESS( err );
1243
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001244 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001245 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001247 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001248}
1249
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001250TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251{
1252 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001253 VkFenceCreateInfo fenceInfo = {};
1254 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1255 fenceInfo.pNext = NULL;
1256 fenceInfo.flags = 0;
1257
Mike Weiblencce7ec72016-10-17 19:33:05 -06001258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259
Tony Barbour1fa09702017-03-16 12:09:08 -06001260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261 ASSERT_NO_FATAL_FAILURE(InitViewport());
1262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1263
Tony Barbourfe3351b2015-07-28 10:17:20 -06001264 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001266 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
1268 testFence.init(*m_device, fenceInfo);
1269
1270 // Bypass framework since it does the waits automatically
1271 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001272 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1274 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001275 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001276 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001277 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001278 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001279 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001280 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001281 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001282
1283 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001284 ASSERT_VK_SUCCESS( err );
1285
Jon Ashburnf19916e2016-01-11 13:12:43 -07001286 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001287 VkCommandBufferBeginInfo info = {};
1288 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1289 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001290 info.renderPass = VK_NULL_HANDLE;
1291 info.subpass = 0;
1292 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001293 info.occlusionQueryEnable = VK_FALSE;
1294 info.queryFlags = 0;
1295 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001296
1297 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001298 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001300 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001301}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001302#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001303
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001304TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1305 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1306
Tony Barbour1fa09702017-03-16 12:09:08 -06001307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001308
1309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1310 VkBuffer buffer;
1311 VkBufferCreateInfo buf_info = {};
1312 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1313 buf_info.pNext = NULL;
1314 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1315 buf_info.size = 2048;
1316 buf_info.queueFamilyIndexCount = 0;
1317 buf_info.pQueueFamilyIndices = NULL;
1318 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1319 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1320 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1321 m_errorMonitor->VerifyFound();
1322
1323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1324 VkImage image;
1325 VkImageCreateInfo image_create_info = {};
1326 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1327 image_create_info.pNext = NULL;
1328 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1329 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1330 image_create_info.extent.width = 512;
1331 image_create_info.extent.height = 64;
1332 image_create_info.extent.depth = 1;
1333 image_create_info.mipLevels = 1;
1334 image_create_info.arrayLayers = 1;
1335 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1336 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1337 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1338 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1339 image_create_info.queueFamilyIndexCount = 0;
1340 image_create_info.pQueueFamilyIndices = NULL;
1341 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1342 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1343 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1344 m_errorMonitor->VerifyFound();
1345}
1346
Dave Houlton829c0d82017-01-24 15:09:17 -07001347TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1348 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
Tony Barbour1fa09702017-03-16 12:09:08 -06001349 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001352 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001353 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1354
1355 // Mask out device features we don't want
1356 VkPhysicalDeviceFeatures desired_features = available_features;
1357 desired_features.sparseResidencyImage2D = VK_FALSE;
1358 desired_features.sparseResidencyImage3D = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001359 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001360
1361 VkImage image = VK_NULL_HANDLE;
1362 VkResult result = VK_RESULT_MAX_ENUM;
1363 VkImageCreateInfo image_create_info = {};
1364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1365 image_create_info.pNext = NULL;
1366 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1367 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1368 image_create_info.extent.width = 512;
1369 image_create_info.extent.height = 1;
1370 image_create_info.extent.depth = 1;
1371 image_create_info.mipLevels = 1;
1372 image_create_info.arrayLayers = 1;
1373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1381
1382 // 1D image w/ sparse residency is an error
1383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1384 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1385 m_errorMonitor->VerifyFound();
1386 if (VK_SUCCESS == result) {
1387 vkDestroyImage(m_device->device(), image, NULL);
1388 image = VK_NULL_HANDLE;
1389 }
1390
1391 // 2D image w/ sparse residency when feature isn't available
1392 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1393 image_create_info.extent.height = 64;
1394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1395 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1396 m_errorMonitor->VerifyFound();
1397 if (VK_SUCCESS == result) {
1398 vkDestroyImage(m_device->device(), image, NULL);
1399 image = VK_NULL_HANDLE;
1400 }
1401
1402 // 3D image w/ sparse residency when feature isn't available
1403 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1404 image_create_info.extent.depth = 8;
1405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1406 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1407 m_errorMonitor->VerifyFound();
1408 if (VK_SUCCESS == result) {
1409 vkDestroyImage(m_device->device(), image, NULL);
1410 image = VK_NULL_HANDLE;
1411 }
1412}
1413
1414TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1415 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
Tony Barbour1fa09702017-03-16 12:09:08 -06001416 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001417
1418 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001419 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001420 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1421
1422 // These tests all require that the device support sparse residency for 2D images
1423 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1424 return;
1425 }
1426
1427 // Mask out device features we don't want
1428 VkPhysicalDeviceFeatures desired_features = available_features;
1429 desired_features.sparseResidency2Samples = VK_FALSE;
1430 desired_features.sparseResidency4Samples = VK_FALSE;
1431 desired_features.sparseResidency8Samples = VK_FALSE;
1432 desired_features.sparseResidency16Samples = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001433 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001434
1435 VkImage image = VK_NULL_HANDLE;
1436 VkResult result = VK_RESULT_MAX_ENUM;
1437 VkImageCreateInfo image_create_info = {};
1438 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1439 image_create_info.pNext = NULL;
1440 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1441 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1442 image_create_info.extent.width = 64;
1443 image_create_info.extent.height = 64;
1444 image_create_info.extent.depth = 1;
1445 image_create_info.mipLevels = 1;
1446 image_create_info.arrayLayers = 1;
1447 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1448 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1449 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1450 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1451 image_create_info.queueFamilyIndexCount = 0;
1452 image_create_info.pQueueFamilyIndices = NULL;
1453 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1454 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1455
1456 // 2D image w/ sparse residency and linear tiling is an error
1457 m_errorMonitor->SetDesiredFailureMsg(
1458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1459 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1460 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1461 m_errorMonitor->VerifyFound();
1462 if (VK_SUCCESS == result) {
1463 vkDestroyImage(m_device->device(), image, NULL);
1464 image = VK_NULL_HANDLE;
1465 }
1466 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1467
1468 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1469 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495
1496 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1498 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1499 m_errorMonitor->VerifyFound();
1500 if (VK_SUCCESS == result) {
1501 vkDestroyImage(m_device->device(), image, NULL);
1502 image = VK_NULL_HANDLE;
1503 }
1504}
1505
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001507 TEST_DESCRIPTION(
1508 "Create a buffer and image, allocate memory, and bind the "
1509 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001510 VkResult err;
1511 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001513
Tobin Ehlis077ded32016-05-12 17:39:13 -06001514 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001515 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001516 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001517 VkDeviceMemory mem; // buffer will be bound first
1518 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001519 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001520 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001521
1522 VkBufferCreateInfo buf_info = {};
1523 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1524 buf_info.pNext = NULL;
1525 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1526 buf_info.size = 256;
1527 buf_info.queueFamilyIndexCount = 0;
1528 buf_info.pQueueFamilyIndices = NULL;
1529 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1530 buf_info.flags = 0;
1531 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1532 ASSERT_VK_SUCCESS(err);
1533
Tobin Ehlis077ded32016-05-12 17:39:13 -06001534 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
1536 VkImageCreateInfo image_create_info = {};
1537 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1538 image_create_info.pNext = NULL;
1539 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1540 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1541 image_create_info.extent.width = 64;
1542 image_create_info.extent.height = 64;
1543 image_create_info.extent.depth = 1;
1544 image_create_info.mipLevels = 1;
1545 image_create_info.arrayLayers = 1;
1546 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001547 // Image tiling must be optimal to trigger error when aliasing linear buffer
1548 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001549 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1550 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1551 image_create_info.queueFamilyIndexCount = 0;
1552 image_create_info.pQueueFamilyIndices = NULL;
1553 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1554 image_create_info.flags = 0;
1555
Tobin Ehlisf11be982016-05-11 13:52:53 -06001556 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1557 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001558 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1559 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001560
Tobin Ehlis077ded32016-05-12 17:39:13 -06001561 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1562
1563 VkMemoryAllocateInfo alloc_info = {};
1564 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1565 alloc_info.pNext = NULL;
1566 alloc_info.memoryTypeIndex = 0;
1567 // Ensure memory is big enough for both bindings
1568 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001569 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1570 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001572 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001573 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001574 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001575 return;
1576 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1578 ASSERT_VK_SUCCESS(err);
1579 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1580 ASSERT_VK_SUCCESS(err);
1581
Rene Lindsayd14f5572016-12-16 14:57:18 -07001582 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1583
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001585 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001586 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1587 m_errorMonitor->VerifyFound();
1588
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001589 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 // aliasing buffer2
1591 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1592 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1594 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001595 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001596 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001600 m_errorMonitor->VerifyFound();
1601
1602 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001603 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001604 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001606 vkFreeMemory(m_device->device(), mem, NULL);
1607 vkFreeMemory(m_device->device(), mem_img, NULL);
1608}
1609
Tobin Ehlis35372522016-05-12 08:32:31 -06001610TEST_F(VkLayerTest, InvalidMemoryMapping) {
1611 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1612 VkResult err;
1613 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001615
1616 VkBuffer buffer;
1617 VkDeviceMemory mem;
1618 VkMemoryRequirements mem_reqs;
1619
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001620 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1621
Tobin Ehlis35372522016-05-12 08:32:31 -06001622 VkBufferCreateInfo buf_info = {};
1623 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1624 buf_info.pNext = NULL;
1625 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1626 buf_info.size = 256;
1627 buf_info.queueFamilyIndexCount = 0;
1628 buf_info.pQueueFamilyIndices = NULL;
1629 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1630 buf_info.flags = 0;
1631 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1632 ASSERT_VK_SUCCESS(err);
1633
1634 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1635 VkMemoryAllocateInfo alloc_info = {};
1636 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1637 alloc_info.pNext = NULL;
1638 alloc_info.memoryTypeIndex = 0;
1639
1640 // Ensure memory is big enough for both bindings
1641 static const VkDeviceSize allocation_size = 0x10000;
1642 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001643 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 if (!pass) {
1645 vkDestroyBuffer(m_device->device(), buffer, NULL);
1646 return;
1647 }
1648 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 uint8_t *pData;
1652 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001654 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1655 m_errorMonitor->VerifyFound();
1656 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001658 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1660 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1661 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001662 m_errorMonitor->VerifyFound();
1663
1664 // Unmap the memory to avoid re-map error
1665 vkUnmapMemory(m_device->device(), mem);
1666 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1668 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1669 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001670 m_errorMonitor->VerifyFound();
1671 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1673 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 m_errorMonitor->VerifyFound();
1675 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001677 vkUnmapMemory(m_device->device(), mem);
1678 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001679
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 ASSERT_VK_SUCCESS(err);
1683 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001684 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001686 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001688 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1689 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001690
Tobin Ehlis35372522016-05-12 08:32:31 -06001691 // Now flush range that oversteps mapped range
1692 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001693 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001694 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001696 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1698 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1699 m_errorMonitor->VerifyFound();
1700
1701 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1702 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001704 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001705 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001706 mmr.size = VK_WHOLE_SIZE;
1707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001708 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1709 m_errorMonitor->VerifyFound();
1710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001711#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001712 // Some platforms have an atomsize of 1 which makes the test meaningless
1713 if (atom_size > 3) {
1714 // Now with an offset NOT a multiple of the device limit
1715 vkUnmapMemory(m_device->device(), mem);
1716 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1717 ASSERT_VK_SUCCESS(err);
1718 mmr.offset = 3; // Not a multiple of atom_size
1719 mmr.size = VK_WHOLE_SIZE;
1720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1721 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1722 m_errorMonitor->VerifyFound();
1723
1724 // Now with a size NOT a multiple of the device limit
1725 vkUnmapMemory(m_device->device(), mem);
1726 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1727 ASSERT_VK_SUCCESS(err);
1728 mmr.offset = atom_size;
1729 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1731 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1732 m_errorMonitor->VerifyFound();
1733 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001734#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001735 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1736 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001737 if (!pass) {
1738 vkFreeMemory(m_device->device(), mem, NULL);
1739 vkDestroyBuffer(m_device->device(), buffer, NULL);
1740 return;
1741 }
1742 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1743 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1744
1745 vkDestroyBuffer(m_device->device(), buffer, NULL);
1746 vkFreeMemory(m_device->device(), mem, NULL);
1747}
1748
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001749#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001750TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1751 VkResult err;
1752 bool pass;
1753
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001754 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1755 // following declaration (which is temporarily being moved below):
1756 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001757 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001758 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001759 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001762 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001763
Tony Barbour1fa09702017-03-16 12:09:08 -06001764 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001765
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1767#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1768 // Use the functions from the VK_KHR_android_surface extension without
1769 // enabling that extension:
1770
1771 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001772 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1774 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001775 pass = (err != VK_SUCCESS);
1776 ASSERT_TRUE(pass);
1777 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001778#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001779
Ian Elliott3f06ce52016-04-29 14:46:21 -06001780#if defined(VK_USE_PLATFORM_MIR_KHR)
1781 // Use the functions from the VK_KHR_mir_surface extension without enabling
1782 // that extension:
1783
1784 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001785 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1788 pass = (err != VK_SUCCESS);
1789 ASSERT_TRUE(pass);
1790 m_errorMonitor->VerifyFound();
1791
1792 // Tell whether an mir_connection supports presentation:
1793 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1795 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001797#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798
Ian Elliott3f06ce52016-04-29 14:46:21 -06001799#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1800 // Use the functions from the VK_KHR_wayland_surface extension without
1801 // enabling that extension:
1802
1803 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001804 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1806 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001807 pass = (err != VK_SUCCESS);
1808 ASSERT_TRUE(pass);
1809 m_errorMonitor->VerifyFound();
1810
1811 // Tell whether an wayland_display supports presentation:
1812 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1814 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001816#endif // VK_USE_PLATFORM_WAYLAND_KHR
1817#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818
Ian Elliott3f06ce52016-04-29 14:46:21 -06001819#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001820 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1821 // TO NON-LINUX PLATFORMS:
1822 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 // Use the functions from the VK_KHR_win32_surface extension without
1824 // enabling that extension:
1825
1826 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001827 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1829 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001830 pass = (err != VK_SUCCESS);
1831 ASSERT_TRUE(pass);
1832 m_errorMonitor->VerifyFound();
1833
1834 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001836 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001838// Set this (for now, until all platforms are supported and tested):
1839#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001840#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001841#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001845#endif
1846#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001847 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1848 // that extension:
1849
1850 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001851 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001853 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1854 pass = (err != VK_SUCCESS);
1855 ASSERT_TRUE(pass);
1856 m_errorMonitor->VerifyFound();
1857
1858 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001860 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1862 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001864// Set this (for now, until all platforms are supported and tested):
1865#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001866#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001867
Ian Elliott12630812016-04-29 14:35:43 -06001868#if defined(VK_USE_PLATFORM_XLIB_KHR)
1869 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an Xlib VisualID supports presentation:
1881 Display *dpy = NULL;
1882 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001884 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001889
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890// Use the functions from the VK_KHR_surface extension without enabling
1891// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001892
Ian Elliott489eec02016-05-05 14:12:44 -06001893#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001894 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001896 vkDestroySurfaceKHR(instance(), surface, NULL);
1897 m_errorMonitor->VerifyFound();
1898
1899 // Check if surface supports presentation:
1900 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1903 pass = (err != VK_SUCCESS);
1904 ASSERT_TRUE(pass);
1905 m_errorMonitor->VerifyFound();
1906
1907 // Check surface capabilities:
1908 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface formats:
1916 uint32_t format_count = 0;
1917 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
1923
1924 // Check surface present modes:
1925 uint32_t present_mode_count = 0;
1926 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1928 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001929 pass = (err != VK_SUCCESS);
1930 ASSERT_TRUE(pass);
1931 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001932#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001933
Ian Elliott1c32c772016-04-28 14:47:13 -06001934 // Use the functions from the VK_KHR_swapchain extension without enabling
1935 // that extension:
1936
1937 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001939 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1940 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001941 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1948 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 pass = (err != VK_SUCCESS);
1950 ASSERT_TRUE(pass);
1951 m_errorMonitor->VerifyFound();
1952
Chris Forbeseb7d5502016-09-13 18:19:21 +12001953 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1954 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1955 VkFence fence;
1956 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001960 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 pass = (err != VK_SUCCESS);
1962 ASSERT_TRUE(pass);
1963 m_errorMonitor->VerifyFound();
1964
Chris Forbeseb7d5502016-09-13 18:19:21 +12001965 vkDestroyFence(m_device->device(), fence, nullptr);
1966
Ian Elliott1c32c772016-04-28 14:47:13 -06001967 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001968 //
1969 // NOTE: Currently can't test this because a real swapchain is needed (as
1970 // opposed to the fake one we created) in order for the layer to lookup the
1971 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001972
1973 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001975 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1976 m_errorMonitor->VerifyFound();
1977}
Chris Forbes09368e42016-10-13 11:59:22 +13001978#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001979
Karl Schultz6addd812016-02-02 17:17:23 -07001980TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1981 VkResult err;
1982 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1985 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001986
Tony Barbour1fa09702017-03-16 12:09:08 -06001987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
1989 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001990 VkImage image;
1991 VkDeviceMemory mem;
1992 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001993
Karl Schultz6addd812016-02-02 17:17:23 -07001994 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1995 const int32_t tex_width = 32;
1996 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001997
Tony Barboureb254902015-07-15 12:50:33 -06001998 VkImageCreateInfo image_create_info = {};
1999 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.pNext = NULL;
2001 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2002 image_create_info.format = tex_format;
2003 image_create_info.extent.width = tex_width;
2004 image_create_info.extent.height = tex_height;
2005 image_create_info.extent.depth = 1;
2006 image_create_info.mipLevels = 1;
2007 image_create_info.arrayLayers = 1;
2008 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2009 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2010 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2011 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002012 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002018
Chia-I Wuf7458c52015-10-26 21:10:41 +08002019 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002020 ASSERT_VK_SUCCESS(err);
2021
Karl Schultz6addd812016-02-02 17:17:23 -07002022 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002023
Mark Lobodzinski23065352015-05-29 09:32:35 -05002024 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002026 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002027 if (!pass) { // If we can't find any unmappable memory this test doesn't
2028 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002029 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002030 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002031 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002032
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002033 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002034 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035 ASSERT_VK_SUCCESS(err);
2036
2037 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002038 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039 ASSERT_VK_SUCCESS(err);
2040
2041 // Map memory as if to initialize the image
2042 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002043 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002045 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002046
Chia-I Wuf7458c52015-10-26 21:10:41 +08002047 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002048 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049}
2050
Karl Schultz6addd812016-02-02 17:17:23 -07002051TEST_F(VkLayerTest, RebindMemory) {
2052 VkResult err;
2053 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002054
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002056
Tony Barbour1fa09702017-03-16 12:09:08 -06002057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002058
2059 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002060 VkImage image;
2061 VkDeviceMemory mem1;
2062 VkDeviceMemory mem2;
2063 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002064
Karl Schultz6addd812016-02-02 17:17:23 -07002065 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2066 const int32_t tex_width = 32;
2067 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002068
Tony Barboureb254902015-07-15 12:50:33 -06002069 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002070 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2071 image_create_info.pNext = NULL;
2072 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2073 image_create_info.format = tex_format;
2074 image_create_info.extent.width = tex_width;
2075 image_create_info.extent.height = tex_height;
2076 image_create_info.extent.depth = 1;
2077 image_create_info.mipLevels = 1;
2078 image_create_info.arrayLayers = 1;
2079 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2080 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2081 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2082 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002084 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002085 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2086 mem_alloc.pNext = NULL;
2087 mem_alloc.allocationSize = 0;
2088 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002089
Karl Schultz6addd812016-02-02 17:17:23 -07002090 // Introduce failure, do NOT set memProps to
2091 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002092 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002093 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002094 ASSERT_VK_SUCCESS(err);
2095
Karl Schultz6addd812016-02-02 17:17:23 -07002096 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097
2098 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002099 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002100 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101
2102 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002103 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002104 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002105 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106 ASSERT_VK_SUCCESS(err);
2107
2108 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002109 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce validation failure, try to bind a different memory object to
2113 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002114 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002115
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002116 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002117
Chia-I Wuf7458c52015-10-26 21:10:41 +08002118 vkDestroyImage(m_device->device(), image, NULL);
2119 vkFreeMemory(m_device->device(), mem1, NULL);
2120 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002121}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002122
Karl Schultz6addd812016-02-02 17:17:23 -07002123TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002124 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002125
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2127 "submitted in SIGNALED state. Fences "
2128 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002129
2130 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002131 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2132 fenceInfo.pNext = NULL;
2133 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002134
Tony Barbour1fa09702017-03-16 12:09:08 -06002135 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002136 ASSERT_NO_FATAL_FAILURE(InitViewport());
2137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2138
Tony Barbour552f6c02016-12-21 14:34:07 -07002139 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002140 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002141 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002142
2143 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002144
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002146 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2147 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002148 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002149 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002150 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002151 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002153 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002154 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002155
2156 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002157 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002159 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002160}
Chris Forbes4e44c912016-06-16 10:20:00 +12002161
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002163 TEST_DESCRIPTION(
2164 "Specify wrong usage for image then create conflicting view of image "
2165 "Initialize buffer with wrong usage then perform copy expecting errors "
2166 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002168
Tony Barbour1fa09702017-03-16 12:09:08 -06002169 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002170
Tony Barbourf887b162017-03-09 10:06:46 -07002171 auto format = find_depth_stencil_format(m_device);
2172 if (!format) {
2173 printf(" No Depth + Stencil format found. Skipped.\n");
2174 return;
2175 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002176
Tony Barbourf92621a2016-05-02 14:28:12 -06002177 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002178 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002179 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002180 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002181
Tony Barbourf92621a2016-05-02 14:28:12 -06002182 VkImageView dsv;
2183 VkImageViewCreateInfo dsvci = {};
2184 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2185 dsvci.image = image.handle();
2186 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002187 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002188 dsvci.subresourceRange.layerCount = 1;
2189 dsvci.subresourceRange.baseMipLevel = 0;
2190 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002191 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002192
Tony Barbourf92621a2016-05-02 14:28:12 -06002193 // Create a view with depth / stencil aspect for image with different usage
2194 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002195
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002196 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002197
2198 // Initialize buffer with TRANSFER_DST usage
2199 vk_testing::Buffer buffer;
2200 VkMemoryPropertyFlags reqs = 0;
2201 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2202 VkBufferImageCopy region = {};
2203 region.bufferRowLength = 128;
2204 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002205 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002206 region.imageSubresource.layerCount = 1;
2207 region.imageExtent.height = 16;
2208 region.imageExtent.width = 16;
2209 region.imageExtent.depth = 1;
2210
Mark Lobodzinski80871462017-02-16 10:37:27 -07002211 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002212 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002213
Chris Forbesda581202016-10-06 18:25:26 +13002214 // two separate errors from this call:
2215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2217
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002218 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2219 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002220 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002221}
Tony Barbour75d79f02016-08-30 09:39:07 -06002222
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223TEST_F(VkLayerTest, LeakAnObject) {
2224 VkResult err;
2225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227
2228 // Note that we have to create a new device since destroying the
2229 // framework's device causes Teardown() to fail and just calling Teardown
2230 // will destroy the errorMonitor.
2231
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002233
Tony Barbour1fa09702017-03-16 12:09:08 -06002234 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002235
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002236 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002237 std::vector<VkDeviceQueueCreateInfo> queue_info;
2238 queue_info.reserve(queue_props.size());
2239 std::vector<std::vector<float>> queue_priorities;
2240 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2241 VkDeviceQueueCreateInfo qi = {};
2242 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2243 qi.pNext = NULL;
2244 qi.queueFamilyIndex = i;
2245 qi.queueCount = queue_props[i].queueCount;
2246 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2247 qi.pQueuePriorities = queue_priorities[i].data();
2248 queue_info.push_back(qi);
2249 }
2250
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002251 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252
2253 // The sacrificial device object
2254 VkDevice testDevice;
2255 VkDeviceCreateInfo device_create_info = {};
2256 auto features = m_device->phy().features();
2257 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2258 device_create_info.pNext = NULL;
2259 device_create_info.queueCreateInfoCount = queue_info.size();
2260 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002261 device_create_info.enabledLayerCount = 0;
2262 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002263 device_create_info.pEnabledFeatures = &features;
2264 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2265 ASSERT_VK_SUCCESS(err);
2266
2267 VkFence fence;
2268 VkFenceCreateInfo fence_create_info = {};
2269 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2270 fence_create_info.pNext = NULL;
2271 fence_create_info.flags = 0;
2272 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2273 ASSERT_VK_SUCCESS(err);
2274
2275 // Induce failure by not calling vkDestroyFence
2276 vkDestroyDevice(testDevice, NULL);
2277 m_errorMonitor->VerifyFound();
2278}
2279
2280TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002281 TEST_DESCRIPTION(
2282 "Allocate command buffers from one command pool and "
2283 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002286
Tony Barbour1fa09702017-03-16 12:09:08 -06002287 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002288 VkCommandPool command_pool_one;
2289 VkCommandPool command_pool_two;
2290
2291 VkCommandPoolCreateInfo pool_create_info{};
2292 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2293 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2294 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2295
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002296 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002298 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002300 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002302 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002304 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002306 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002308 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309
2310 m_errorMonitor->VerifyFound();
2311
2312 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2313 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2314}
2315
2316TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2317 VkResult err;
2318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002319 TEST_DESCRIPTION(
2320 "Allocate descriptor sets from one DS pool and "
2321 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
Tony Barbour1fa09702017-03-16 12:09:08 -06002325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2327
2328 VkDescriptorPoolSize ds_type_count = {};
2329 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2330 ds_type_count.descriptorCount = 1;
2331
2332 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2333 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2334 ds_pool_ci.pNext = NULL;
2335 ds_pool_ci.flags = 0;
2336 ds_pool_ci.maxSets = 1;
2337 ds_pool_ci.poolSizeCount = 1;
2338 ds_pool_ci.pPoolSizes = &ds_type_count;
2339
2340 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002341 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002342 ASSERT_VK_SUCCESS(err);
2343
2344 // Create a second descriptor pool
2345 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002346 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_VK_SUCCESS(err);
2348
2349 VkDescriptorSetLayoutBinding dsl_binding = {};
2350 dsl_binding.binding = 0;
2351 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2352 dsl_binding.descriptorCount = 1;
2353 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2354 dsl_binding.pImmutableSamplers = NULL;
2355
2356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2358 ds_layout_ci.pNext = NULL;
2359 ds_layout_ci.bindingCount = 1;
2360 ds_layout_ci.pBindings = &dsl_binding;
2361
2362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002364 ASSERT_VK_SUCCESS(err);
2365
2366 VkDescriptorSet descriptorSet;
2367 VkDescriptorSetAllocateInfo alloc_info = {};
2368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2369 alloc_info.descriptorSetCount = 1;
2370 alloc_info.descriptorPool = ds_pool_one;
2371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002373 ASSERT_VK_SUCCESS(err);
2374
2375 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2376
2377 m_errorMonitor->VerifyFound();
2378
2379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2380 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2381 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2382}
2383
2384TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002386
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388
Tony Barbour1fa09702017-03-16 12:09:08 -06002389 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002390
2391 // Pass bogus handle into GetImageMemoryRequirements
2392 VkMemoryRequirements mem_reqs;
2393 uint64_t fakeImageHandle = 0xCADECADE;
2394 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2395
2396 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2397
2398 m_errorMonitor->VerifyFound();
2399}
2400
Mike Schuchardt17838902017-02-21 09:48:06 -07002401TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2402 TEST_DESCRIPTION(
2403 "Try to destroy a render pass object using a device other than the one it was created on. "
2404 "This should generate a distinct error from the invalid handle error.");
2405 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002406 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2408
2409 // Create second device
2410 float priorities[] = {1.0f};
2411 VkDeviceQueueCreateInfo queue_info{};
2412 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2413 queue_info.pNext = NULL;
2414 queue_info.flags = 0;
2415 queue_info.queueFamilyIndex = 0;
2416 queue_info.queueCount = 1;
2417 queue_info.pQueuePriorities = &priorities[0];
2418
2419 VkDeviceCreateInfo device_create_info = {};
2420 auto features = m_device->phy().features();
2421 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2422 device_create_info.pNext = NULL;
2423 device_create_info.queueCreateInfoCount = 1;
2424 device_create_info.pQueueCreateInfos = &queue_info;
2425 device_create_info.enabledLayerCount = 0;
2426 device_create_info.ppEnabledLayerNames = NULL;
2427 device_create_info.pEnabledFeatures = &features;
2428
2429 VkDevice second_device;
2430 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2431
2432 // Try to destroy the renderpass from the first device using the second device
2433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2434 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2435 m_errorMonitor->VerifyFound();
2436
2437 vkDestroyDevice(second_device, NULL);
2438}
2439
Karl Schultz6addd812016-02-02 17:17:23 -07002440TEST_F(VkLayerTest, PipelineNotBound) {
2441 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002442
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002443 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002444
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002446
Tony Barbour1fa09702017-03-16 12:09:08 -06002447 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002449
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002450 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002451 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2452 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453
2454 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002455 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2456 ds_pool_ci.pNext = NULL;
2457 ds_pool_ci.maxSets = 1;
2458 ds_pool_ci.poolSizeCount = 1;
2459 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002460
2461 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002462 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_VK_SUCCESS(err);
2464
2465 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 dsl_binding.binding = 0;
2467 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2468 dsl_binding.descriptorCount = 1;
2469 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2470 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002471
2472 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002473 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2474 ds_layout_ci.pNext = NULL;
2475 ds_layout_ci.bindingCount = 1;
2476 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002477
2478 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002479 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002480 ASSERT_VK_SUCCESS(err);
2481
2482 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002483 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002484 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002485 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002486 alloc_info.descriptorPool = ds_pool;
2487 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002492 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2493 pipeline_layout_ci.pNext = NULL;
2494 pipeline_layout_ci.setLayoutCount = 1;
2495 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002496
2497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499 ASSERT_VK_SUCCESS(err);
2500
Mark Youngad779052016-01-06 14:26:04 -07002501 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002502
Tony Barbour552f6c02016-12-21 14:34:07 -07002503 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002506 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002507
Chia-I Wuf7458c52015-10-26 21:10:41 +08002508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002511}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002512
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002513TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2514 VkResult err;
2515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002516 TEST_DESCRIPTION(
2517 "Test validation check for an invalid memory type index "
2518 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002519
Tony Barbour1fa09702017-03-16 12:09:08 -06002520 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002521
2522 // Create an image, allocate memory, set a bad typeIndex and then try to
2523 // bind it
2524 VkImage image;
2525 VkDeviceMemory mem;
2526 VkMemoryRequirements mem_reqs;
2527 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2528 const int32_t tex_width = 32;
2529 const int32_t tex_height = 32;
2530
2531 VkImageCreateInfo image_create_info = {};
2532 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2533 image_create_info.pNext = NULL;
2534 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2535 image_create_info.format = tex_format;
2536 image_create_info.extent.width = tex_width;
2537 image_create_info.extent.height = tex_height;
2538 image_create_info.extent.depth = 1;
2539 image_create_info.mipLevels = 1;
2540 image_create_info.arrayLayers = 1;
2541 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2542 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2543 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2544 image_create_info.flags = 0;
2545
2546 VkMemoryAllocateInfo mem_alloc = {};
2547 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2548 mem_alloc.pNext = NULL;
2549 mem_alloc.allocationSize = 0;
2550 mem_alloc.memoryTypeIndex = 0;
2551
2552 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2553 ASSERT_VK_SUCCESS(err);
2554
2555 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2556 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002557
2558 // Introduce Failure, select invalid TypeIndex
2559 VkPhysicalDeviceMemoryProperties memory_info;
2560
2561 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2562 unsigned int i;
2563 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2564 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2565 mem_alloc.memoryTypeIndex = i;
2566 break;
2567 }
2568 }
2569 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002570 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002571 vkDestroyImage(m_device->device(), image, NULL);
2572 return;
2573 }
2574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002576
2577 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2578 ASSERT_VK_SUCCESS(err);
2579
2580 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2581 (void)err;
2582
2583 m_errorMonitor->VerifyFound();
2584
2585 vkDestroyImage(m_device->device(), image, NULL);
2586 vkFreeMemory(m_device->device(), mem, NULL);
2587}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002588
Karl Schultz6addd812016-02-02 17:17:23 -07002589TEST_F(VkLayerTest, BindInvalidMemory) {
2590 VkResult err;
2591 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002592
Tony Barbour1fa09702017-03-16 12:09:08 -06002593 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002594
Cortf801b982017-01-17 18:10:21 -08002595 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002596 const int32_t tex_width = 256;
2597 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002598
2599 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002600 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2601 image_create_info.pNext = NULL;
2602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2603 image_create_info.format = tex_format;
2604 image_create_info.extent.width = tex_width;
2605 image_create_info.extent.height = tex_height;
2606 image_create_info.extent.depth = 1;
2607 image_create_info.mipLevels = 1;
2608 image_create_info.arrayLayers = 1;
2609 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002610 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002611 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2612 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Cortf801b982017-01-17 18:10:21 -08002614 VkBufferCreateInfo buffer_create_info = {};
2615 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2616 buffer_create_info.pNext = NULL;
2617 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002618 buffer_create_info.size = 4 * 1024 * 1024;
2619 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002620 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002621
Cortf801b982017-01-17 18:10:21 -08002622 // Create an image/buffer, allocate memory, free it, and then try to bind it
2623 {
2624 VkImage image = VK_NULL_HANDLE;
2625 VkBuffer buffer = VK_NULL_HANDLE;
2626 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2627 ASSERT_VK_SUCCESS(err);
2628 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2629 ASSERT_VK_SUCCESS(err);
2630 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2631 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2632 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2635 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2636 image_mem_alloc.allocationSize = image_mem_reqs.size;
2637 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2638 ASSERT_TRUE(pass);
2639 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2640 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2641 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2642 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002643
Cortf801b982017-01-17 18:10:21 -08002644 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2645 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2646 ASSERT_VK_SUCCESS(err);
2647 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2648 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002649
Cortf801b982017-01-17 18:10:21 -08002650 vkFreeMemory(device(), image_mem, NULL);
2651 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2654 err = vkBindImageMemory(device(), image, image_mem, 0);
2655 (void)err; // This may very well return an error.
2656 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002657
Cortf801b982017-01-17 18:10:21 -08002658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2659 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2660 (void)err; // This may very well return an error.
2661 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002662
Cortf801b982017-01-17 18:10:21 -08002663 vkDestroyImage(m_device->device(), image, NULL);
2664 vkDestroyBuffer(m_device->device(), buffer, NULL);
2665 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002666
2667 // Try to bind memory to an object that already has a memory binding
2668 {
2669 VkImage image = VK_NULL_HANDLE;
2670 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2671 ASSERT_VK_SUCCESS(err);
2672 VkBuffer buffer = VK_NULL_HANDLE;
2673 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2674 ASSERT_VK_SUCCESS(err);
2675 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2676 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2677 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2678 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2679 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2680 image_alloc_info.allocationSize = image_mem_reqs.size;
2681 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2682 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2683 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2684 ASSERT_TRUE(pass);
2685 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2686 ASSERT_TRUE(pass);
2687 VkDeviceMemory image_mem, buffer_mem;
2688 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2689 ASSERT_VK_SUCCESS(err);
2690 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2691 ASSERT_VK_SUCCESS(err);
2692
2693 err = vkBindImageMemory(device(), image, image_mem, 0);
2694 ASSERT_VK_SUCCESS(err);
2695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2696 err = vkBindImageMemory(device(), image, image_mem, 0);
2697 (void)err; // This may very well return an error.
2698 m_errorMonitor->VerifyFound();
2699
2700 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2701 ASSERT_VK_SUCCESS(err);
2702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2703 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2704 (void)err; // This may very well return an error.
2705 m_errorMonitor->VerifyFound();
2706
2707 vkFreeMemory(device(), image_mem, NULL);
2708 vkFreeMemory(device(), buffer_mem, NULL);
2709 vkDestroyImage(device(), image, NULL);
2710 vkDestroyBuffer(device(), buffer, NULL);
2711 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002712
Cort Strattonde748202017-02-17 12:50:01 -08002713 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002714 {
2715 VkImage image = VK_NULL_HANDLE;
2716 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2717 ASSERT_VK_SUCCESS(err);
2718 VkBuffer buffer = VK_NULL_HANDLE;
2719 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2720 ASSERT_VK_SUCCESS(err);
2721 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2722 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2723 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2724 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2725 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002726 // Leave some extra space for alignment wiggle room
2727 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002728 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002729 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002730 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2731 ASSERT_TRUE(pass);
2732 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2733 ASSERT_TRUE(pass);
2734 VkDeviceMemory image_mem, buffer_mem;
2735 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2736 ASSERT_VK_SUCCESS(err);
2737 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2738 ASSERT_VK_SUCCESS(err);
2739
Cort Strattonde748202017-02-17 12:50:01 -08002740 // Test unaligned memory offset
2741 {
2742 if (image_mem_reqs.alignment > 1) {
2743 VkDeviceSize image_offset = 1;
2744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2745 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2746 (void)err; // This may very well return an error.
2747 m_errorMonitor->VerifyFound();
2748 }
Cort6c7dff72017-01-27 18:34:50 -08002749
Cort Strattonde748202017-02-17 12:50:01 -08002750 if (buffer_mem_reqs.alignment > 1) {
2751 VkDeviceSize buffer_offset = 1;
2752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2753 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2754 (void)err; // This may very well return an error.
2755 m_errorMonitor->VerifyFound();
2756 }
2757 }
2758
2759 // Test memory offsets outside the memory allocation
2760 {
2761 VkDeviceSize image_offset =
2762 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2764 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2765 (void)err; // This may very well return an error.
2766 m_errorMonitor->VerifyFound();
2767
2768 VkDeviceSize buffer_offset =
2769 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2771 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2772 (void)err; // This may very well return an error.
2773 m_errorMonitor->VerifyFound();
2774 }
2775
2776 // Test memory offsets within the memory allocation, but which leave too little memory for
2777 // the resource.
2778 {
2779 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
2780 if (image_offset > 0) {
2781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2782 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2783 (void)err; // This may very well return an error.
2784 m_errorMonitor->VerifyFound();
2785 }
2786
2787 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2788 if (buffer_offset > 0) {
2789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2790 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2791 (void)err; // This may very well return an error.
2792 m_errorMonitor->VerifyFound();
2793 }
2794 }
Cort6c7dff72017-01-27 18:34:50 -08002795
2796 vkFreeMemory(device(), image_mem, NULL);
2797 vkFreeMemory(device(), buffer_mem, NULL);
2798 vkDestroyImage(device(), image, NULL);
2799 vkDestroyBuffer(device(), buffer, NULL);
2800 }
2801
Cort Stratton4c38bb52017-01-28 13:33:10 -08002802 // Try to bind memory to an object with an invalid memory type
2803 {
2804 VkImage image = VK_NULL_HANDLE;
2805 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2806 ASSERT_VK_SUCCESS(err);
2807 VkBuffer buffer = VK_NULL_HANDLE;
2808 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2809 ASSERT_VK_SUCCESS(err);
2810 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2811 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2812 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2813 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2814 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2815 image_alloc_info.allocationSize = image_mem_reqs.size;
2816 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2817 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002818 // Create a mask of available memory types *not* supported by these resources,
2819 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002820 VkPhysicalDeviceMemoryProperties memory_properties = {};
2821 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002822 VkDeviceMemory image_mem, buffer_mem;
2823
Cort Stratton4c38bb52017-01-28 13:33:10 -08002824 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002826 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2827 ASSERT_TRUE(pass);
2828 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2829 ASSERT_VK_SUCCESS(err);
2830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2831 err = vkBindImageMemory(device(), image, image_mem, 0);
2832 (void)err; // This may very well return an error.
2833 m_errorMonitor->VerifyFound();
2834 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002835 }
2836
Cort Stratton4c38bb52017-01-28 13:33:10 -08002837 uint32_t buffer_unsupported_mem_type_bits =
2838 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002840 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2841 ASSERT_TRUE(pass);
2842 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2843 ASSERT_VK_SUCCESS(err);
2844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2845 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2846 (void)err; // This may very well return an error.
2847 m_errorMonitor->VerifyFound();
2848 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002849 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002850
Cort Stratton4c38bb52017-01-28 13:33:10 -08002851 vkDestroyImage(device(), image, NULL);
2852 vkDestroyBuffer(device(), buffer, NULL);
2853 }
2854
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002855 // Try to bind memory to an image created with sparse memory flags
2856 {
2857 VkImageCreateInfo sparse_image_create_info = image_create_info;
2858 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2859 VkImageFormatProperties image_format_properties = {};
2860 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2861 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2862 sparse_image_create_info.usage, sparse_image_create_info.flags,
2863 &image_format_properties);
2864 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2865 // most likely means sparse formats aren't supported here; skip this test.
2866 } else {
2867 ASSERT_VK_SUCCESS(err);
2868 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002869 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 return;
2871 } else {
2872 VkImage sparse_image = VK_NULL_HANDLE;
2873 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2874 ASSERT_VK_SUCCESS(err);
2875 VkMemoryRequirements sparse_mem_reqs = {};
2876 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2877 if (sparse_mem_reqs.memoryTypeBits != 0) {
2878 VkMemoryAllocateInfo sparse_mem_alloc = {};
2879 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2880 sparse_mem_alloc.pNext = NULL;
2881 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2882 sparse_mem_alloc.memoryTypeIndex = 0;
2883 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2884 ASSERT_TRUE(pass);
2885 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2886 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2887 ASSERT_VK_SUCCESS(err);
2888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2889 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2890 // This may very well return an error.
2891 (void)err;
2892 m_errorMonitor->VerifyFound();
2893 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2894 }
2895 vkDestroyImage(m_device->device(), sparse_image, NULL);
2896 }
2897 }
2898 }
2899
2900 // Try to bind memory to a buffer created with sparse memory flags
2901 {
2902 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2903 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2904 if (!m_device->phy().features().sparseResidencyBuffer) {
2905 // most likely means sparse formats aren't supported here; skip this test.
2906 } else {
2907 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2908 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2909 ASSERT_VK_SUCCESS(err);
2910 VkMemoryRequirements sparse_mem_reqs = {};
2911 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2912 if (sparse_mem_reqs.memoryTypeBits != 0) {
2913 VkMemoryAllocateInfo sparse_mem_alloc = {};
2914 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2915 sparse_mem_alloc.pNext = NULL;
2916 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2917 sparse_mem_alloc.memoryTypeIndex = 0;
2918 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2919 ASSERT_TRUE(pass);
2920 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2921 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2922 ASSERT_VK_SUCCESS(err);
2923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2924 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2925 // This may very well return an error.
2926 (void)err;
2927 m_errorMonitor->VerifyFound();
2928 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2929 }
2930 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2931 }
2932 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002933}
2934
Karl Schultz6addd812016-02-02 17:17:23 -07002935TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2936 VkResult err;
2937 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002940
Tony Barbour1fa09702017-03-16 12:09:08 -06002941 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
Karl Schultz6addd812016-02-02 17:17:23 -07002943 // Create an image object, allocate memory, destroy the object and then try
2944 // to bind it
2945 VkImage image;
2946 VkDeviceMemory mem;
2947 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002948
Karl Schultz6addd812016-02-02 17:17:23 -07002949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2950 const int32_t tex_width = 32;
2951 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002952
2953 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2955 image_create_info.pNext = NULL;
2956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2957 image_create_info.format = tex_format;
2958 image_create_info.extent.width = tex_width;
2959 image_create_info.extent.height = tex_height;
2960 image_create_info.extent.depth = 1;
2961 image_create_info.mipLevels = 1;
2962 image_create_info.arrayLayers = 1;
2963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2964 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2965 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2966 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002968 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2970 mem_alloc.pNext = NULL;
2971 mem_alloc.allocationSize = 0;
2972 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
Chia-I Wuf7458c52015-10-26 21:10:41 +08002974 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002978
2979 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002980 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002981 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
2983 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002984 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002985 ASSERT_VK_SUCCESS(err);
2986
2987 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002989 ASSERT_VK_SUCCESS(err);
2990
2991 // Now Try to bind memory to this destroyed object
2992 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2993 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002994 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002995
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002996 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002997
Chia-I Wuf7458c52015-10-26 21:10:41 +08002998 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002999}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003000
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003001TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3002 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3003
Tony Barbour1fa09702017-03-16 12:09:08 -06003004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3006
3007 VkVertexInputBindingDescription input_binding;
3008 memset(&input_binding, 0, sizeof(input_binding));
3009
3010 VkVertexInputAttributeDescription input_attribs;
3011 memset(&input_attribs, 0, sizeof(input_attribs));
3012
3013 // Pick a really bad format for this purpose and make sure it should fail
3014 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3015 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3016 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003017 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003018 return;
3019 }
3020
3021 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003022 char const *vsSource =
3023 "#version 450\n"
3024 "\n"
3025 "out gl_PerVertex {\n"
3026 " vec4 gl_Position;\n"
3027 "};\n"
3028 "void main(){\n"
3029 " gl_Position = vec4(1);\n"
3030 "}\n";
3031 char const *fsSource =
3032 "#version 450\n"
3033 "\n"
3034 "layout(location=0) out vec4 color;\n"
3035 "void main(){\n"
3036 " color = vec4(1);\n"
3037 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003038
3039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3042
3043 VkPipelineObj pipe(m_device);
3044 pipe.AddColorAttachment();
3045 pipe.AddShader(&vs);
3046 pipe.AddShader(&fs);
3047
3048 pipe.AddVertexInputBindings(&input_binding, 1);
3049 pipe.AddVertexInputAttribs(&input_attribs, 1);
3050
3051 VkDescriptorSetObj descriptorSet(m_device);
3052 descriptorSet.AppendDummy();
3053 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3054
3055 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3056
3057 m_errorMonitor->VerifyFound();
3058}
3059
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003060TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003061 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003062 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003063
3064 VkMemoryPropertyFlags reqs = 0;
3065 VkImageCreateInfo image_create_info = {};
3066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3067 image_create_info.pNext = NULL;
3068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3069 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3070 image_create_info.extent.width = 256;
3071 image_create_info.extent.height = 256;
3072 image_create_info.extent.depth = 1;
3073 image_create_info.mipLevels = 1;
3074 image_create_info.arrayLayers = 1;
3075 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3076 image_create_info.flags = 0;
3077
3078 VkImageBlit blit_region = {};
3079 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3080 blit_region.srcSubresource.baseArrayLayer = 0;
3081 blit_region.srcSubresource.layerCount = 1;
3082 blit_region.srcSubresource.mipLevel = 0;
3083 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3084 blit_region.dstSubresource.baseArrayLayer = 0;
3085 blit_region.dstSubresource.layerCount = 1;
3086 blit_region.dstSubresource.mipLevel = 0;
3087
3088 // Create two images, the source with sampleCount = 2, and attempt to blit
3089 // between them
3090 {
3091 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003092 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003093 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003094 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003096 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003097 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003098 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003099 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3102 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3104 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003105 m_errorMonitor->VerifyFound();
3106 m_commandBuffer->EndCommandBuffer();
3107 }
3108
3109 // Create two images, the dest with sampleCount = 4, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 VkBufferImageCopy copy_region = {};
3131 copy_region.bufferRowLength = 128;
3132 copy_region.bufferImageHeight = 128;
3133 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3134 copy_region.imageSubresource.layerCount = 1;
3135 copy_region.imageExtent.height = 64;
3136 copy_region.imageExtent.width = 64;
3137 copy_region.imageExtent.depth = 1;
3138
3139 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3140 // buffer to image
3141 {
3142 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003143 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3144 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003146 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003147 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003148 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003149 m_errorMonitor->SetDesiredFailureMsg(
3150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3151 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003152 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3153 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003154 m_errorMonitor->VerifyFound();
3155 m_commandBuffer->EndCommandBuffer();
3156 }
3157
3158 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3159 // image to buffer
3160 {
3161 vk_testing::Buffer dst_buffer;
3162 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3163 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003164 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003165 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003168 m_errorMonitor->SetDesiredFailureMsg(
3169 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3170 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003172 dst_buffer.handle(), 1, &copy_region);
3173 m_errorMonitor->VerifyFound();
3174 m_commandBuffer->EndCommandBuffer();
3175 }
3176}
3177
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003178TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003179 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003180
3181 VkImageObj src_image(m_device);
3182 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3183 VkImageObj dst_image(m_device);
3184 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3185 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003186 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003187
3188 VkImageBlit blitRegion = {};
3189 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3190 blitRegion.srcSubresource.baseArrayLayer = 0;
3191 blitRegion.srcSubresource.layerCount = 1;
3192 blitRegion.srcSubresource.mipLevel = 0;
3193 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3194 blitRegion.dstSubresource.baseArrayLayer = 0;
3195 blitRegion.dstSubresource.layerCount = 1;
3196 blitRegion.dstSubresource.mipLevel = 0;
3197
Dave Houlton34df4cb2016-12-01 16:43:06 -07003198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3199
3200 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3201 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003202
3203 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003204 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
3208 m_errorMonitor->VerifyFound();
3209
Dave Houlton34df4cb2016-12-01 16:43:06 -07003210 // Test should generate 2 VU failures
3211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213
3214 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003215 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3216 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
Dave Houlton34df4cb2016-12-01 16:43:06 -07003218 // TODO: Note that this only verifies that at least one of the VU enums was found
3219 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003220 m_errorMonitor->VerifyFound();
3221
Tony Barbour552f6c02016-12-21 14:34:07 -07003222 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223}
3224
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003225TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3226 VkResult err;
3227 bool pass;
3228
3229 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003230 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003231
3232 // If w/d/h granularity is 1, test is not meaningful
3233 // TODO: When virtual device limits are available, create a set of limits for this test that
3234 // will always have a granularity of > 1 for w, h, and d
3235 auto index = m_device->graphics_queue_node_index_;
3236 auto queue_family_properties = m_device->phy().queue_properties();
3237
3238 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3239 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3240 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3241 return;
3242 }
3243
3244 // Create two images of different types and try to copy between them
3245 VkImage srcImage;
3246 VkImage dstImage;
3247 VkDeviceMemory srcMem;
3248 VkDeviceMemory destMem;
3249 VkMemoryRequirements memReqs;
3250
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003251 VkImageCreateInfo image_create_info = {};
3252 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3253 image_create_info.pNext = NULL;
3254 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3255 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3256 image_create_info.extent.width = 32;
3257 image_create_info.extent.height = 32;
3258 image_create_info.extent.depth = 1;
3259 image_create_info.mipLevels = 1;
3260 image_create_info.arrayLayers = 4;
3261 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3262 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3263 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3264 image_create_info.flags = 0;
3265
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003266 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003267 ASSERT_VK_SUCCESS(err);
3268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003269 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003270 ASSERT_VK_SUCCESS(err);
3271
3272 // Allocate memory
3273 VkMemoryAllocateInfo memAlloc = {};
3274 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3275 memAlloc.pNext = NULL;
3276 memAlloc.allocationSize = 0;
3277 memAlloc.memoryTypeIndex = 0;
3278
3279 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3280 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_TRUE(pass);
3283 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3284 ASSERT_VK_SUCCESS(err);
3285
3286 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3287 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003288 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 ASSERT_VK_SUCCESS(err);
3290 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3291 ASSERT_VK_SUCCESS(err);
3292
3293 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3294 ASSERT_VK_SUCCESS(err);
3295 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3296 ASSERT_VK_SUCCESS(err);
3297
Tony Barbour552f6c02016-12-21 14:34:07 -07003298 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003299 VkImageCopy copyRegion;
3300 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3301 copyRegion.srcSubresource.mipLevel = 0;
3302 copyRegion.srcSubresource.baseArrayLayer = 0;
3303 copyRegion.srcSubresource.layerCount = 1;
3304 copyRegion.srcOffset.x = 0;
3305 copyRegion.srcOffset.y = 0;
3306 copyRegion.srcOffset.z = 0;
3307 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3308 copyRegion.dstSubresource.mipLevel = 0;
3309 copyRegion.dstSubresource.baseArrayLayer = 0;
3310 copyRegion.dstSubresource.layerCount = 1;
3311 copyRegion.dstOffset.x = 0;
3312 copyRegion.dstOffset.y = 0;
3313 copyRegion.dstOffset.z = 0;
3314 copyRegion.extent.width = 1;
3315 copyRegion.extent.height = 1;
3316 copyRegion.extent.depth = 1;
3317
3318 // Introduce failure by setting srcOffset to a bad granularity value
3319 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3321 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003322 m_errorMonitor->VerifyFound();
3323
3324 // Introduce failure by setting extent to a bad granularity value
3325 copyRegion.srcOffset.y = 0;
3326 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3328 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003329 m_errorMonitor->VerifyFound();
3330
3331 // Now do some buffer/image copies
3332 vk_testing::Buffer buffer;
3333 VkMemoryPropertyFlags reqs = 0;
3334 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3335 VkBufferImageCopy region = {};
3336 region.bufferOffset = 0;
3337 region.bufferRowLength = 3;
3338 region.bufferImageHeight = 128;
3339 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3340 region.imageSubresource.layerCount = 1;
3341 region.imageExtent.height = 16;
3342 region.imageExtent.width = 16;
3343 region.imageExtent.depth = 1;
3344 region.imageOffset.x = 0;
3345 region.imageOffset.y = 0;
3346 region.imageOffset.z = 0;
3347
3348 // Introduce failure by setting bufferRowLength to a bad granularity value
3349 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3351 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3352 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003353 m_errorMonitor->VerifyFound();
3354 region.bufferRowLength = 128;
3355
3356 // Introduce failure by setting bufferOffset to a bad granularity value
3357 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3359 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3360 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003361 m_errorMonitor->VerifyFound();
3362 region.bufferOffset = 0;
3363
3364 // Introduce failure by setting bufferImageHeight to a bad granularity value
3365 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3367 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3368 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003369 m_errorMonitor->VerifyFound();
3370 region.bufferImageHeight = 128;
3371
3372 // Introduce failure by setting imageExtent to a bad granularity value
3373 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3376 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003377 m_errorMonitor->VerifyFound();
3378 region.imageExtent.width = 16;
3379
3380 // Introduce failure by setting imageOffset to a bad granularity value
3381 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3384 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003385 m_errorMonitor->VerifyFound();
3386
Tony Barbour552f6c02016-12-21 14:34:07 -07003387 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003388
3389 vkDestroyImage(m_device->device(), srcImage, NULL);
3390 vkDestroyImage(m_device->device(), dstImage, NULL);
3391 vkFreeMemory(m_device->device(), srcMem, NULL);
3392 vkFreeMemory(m_device->device(), destMem, NULL);
3393}
3394
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003395TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003396 TEST_DESCRIPTION(
3397 "Submit command buffer created using one queue family and "
3398 "attempt to submit them on a queue created in a different "
3399 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003400
Tony Barbour1fa09702017-03-16 12:09:08 -06003401 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003402
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003403 // This test is meaningless unless we have multiple queue families
3404 auto queue_family_properties = m_device->phy().queue_properties();
3405 if (queue_family_properties.size() < 2) {
3406 return;
3407 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003409 // Get safe index of another queue family
3410 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Tony Barbour1fa09702017-03-16 12:09:08 -06003411 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003412 // Create a second queue using a different queue family
3413 VkQueue other_queue;
3414 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3415
3416 // Record an empty cmd buffer
3417 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3418 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3419 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3420 vkEndCommandBuffer(m_commandBuffer->handle());
3421
3422 // And submit on the wrong queue
3423 VkSubmitInfo submit_info = {};
3424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3425 submit_info.commandBufferCount = 1;
3426 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003427 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003428
3429 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430}
3431
Chris Forbes4c24a922016-11-16 08:59:10 +13003432TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003433 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003434
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003435 // There are no attachments, but refer to attachment 0.
3436 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003437 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003438 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003439 };
3440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003441 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003442 VkRenderPass rp;
3443
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003444 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003446 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3447 m_errorMonitor->VerifyFound();
3448}
3449
Chris Forbesa58c4522016-09-28 15:19:39 +13003450TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3451 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003453
3454 // A renderpass with two subpasses, both writing the same attachment.
3455 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003456 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3457 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3458 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003459 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003462 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3463 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003464 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003465 VkSubpassDependency dep = {0,
3466 1,
3467 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3468 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3469 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3470 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3471 VK_DEPENDENCY_BY_REGION_BIT};
3472 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003473 VkRenderPass rp;
3474 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3475 ASSERT_VK_SUCCESS(err);
3476
3477 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003479 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3480
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003482 VkFramebuffer fb;
3483 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3484 ASSERT_VK_SUCCESS(err);
3485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003486 char const *vsSource =
3487 "#version 450\n"
3488 "void main() { gl_Position = vec4(1); }\n";
3489 char const *fsSource =
3490 "#version 450\n"
3491 "layout(location=0) out vec4 color;\n"
3492 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003493
3494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3496 VkPipelineObj pipe(m_device);
3497 pipe.AddColorAttachment();
3498 pipe.AddShader(&vs);
3499 pipe.AddShader(&fs);
3500 VkViewport view_port = {};
3501 m_viewports.push_back(view_port);
3502 pipe.SetViewport(m_viewports);
3503 VkRect2D rect = {};
3504 m_scissors.push_back(rect);
3505 pipe.SetScissor(m_scissors);
3506
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003507 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003508 VkPipelineLayout pl;
3509 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3510 ASSERT_VK_SUCCESS(err);
3511 pipe.CreateVKPipeline(pl, rp);
3512
Tony Barbour552f6c02016-12-21 14:34:07 -07003513 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003514
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003515 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3516 nullptr,
3517 rp,
3518 fb,
3519 {{
3520 0, 0,
3521 },
3522 {32, 32}},
3523 0,
3524 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003525
3526 // subtest 1: bind in the wrong subpass
3527 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3528 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003530 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3531 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3532 m_errorMonitor->VerifyFound();
3533
3534 vkCmdEndRenderPass(m_commandBuffer->handle());
3535
3536 // subtest 2: bind in correct subpass, then transition to next subpass
3537 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3538 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3539 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003541 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3542 m_errorMonitor->VerifyFound();
3543
3544 vkCmdEndRenderPass(m_commandBuffer->handle());
3545
Tony Barbour552f6c02016-12-21 14:34:07 -07003546 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003547
3548 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3549 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3550 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3551}
3552
Tony Barbour4e919972016-08-09 13:27:40 -06003553TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003554 TEST_DESCRIPTION(
3555 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3556 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003557 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3559
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 "Cannot execute a render pass with renderArea "
3562 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003563
3564 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3565 m_renderPassBeginInfo.renderArea.extent.width = 257;
3566 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003567 m_commandBuffer->BeginCommandBuffer();
3568 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003569 m_errorMonitor->VerifyFound();
3570}
3571
3572TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INDEPENDENT_BLEND by disabling independent "
3575 "blend and then specifying different blend states for two "
3576 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003577 VkPhysicalDeviceFeatures features = {};
3578 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003579 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3582 "Invalid Pipeline CreateInfo: If independent blend feature not "
3583 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003584
Cody Northropc31a84f2016-08-22 10:41:47 -06003585 VkDescriptorSetObj descriptorSet(m_device);
3586 descriptorSet.AppendDummy();
3587 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003588
Cody Northropc31a84f2016-08-22 10:41:47 -06003589 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003590 // Create a renderPass with two color attachments
3591 VkAttachmentReference attachments[2] = {};
3592 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003594 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3595
3596 VkSubpassDescription subpass = {};
3597 subpass.pColorAttachments = attachments;
3598 subpass.colorAttachmentCount = 2;
3599
3600 VkRenderPassCreateInfo rpci = {};
3601 rpci.subpassCount = 1;
3602 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604
Tony Barbourffd60bd2017-03-09 12:04:55 -07003605 VkAttachmentDescription attach_desc[2] = {};
3606 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3607 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3608 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3609 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3610 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3611 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3612 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3613 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003614
Tony Barbourffd60bd2017-03-09 12:04:55 -07003615 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003616 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3617
3618 VkRenderPass renderpass;
3619 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003620 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003621 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003622
Cody Northropc31a84f2016-08-22 10:41:47 -06003623 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3624 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3625 att_state1.blendEnable = VK_TRUE;
3626 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3627 att_state2.blendEnable = VK_FALSE;
3628 pipeline.AddColorAttachment(0, &att_state1);
3629 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003630 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003631 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003632 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003633}
3634
Mike Weiblen40b160e2017-02-06 19:21:52 -07003635// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3636TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3637 TEST_DESCRIPTION(
3638 "Create a graphics pipeline that is incompatible with the requirements "
3639 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003640 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003641
3642 VkDescriptorSetObj ds_obj(m_device);
3643 ds_obj.AppendDummy();
3644 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3645
3646 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3647
3648 VkPipelineColorBlendAttachmentState att_state1 = {};
3649 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3650 att_state1.blendEnable = VK_TRUE;
3651
3652 VkRenderpassObj rp_obj(m_device);
3653
3654 {
3655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3656 VkPipelineObj pipeline(m_device);
3657 pipeline.AddShader(&vs_obj);
3658 pipeline.AddColorAttachment(0, &att_state1);
3659
3660 VkGraphicsPipelineCreateInfo info = {};
3661 pipeline.InitGraphicsPipelineCreateInfo(&info);
3662 info.pColorBlendState = nullptr;
3663
3664 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3665 m_errorMonitor->VerifyFound();
3666 }
3667}
3668
Chris Forbes26ec2122016-11-29 08:58:33 +13003669#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003670TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3671 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3672 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003673 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3676 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003677
3678 // Create a renderPass with a single color attachment
3679 VkAttachmentReference attach = {};
3680 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3681 VkSubpassDescription subpass = {};
3682 VkRenderPassCreateInfo rpci = {};
3683 rpci.subpassCount = 1;
3684 rpci.pSubpasses = &subpass;
3685 rpci.attachmentCount = 1;
3686 VkAttachmentDescription attach_desc = {};
3687 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3688 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3689 rpci.pAttachments = &attach_desc;
3690 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3691 VkRenderPass rp;
3692 subpass.pDepthStencilAttachment = &attach;
3693 subpass.pColorAttachments = NULL;
3694 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3695 m_errorMonitor->VerifyFound();
3696}
Chris Forbes26ec2122016-11-29 08:58:33 +13003697#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003698
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003699TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003700 TEST_DESCRIPTION(
3701 "Create a framebuffer where a subpass has a preserve "
3702 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003703
Tony Barbour1fa09702017-03-16 12:09:08 -06003704 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3706
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003708
3709 VkAttachmentReference color_attach = {};
3710 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3711 color_attach.attachment = 0;
3712 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3713 VkSubpassDescription subpass = {};
3714 subpass.colorAttachmentCount = 1;
3715 subpass.pColorAttachments = &color_attach;
3716 subpass.preserveAttachmentCount = 1;
3717 subpass.pPreserveAttachments = &preserve_attachment;
3718
3719 VkRenderPassCreateInfo rpci = {};
3720 rpci.subpassCount = 1;
3721 rpci.pSubpasses = &subpass;
3722 rpci.attachmentCount = 1;
3723 VkAttachmentDescription attach_desc = {};
3724 attach_desc.format = VK_FORMAT_UNDEFINED;
3725 rpci.pAttachments = &attach_desc;
3726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3727 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003728 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003729
3730 m_errorMonitor->VerifyFound();
3731
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003732 if (result == VK_SUCCESS) {
3733 vkDestroyRenderPass(m_device->device(), rp, NULL);
3734 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003735}
3736
Chris Forbesc5389742016-06-29 11:49:23 +12003737TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003738 TEST_DESCRIPTION(
3739 "Ensure that CreateRenderPass produces a validation error "
3740 "when the source of a subpass multisample resolve "
3741 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003742
Tony Barbour1fa09702017-03-16 12:09:08 -06003743 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3746 "Subpass 0 requests multisample resolve from attachment 0 which has "
3747 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003748
3749 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003750 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3751 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3752 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3753 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3754 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3755 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003756 };
3757
3758 VkAttachmentReference color = {
3759 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3760 };
3761
3762 VkAttachmentReference resolve = {
3763 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3764 };
3765
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003766 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003767
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003768 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003769
3770 VkRenderPass rp;
3771 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3772
3773 m_errorMonitor->VerifyFound();
3774
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003775 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003776}
3777
3778TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003779 TEST_DESCRIPTION(
3780 "Ensure CreateRenderPass produces a validation error "
3781 "when a subpass multisample resolve operation is "
3782 "requested, and the destination of that resolve has "
3783 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003784
Tony Barbour1fa09702017-03-16 12:09:08 -06003785 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3788 "Subpass 0 requests multisample resolve into attachment 1, which "
3789 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003790
3791 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003792 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3793 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3794 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3795 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3797 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003798 };
3799
3800 VkAttachmentReference color = {
3801 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3802 };
3803
3804 VkAttachmentReference resolve = {
3805 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3806 };
3807
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003808 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003809
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003810 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003811
3812 VkRenderPass rp;
3813 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3814
3815 m_errorMonitor->VerifyFound();
3816
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003817 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003818}
3819
Chris Forbes3f128ef2016-06-29 14:58:53 +12003820TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003821 TEST_DESCRIPTION(
3822 "Ensure CreateRenderPass produces a validation error "
3823 "when the color and depth attachments used by a subpass "
3824 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003825
Tony Barbour1fa09702017-03-16 12:09:08 -06003826 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003827
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3829 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003830
3831 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003832 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3833 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3834 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3835 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3836 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3837 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003838 };
3839
3840 VkAttachmentReference color[] = {
3841 {
3842 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3843 },
3844 {
3845 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3846 },
3847 };
3848
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003849 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003850
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003852
3853 VkRenderPass rp;
3854 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3855
3856 m_errorMonitor->VerifyFound();
3857
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003858 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003859}
3860
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003861TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003862 TEST_DESCRIPTION(
3863 "Hit errors when attempting to create a framebuffer :\n"
3864 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3865 " 2. Use a color image as depthStencil attachment\n"
3866 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3867 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3868 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3869 " 6. Framebuffer attachment where dimensions don't match\n"
3870 " 7. Framebuffer attachment w/o identity swizzle\n"
3871 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003872
Tony Barbour1fa09702017-03-16 12:09:08 -06003873 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003874 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3875
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003876 m_errorMonitor->SetDesiredFailureMsg(
3877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3878 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003881 VkAttachmentReference attach = {};
3882 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3883 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003884 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885 VkRenderPassCreateInfo rpci = {};
3886 rpci.subpassCount = 1;
3887 rpci.pSubpasses = &subpass;
3888 rpci.attachmentCount = 1;
3889 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003890 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003891 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 rpci.pAttachments = &attach_desc;
3893 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3894 VkRenderPass rp;
3895 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3896 ASSERT_VK_SUCCESS(err);
3897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 VkImageView ivs[2];
3899 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3900 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003901 VkFramebufferCreateInfo fb_info = {};
3902 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3903 fb_info.pNext = NULL;
3904 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003905 // Set mis-matching attachmentCount
3906 fb_info.attachmentCount = 2;
3907 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003908 fb_info.width = 100;
3909 fb_info.height = 100;
3910 fb_info.layers = 1;
3911
3912 VkFramebuffer fb;
3913 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3914
3915 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003916 if (err == VK_SUCCESS) {
3917 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3918 }
3919 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003920
3921 // Create a renderPass with a depth-stencil attachment created with
3922 // IMAGE_USAGE_COLOR_ATTACHMENT
3923 // Add our color attachment to pDepthStencilAttachment
3924 subpass.pDepthStencilAttachment = &attach;
3925 subpass.pColorAttachments = NULL;
3926 VkRenderPass rp_ds;
3927 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3928 ASSERT_VK_SUCCESS(err);
3929 // Set correct attachment count, but attachment has COLOR usage bit set
3930 fb_info.attachmentCount = 1;
3931 fb_info.renderPass = rp_ds;
3932
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003934 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3935
3936 m_errorMonitor->VerifyFound();
3937 if (err == VK_SUCCESS) {
3938 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3939 }
3940 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003941
3942 // Create new renderpass with alternate attachment format from fb
3943 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3944 subpass.pDepthStencilAttachment = NULL;
3945 subpass.pColorAttachments = &attach;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3947 ASSERT_VK_SUCCESS(err);
3948
3949 // Cause error due to mis-matched formats between rp & fb
3950 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3951 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3953 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3955
3956 m_errorMonitor->VerifyFound();
3957 if (err == VK_SUCCESS) {
3958 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3959 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003960 vkDestroyRenderPass(m_device->device(), rp, NULL);
3961
3962 // Create new renderpass with alternate sample count from fb
3963 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3964 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched sample count between rp & fb
3969 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003971 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003972 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3973
3974 m_errorMonitor->VerifyFound();
3975 if (err == VK_SUCCESS) {
3976 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3977 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003978
3979 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
3981 // Create a custom imageView with non-1 mip levels
3982 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003983 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003984 ASSERT_TRUE(image.initialized());
3985
3986 VkImageView view;
3987 VkImageViewCreateInfo ivci = {};
3988 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3989 ivci.image = image.handle();
3990 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3991 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3992 ivci.subresourceRange.layerCount = 1;
3993 ivci.subresourceRange.baseMipLevel = 0;
3994 // Set level count 2 (only 1 is allowed for FB attachment)
3995 ivci.subresourceRange.levelCount = 2;
3996 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3997 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3998 ASSERT_VK_SUCCESS(err);
3999 // Re-create renderpass to have matching sample count
4000 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4001 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4002 ASSERT_VK_SUCCESS(err);
4003
4004 fb_info.renderPass = rp;
4005 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004007 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4008
4009 m_errorMonitor->VerifyFound();
4010 if (err == VK_SUCCESS) {
4011 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4012 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004013 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004014 // Update view to original color buffer and grow FB dimensions too big
4015 fb_info.pAttachments = ivs;
4016 fb_info.height = 1024;
4017 fb_info.width = 1024;
4018 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004020 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4021
4022 m_errorMonitor->VerifyFound();
4023 if (err == VK_SUCCESS) {
4024 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4025 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004026 // Create view attachment with non-identity swizzle
4027 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4028 ivci.image = image.handle();
4029 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4030 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4031 ivci.subresourceRange.layerCount = 1;
4032 ivci.subresourceRange.baseMipLevel = 0;
4033 ivci.subresourceRange.levelCount = 1;
4034 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4035 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4036 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4037 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4038 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4039 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4040 ASSERT_VK_SUCCESS(err);
4041
4042 fb_info.pAttachments = &view;
4043 fb_info.height = 100;
4044 fb_info.width = 100;
4045 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004046 m_errorMonitor->SetDesiredFailureMsg(
4047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4048 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004049 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4050
4051 m_errorMonitor->VerifyFound();
4052 if (err == VK_SUCCESS) {
4053 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4054 }
4055 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004056 // reset attachment to color attachment
4057 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004058
4059 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004060 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004061 fb_info.height = 100;
4062 fb_info.layers = 1;
4063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004064 m_errorMonitor->SetDesiredFailureMsg(
4065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004066 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4067 "Here are the respective dimensions for attachment");
4068
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004069 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4070
4071 m_errorMonitor->VerifyFound();
4072 if (err == VK_SUCCESS) {
4073 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4074 }
4075
4076 // Request fb that exceeds max height
4077 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004078 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004079 fb_info.layers = 1;
4080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004083 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4084 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004085 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4086
4087 m_errorMonitor->VerifyFound();
4088 if (err == VK_SUCCESS) {
4089 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4090 }
4091
4092 // Request fb that exceeds max layers
4093 fb_info.width = 100;
4094 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004095 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004097 m_errorMonitor->SetDesiredFailureMsg(
4098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004099 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4100 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004101 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4102
4103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Tobin Ehlisea413442016-09-28 10:23:59 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
5060 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
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);
9127 img_ds.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9128 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;
9939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9940 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9941 m_errorMonitor->VerifyFound();
9942
9943 // Reduce size of range to acceptable limit & cause offset error
9944 buff_info.range = max_ub_range;
9945 buff_info.offset = min_ub_align - 1;
9946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9947 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9948 m_errorMonitor->VerifyFound();
9949
9950 // Now break storage updates
9951 buff_info.buffer = storage_buffer;
9952 buff_info.range = sb_ci.size; // This will exceed limit
9953 buff_info.offset = 0; // Reset offset for this update
9954
9955 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9956 descriptor_write.dstBinding = 1;
9957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9958 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9959 m_errorMonitor->VerifyFound();
9960
9961 // Reduce size of range to acceptable limit & cause offset error
9962 buff_info.range = max_sb_range;
9963 buff_info.offset = min_sb_align - 1;
9964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9965 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9966 m_errorMonitor->VerifyFound();
9967
9968 vkFreeMemory(m_device->device(), mem, NULL);
9969 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9970 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9971 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9972 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9973}
9974
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009975TEST_F(VkLayerTest, DSAspectBitsErrors) {
9976 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9977 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009978 TEST_DESCRIPTION(
9979 "Attempt to update descriptor sets for images "
9980 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009981 VkResult err;
9982
Tony Barbour1fa09702017-03-16 12:09:08 -06009983 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07009984 auto depth_format = find_depth_stencil_format(m_device);
9985 if (!depth_format) {
9986 printf(" No Depth + Stencil format found. Skipped.\n");
9987 return;
9988 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009989 VkDescriptorPoolSize ds_type_count = {};
9990 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9991 ds_type_count.descriptorCount = 1;
9992
9993 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9994 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9995 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -07009996 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009997 ds_pool_ci.maxSets = 5;
9998 ds_pool_ci.poolSizeCount = 1;
9999 ds_pool_ci.pPoolSizes = &ds_type_count;
10000
10001 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010002 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010003 ASSERT_VK_SUCCESS(err);
10004
10005 VkDescriptorSetLayoutBinding dsl_binding = {};
10006 dsl_binding.binding = 0;
10007 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10008 dsl_binding.descriptorCount = 1;
10009 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10010 dsl_binding.pImmutableSamplers = NULL;
10011
10012 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10013 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10014 ds_layout_ci.pNext = NULL;
10015 ds_layout_ci.bindingCount = 1;
10016 ds_layout_ci.pBindings = &dsl_binding;
10017 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010018 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010019 ASSERT_VK_SUCCESS(err);
10020
10021 VkDescriptorSet descriptor_set = {};
10022 VkDescriptorSetAllocateInfo alloc_info = {};
10023 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10024 alloc_info.descriptorSetCount = 1;
10025 alloc_info.descriptorPool = ds_pool;
10026 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010027 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010028 ASSERT_VK_SUCCESS(err);
10029
10030 // Create an image to be used for invalid updates
10031 VkImageCreateInfo image_ci = {};
10032 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10033 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010034 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010035 image_ci.extent.width = 64;
10036 image_ci.extent.height = 64;
10037 image_ci.extent.depth = 1;
10038 image_ci.mipLevels = 1;
10039 image_ci.arrayLayers = 1;
10040 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010041 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010042 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10043 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10044 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10045 VkImage image;
10046 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10047 ASSERT_VK_SUCCESS(err);
10048 // Bind memory to image
10049 VkMemoryRequirements mem_reqs;
10050 VkDeviceMemory image_mem;
10051 bool pass;
10052 VkMemoryAllocateInfo mem_alloc = {};
10053 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10054 mem_alloc.pNext = NULL;
10055 mem_alloc.allocationSize = 0;
10056 mem_alloc.memoryTypeIndex = 0;
10057 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10058 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010059 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010060 ASSERT_TRUE(pass);
10061 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10062 ASSERT_VK_SUCCESS(err);
10063 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10064 ASSERT_VK_SUCCESS(err);
10065 // Now create view for image
10066 VkImageViewCreateInfo image_view_ci = {};
10067 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10068 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010069 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010070 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10071 image_view_ci.subresourceRange.layerCount = 1;
10072 image_view_ci.subresourceRange.baseArrayLayer = 0;
10073 image_view_ci.subresourceRange.levelCount = 1;
10074 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010075 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010076
10077 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010078 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010079 ASSERT_VK_SUCCESS(err);
10080
10081 VkDescriptorImageInfo img_info = {};
10082 img_info.imageView = image_view;
10083 VkWriteDescriptorSet descriptor_write = {};
10084 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10085 descriptor_write.dstBinding = 0;
10086 descriptor_write.descriptorCount = 1;
10087 descriptor_write.pTexelBufferView = NULL;
10088 descriptor_write.pBufferInfo = NULL;
10089 descriptor_write.pImageInfo = &img_info;
10090 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10091 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010092 const char *error_msg =
10093 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10094 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010096
10097 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10098
10099 m_errorMonitor->VerifyFound();
10100 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10101 vkDestroyImage(m_device->device(), image, NULL);
10102 vkFreeMemory(m_device->device(), image_mem, NULL);
10103 vkDestroyImageView(m_device->device(), image_view, NULL);
10104 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10105 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10106}
10107
Karl Schultz6addd812016-02-02 17:17:23 -070010108TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010109 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010110 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010111
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10113 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10114 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010115
Tony Barbour1fa09702017-03-16 12:09:08 -060010116 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010117 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010118 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010119 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10120 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010121
10122 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010123 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10124 ds_pool_ci.pNext = NULL;
10125 ds_pool_ci.maxSets = 1;
10126 ds_pool_ci.poolSizeCount = 1;
10127 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010128
Tobin Ehlis3b780662015-05-28 12:11:26 -060010129 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010130 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010131 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010132 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010133 dsl_binding.binding = 0;
10134 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10135 dsl_binding.descriptorCount = 1;
10136 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10137 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010138
Tony Barboureb254902015-07-15 12:50:33 -060010139 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010140 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10141 ds_layout_ci.pNext = NULL;
10142 ds_layout_ci.bindingCount = 1;
10143 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010144
Tobin Ehlis3b780662015-05-28 12:11:26 -060010145 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010146 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010147 ASSERT_VK_SUCCESS(err);
10148
10149 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010150 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010151 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010152 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010153 alloc_info.descriptorPool = ds_pool;
10154 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010155 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010156 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010157
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010158 VkSamplerCreateInfo sampler_ci = {};
10159 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10160 sampler_ci.pNext = NULL;
10161 sampler_ci.magFilter = VK_FILTER_NEAREST;
10162 sampler_ci.minFilter = VK_FILTER_NEAREST;
10163 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10164 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10165 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10166 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10167 sampler_ci.mipLodBias = 1.0;
10168 sampler_ci.anisotropyEnable = VK_FALSE;
10169 sampler_ci.maxAnisotropy = 1;
10170 sampler_ci.compareEnable = VK_FALSE;
10171 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10172 sampler_ci.minLod = 1.0;
10173 sampler_ci.maxLod = 1.0;
10174 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10175 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10176 VkSampler sampler;
10177 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10178 ASSERT_VK_SUCCESS(err);
10179
10180 VkDescriptorImageInfo info = {};
10181 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010182
10183 VkWriteDescriptorSet descriptor_write;
10184 memset(&descriptor_write, 0, sizeof(descriptor_write));
10185 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010186 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010187 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010188 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010189 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010190 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010191
10192 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10193
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010194 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010195
Chia-I Wuf7458c52015-10-26 21:10:41 +080010196 vkDestroySampler(m_device->device(), sampler, NULL);
10197 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10198 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010199}
10200
Karl Schultz6addd812016-02-02 17:17:23 -070010201TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010202 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010203 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010204
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010206
Tony Barbour1fa09702017-03-16 12:09:08 -060010207 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010208 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010209 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010210 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10211 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010212
10213 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010214 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10215 ds_pool_ci.pNext = NULL;
10216 ds_pool_ci.maxSets = 1;
10217 ds_pool_ci.poolSizeCount = 1;
10218 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010219
Tobin Ehlis3b780662015-05-28 12:11:26 -060010220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010222 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010223
Tony Barboureb254902015-07-15 12:50:33 -060010224 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010225 dsl_binding.binding = 0;
10226 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10227 dsl_binding.descriptorCount = 1;
10228 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10229 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010230
10231 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010232 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10233 ds_layout_ci.pNext = NULL;
10234 ds_layout_ci.bindingCount = 1;
10235 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010236
Tobin Ehlis3b780662015-05-28 12:11:26 -060010237 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010238 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010239 ASSERT_VK_SUCCESS(err);
10240
10241 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010242 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010243 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010244 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010245 alloc_info.descriptorPool = ds_pool;
10246 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010247 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010248 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010249
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010250 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10251
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010252 // Correctly update descriptor to avoid "NOT_UPDATED" error
10253 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010254 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010255 buff_info.offset = 0;
10256 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010257
10258 VkWriteDescriptorSet descriptor_write;
10259 memset(&descriptor_write, 0, sizeof(descriptor_write));
10260 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010261 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010262 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010263 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010264 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10265 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010266
10267 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10268
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010269 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010270
Chia-I Wuf7458c52015-10-26 21:10:41 +080010271 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10272 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010273}
10274
Karl Schultz6addd812016-02-02 17:17:23 -070010275TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010276 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010277 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010278
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010280
Tony Barbour1fa09702017-03-16 12:09:08 -060010281 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010282 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010283 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010284 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10285 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010286
10287 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010288 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10289 ds_pool_ci.pNext = NULL;
10290 ds_pool_ci.maxSets = 1;
10291 ds_pool_ci.poolSizeCount = 1;
10292 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010293
Tobin Ehlis3b780662015-05-28 12:11:26 -060010294 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010295 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010296 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010297
Tony Barboureb254902015-07-15 12:50:33 -060010298 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010299 dsl_binding.binding = 0;
10300 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10301 dsl_binding.descriptorCount = 1;
10302 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10303 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010304
10305 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010306 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10307 ds_layout_ci.pNext = NULL;
10308 ds_layout_ci.bindingCount = 1;
10309 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010310 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010311 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010312 ASSERT_VK_SUCCESS(err);
10313
10314 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010315 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010316 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010317 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010318 alloc_info.descriptorPool = ds_pool;
10319 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010320 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010321 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010322
Tony Barboureb254902015-07-15 12:50:33 -060010323 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010324 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10325 sampler_ci.pNext = NULL;
10326 sampler_ci.magFilter = VK_FILTER_NEAREST;
10327 sampler_ci.minFilter = VK_FILTER_NEAREST;
10328 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10329 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10330 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10331 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10332 sampler_ci.mipLodBias = 1.0;
10333 sampler_ci.anisotropyEnable = VK_FALSE;
10334 sampler_ci.maxAnisotropy = 1;
10335 sampler_ci.compareEnable = VK_FALSE;
10336 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10337 sampler_ci.minLod = 1.0;
10338 sampler_ci.maxLod = 1.0;
10339 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10340 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010341
Tobin Ehlis3b780662015-05-28 12:11:26 -060010342 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010343 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010344 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010345
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010346 VkDescriptorImageInfo info = {};
10347 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010348
10349 VkWriteDescriptorSet descriptor_write;
10350 memset(&descriptor_write, 0, sizeof(descriptor_write));
10351 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010352 descriptor_write.dstSet = descriptorSet;
10353 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010354 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010355 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010356 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010357 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010358
10359 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10360
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010361 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010362
Chia-I Wuf7458c52015-10-26 21:10:41 +080010363 vkDestroySampler(m_device->device(), sampler, NULL);
10364 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10365 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010366}
10367
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010368TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10369 // Create layout w/ empty binding and attempt to update it
10370 VkResult err;
10371
Tony Barbour1fa09702017-03-16 12:09:08 -060010372 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010373
10374 VkDescriptorPoolSize ds_type_count = {};
10375 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10376 ds_type_count.descriptorCount = 1;
10377
10378 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10379 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10380 ds_pool_ci.pNext = NULL;
10381 ds_pool_ci.maxSets = 1;
10382 ds_pool_ci.poolSizeCount = 1;
10383 ds_pool_ci.pPoolSizes = &ds_type_count;
10384
10385 VkDescriptorPool ds_pool;
10386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10387 ASSERT_VK_SUCCESS(err);
10388
10389 VkDescriptorSetLayoutBinding dsl_binding = {};
10390 dsl_binding.binding = 0;
10391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10392 dsl_binding.descriptorCount = 0;
10393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10394 dsl_binding.pImmutableSamplers = NULL;
10395
10396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10398 ds_layout_ci.pNext = NULL;
10399 ds_layout_ci.bindingCount = 1;
10400 ds_layout_ci.pBindings = &dsl_binding;
10401 VkDescriptorSetLayout ds_layout;
10402 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10403 ASSERT_VK_SUCCESS(err);
10404
10405 VkDescriptorSet descriptor_set;
10406 VkDescriptorSetAllocateInfo alloc_info = {};
10407 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10408 alloc_info.descriptorSetCount = 1;
10409 alloc_info.descriptorPool = ds_pool;
10410 alloc_info.pSetLayouts = &ds_layout;
10411 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10412 ASSERT_VK_SUCCESS(err);
10413
10414 VkSamplerCreateInfo sampler_ci = {};
10415 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10416 sampler_ci.magFilter = VK_FILTER_NEAREST;
10417 sampler_ci.minFilter = VK_FILTER_NEAREST;
10418 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10419 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10420 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10421 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10422 sampler_ci.mipLodBias = 1.0;
10423 sampler_ci.maxAnisotropy = 1;
10424 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10425 sampler_ci.minLod = 1.0;
10426 sampler_ci.maxLod = 1.0;
10427 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10428
10429 VkSampler sampler;
10430 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10431 ASSERT_VK_SUCCESS(err);
10432
10433 VkDescriptorImageInfo info = {};
10434 info.sampler = sampler;
10435
10436 VkWriteDescriptorSet descriptor_write;
10437 memset(&descriptor_write, 0, sizeof(descriptor_write));
10438 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10439 descriptor_write.dstSet = descriptor_set;
10440 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010441 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010442 // This is the wrong type, but empty binding error will be flagged first
10443 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10444 descriptor_write.pImageInfo = &info;
10445
10446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10447 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10448 m_errorMonitor->VerifyFound();
10449
10450 vkDestroySampler(m_device->device(), sampler, NULL);
10451 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10452 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10453}
10454
Karl Schultz6addd812016-02-02 17:17:23 -070010455TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10456 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10457 // types
10458 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010459
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010460 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 -060010461
Tony Barbour1fa09702017-03-16 12:09:08 -060010462 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010463
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010464 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010465 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10466 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010467
10468 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010469 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10470 ds_pool_ci.pNext = NULL;
10471 ds_pool_ci.maxSets = 1;
10472 ds_pool_ci.poolSizeCount = 1;
10473 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010474
Tobin Ehlis3b780662015-05-28 12:11:26 -060010475 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010476 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010477 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010478 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010479 dsl_binding.binding = 0;
10480 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10481 dsl_binding.descriptorCount = 1;
10482 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10483 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010484
Tony Barboureb254902015-07-15 12:50:33 -060010485 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010486 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10487 ds_layout_ci.pNext = NULL;
10488 ds_layout_ci.bindingCount = 1;
10489 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010490
Tobin Ehlis3b780662015-05-28 12:11:26 -060010491 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010492 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010493 ASSERT_VK_SUCCESS(err);
10494
10495 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010496 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010497 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010498 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010499 alloc_info.descriptorPool = ds_pool;
10500 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010501 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010502 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010503
Tony Barboureb254902015-07-15 12:50:33 -060010504 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010505 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10506 sampler_ci.pNext = NULL;
10507 sampler_ci.magFilter = VK_FILTER_NEAREST;
10508 sampler_ci.minFilter = VK_FILTER_NEAREST;
10509 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10510 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10511 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10512 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10513 sampler_ci.mipLodBias = 1.0;
10514 sampler_ci.anisotropyEnable = VK_FALSE;
10515 sampler_ci.maxAnisotropy = 1;
10516 sampler_ci.compareEnable = VK_FALSE;
10517 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10518 sampler_ci.minLod = 1.0;
10519 sampler_ci.maxLod = 1.0;
10520 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10521 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010522 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010523 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010524 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010525
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010526 VkDescriptorImageInfo info = {};
10527 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010528
10529 VkWriteDescriptorSet descriptor_write;
10530 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010531 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010532 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010533 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010534 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010535 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010536 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010537
10538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10539
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010540 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010541
Chia-I Wuf7458c52015-10-26 21:10:41 +080010542 vkDestroySampler(m_device->device(), sampler, NULL);
10543 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10544 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010545}
10546
Karl Schultz6addd812016-02-02 17:17:23 -070010547TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010548 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010549 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010550
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010552
Tony Barbour1fa09702017-03-16 12:09:08 -060010553 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010554 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10555 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010556 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010557 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10558 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010559
10560 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010561 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10562 ds_pool_ci.pNext = NULL;
10563 ds_pool_ci.maxSets = 1;
10564 ds_pool_ci.poolSizeCount = 1;
10565 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010566
10567 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010568 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010569 ASSERT_VK_SUCCESS(err);
10570
10571 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010572 dsl_binding.binding = 0;
10573 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10574 dsl_binding.descriptorCount = 1;
10575 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10576 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010577
10578 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010579 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10580 ds_layout_ci.pNext = NULL;
10581 ds_layout_ci.bindingCount = 1;
10582 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010583 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010584 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010585 ASSERT_VK_SUCCESS(err);
10586
10587 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010588 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010589 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010590 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010591 alloc_info.descriptorPool = ds_pool;
10592 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010593 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010594 ASSERT_VK_SUCCESS(err);
10595
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010596 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010597
10598 VkDescriptorImageInfo descriptor_info;
10599 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10600 descriptor_info.sampler = sampler;
10601
10602 VkWriteDescriptorSet descriptor_write;
10603 memset(&descriptor_write, 0, sizeof(descriptor_write));
10604 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010605 descriptor_write.dstSet = descriptorSet;
10606 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010607 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010608 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10609 descriptor_write.pImageInfo = &descriptor_info;
10610
10611 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10612
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010613 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010614
Chia-I Wuf7458c52015-10-26 21:10:41 +080010615 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10616 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010617}
10618
Karl Schultz6addd812016-02-02 17:17:23 -070010619TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10620 // Create a single combined Image/Sampler descriptor and send it an invalid
10621 // imageView
10622 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010623
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010625
Tony Barbour1fa09702017-03-16 12:09:08 -060010626 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010627 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010628 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10629 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010630
10631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10633 ds_pool_ci.pNext = NULL;
10634 ds_pool_ci.maxSets = 1;
10635 ds_pool_ci.poolSizeCount = 1;
10636 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010637
10638 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010639 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010640 ASSERT_VK_SUCCESS(err);
10641
10642 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010643 dsl_binding.binding = 0;
10644 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10645 dsl_binding.descriptorCount = 1;
10646 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10647 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010648
10649 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010650 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10651 ds_layout_ci.pNext = NULL;
10652 ds_layout_ci.bindingCount = 1;
10653 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010654 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010655 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010656 ASSERT_VK_SUCCESS(err);
10657
10658 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010659 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010660 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010661 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010662 alloc_info.descriptorPool = ds_pool;
10663 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010664 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010665 ASSERT_VK_SUCCESS(err);
10666
10667 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010668 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10669 sampler_ci.pNext = NULL;
10670 sampler_ci.magFilter = VK_FILTER_NEAREST;
10671 sampler_ci.minFilter = VK_FILTER_NEAREST;
10672 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10673 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10674 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10675 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10676 sampler_ci.mipLodBias = 1.0;
10677 sampler_ci.anisotropyEnable = VK_FALSE;
10678 sampler_ci.maxAnisotropy = 1;
10679 sampler_ci.compareEnable = VK_FALSE;
10680 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10681 sampler_ci.minLod = 1.0;
10682 sampler_ci.maxLod = 1.0;
10683 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10684 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010685
10686 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010687 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010688 ASSERT_VK_SUCCESS(err);
10689
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010690 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010691
10692 VkDescriptorImageInfo descriptor_info;
10693 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10694 descriptor_info.sampler = sampler;
10695 descriptor_info.imageView = view;
10696
10697 VkWriteDescriptorSet descriptor_write;
10698 memset(&descriptor_write, 0, sizeof(descriptor_write));
10699 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010700 descriptor_write.dstSet = descriptorSet;
10701 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010702 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010703 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10704 descriptor_write.pImageInfo = &descriptor_info;
10705
10706 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10707
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010708 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010709
Chia-I Wuf7458c52015-10-26 21:10:41 +080010710 vkDestroySampler(m_device->device(), sampler, NULL);
10711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010713}
10714
Karl Schultz6addd812016-02-02 17:17:23 -070010715TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10716 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10717 // into the other
10718 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010719
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10721 " binding #1 with type "
10722 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10723 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010724
Tony Barbour1fa09702017-03-16 12:09:08 -060010725 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010726 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010727 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010728 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10729 ds_type_count[0].descriptorCount = 1;
10730 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10731 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010732
10733 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010734 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10735 ds_pool_ci.pNext = NULL;
10736 ds_pool_ci.maxSets = 1;
10737 ds_pool_ci.poolSizeCount = 2;
10738 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010739
10740 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010741 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010742 ASSERT_VK_SUCCESS(err);
10743 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010744 dsl_binding[0].binding = 0;
10745 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10746 dsl_binding[0].descriptorCount = 1;
10747 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10748 dsl_binding[0].pImmutableSamplers = NULL;
10749 dsl_binding[1].binding = 1;
10750 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10751 dsl_binding[1].descriptorCount = 1;
10752 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10753 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010754
10755 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010756 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10757 ds_layout_ci.pNext = NULL;
10758 ds_layout_ci.bindingCount = 2;
10759 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010760
10761 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010763 ASSERT_VK_SUCCESS(err);
10764
10765 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010766 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010767 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010768 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010769 alloc_info.descriptorPool = ds_pool;
10770 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010771 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010772 ASSERT_VK_SUCCESS(err);
10773
10774 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010775 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10776 sampler_ci.pNext = NULL;
10777 sampler_ci.magFilter = VK_FILTER_NEAREST;
10778 sampler_ci.minFilter = VK_FILTER_NEAREST;
10779 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10780 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10781 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10782 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10783 sampler_ci.mipLodBias = 1.0;
10784 sampler_ci.anisotropyEnable = VK_FALSE;
10785 sampler_ci.maxAnisotropy = 1;
10786 sampler_ci.compareEnable = VK_FALSE;
10787 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10788 sampler_ci.minLod = 1.0;
10789 sampler_ci.maxLod = 1.0;
10790 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10791 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010792
10793 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010794 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010795 ASSERT_VK_SUCCESS(err);
10796
10797 VkDescriptorImageInfo info = {};
10798 info.sampler = sampler;
10799
10800 VkWriteDescriptorSet descriptor_write;
10801 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10802 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010803 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010804 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010805 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010806 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10807 descriptor_write.pImageInfo = &info;
10808 // This write update should succeed
10809 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10810 // Now perform a copy update that fails due to type mismatch
10811 VkCopyDescriptorSet copy_ds_update;
10812 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10813 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10814 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010815 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010816 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010817 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10818 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010819 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10820
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010821 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010822 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010823 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 -060010824 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10825 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10826 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010827 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010828 copy_ds_update.dstSet = descriptorSet;
10829 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010830 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010831 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10832
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010833 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010834
Tobin Ehlis04356f92015-10-27 16:35:27 -060010835 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10837 " binding#1 with offset index of 1 plus "
10838 "update array offset of 0 and update of "
10839 "5 descriptors oversteps total number "
10840 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010841
Tobin Ehlis04356f92015-10-27 16:35:27 -060010842 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10843 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10844 copy_ds_update.srcSet = descriptorSet;
10845 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010846 copy_ds_update.dstSet = descriptorSet;
10847 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010848 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010849 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10850
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010851 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010852
Chia-I Wuf7458c52015-10-26 21:10:41 +080010853 vkDestroySampler(m_device->device(), sampler, NULL);
10854 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10855 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010856}
10857
Karl Schultz6addd812016-02-02 17:17:23 -070010858TEST_F(VkLayerTest, NumSamplesMismatch) {
10859 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10860 // sampleCount
10861 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010862
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010864
Tony Barbour1fa09702017-03-16 12:09:08 -060010865 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010867 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010868 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010869 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010870
10871 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010872 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10873 ds_pool_ci.pNext = NULL;
10874 ds_pool_ci.maxSets = 1;
10875 ds_pool_ci.poolSizeCount = 1;
10876 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010877
Tobin Ehlis3b780662015-05-28 12:11:26 -060010878 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010879 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010880 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010881
Tony Barboureb254902015-07-15 12:50:33 -060010882 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010883 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010884 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010885 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010886 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10887 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010888
Tony Barboureb254902015-07-15 12:50:33 -060010889 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10890 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10891 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010892 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010893 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010894
Tobin Ehlis3b780662015-05-28 12:11:26 -060010895 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010896 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010897 ASSERT_VK_SUCCESS(err);
10898
10899 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010900 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010901 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010902 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010903 alloc_info.descriptorPool = ds_pool;
10904 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010905 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010906 ASSERT_VK_SUCCESS(err);
10907
Tony Barboureb254902015-07-15 12:50:33 -060010908 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010909 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010910 pipe_ms_state_ci.pNext = NULL;
10911 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10912 pipe_ms_state_ci.sampleShadingEnable = 0;
10913 pipe_ms_state_ci.minSampleShading = 1.0;
10914 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010915
Tony Barboureb254902015-07-15 12:50:33 -060010916 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010917 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10918 pipeline_layout_ci.pNext = NULL;
10919 pipeline_layout_ci.setLayoutCount = 1;
10920 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010921
10922 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010924 ASSERT_VK_SUCCESS(err);
10925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010926 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010927 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 -060010928 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010929 VkPipelineObj pipe(m_device);
10930 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010931 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010932 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010933 pipe.SetMSAA(&pipe_ms_state_ci);
10934 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010935
Tony Barbour552f6c02016-12-21 14:34:07 -070010936 m_commandBuffer->BeginCommandBuffer();
10937 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010938 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010939
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010940 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10941 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10942 VkRect2D scissor = {{0, 0}, {16, 16}};
10943 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10944
Mark Young29927482016-05-04 14:38:51 -060010945 // Render triangle (the error should trigger on the attempt to draw).
10946 Draw(3, 1, 0, 0);
10947
10948 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010949 m_commandBuffer->EndRenderPass();
10950 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010951
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010952 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010953
Chia-I Wuf7458c52015-10-26 21:10:41 +080010954 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10955 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10956 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010957}
Mark Young29927482016-05-04 14:38:51 -060010958
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010959TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010960 TEST_DESCRIPTION(
10961 "Hit RenderPass incompatible cases. "
10962 "Initial case is drawing with an active renderpass that's "
10963 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010964 VkResult err;
10965
Tony Barbour1fa09702017-03-16 12:09:08 -060010966 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10968
10969 VkDescriptorSetLayoutBinding dsl_binding = {};
10970 dsl_binding.binding = 0;
10971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10972 dsl_binding.descriptorCount = 1;
10973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10974 dsl_binding.pImmutableSamplers = NULL;
10975
10976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10978 ds_layout_ci.pNext = NULL;
10979 ds_layout_ci.bindingCount = 1;
10980 ds_layout_ci.pBindings = &dsl_binding;
10981
10982 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010983 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010984 ASSERT_VK_SUCCESS(err);
10985
10986 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10987 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10988 pipeline_layout_ci.pNext = NULL;
10989 pipeline_layout_ci.setLayoutCount = 1;
10990 pipeline_layout_ci.pSetLayouts = &ds_layout;
10991
10992 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010993 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010994 ASSERT_VK_SUCCESS(err);
10995
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010996 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010997 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 -060010998 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010999 // Create a renderpass that will be incompatible with default renderpass
11000 VkAttachmentReference attach = {};
11001 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11002 VkAttachmentReference color_att = {};
11003 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11004 VkSubpassDescription subpass = {};
11005 subpass.inputAttachmentCount = 1;
11006 subpass.pInputAttachments = &attach;
11007 subpass.colorAttachmentCount = 1;
11008 subpass.pColorAttachments = &color_att;
11009 VkRenderPassCreateInfo rpci = {};
11010 rpci.subpassCount = 1;
11011 rpci.pSubpasses = &subpass;
11012 rpci.attachmentCount = 1;
11013 VkAttachmentDescription attach_desc = {};
11014 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011015 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11016 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011017 rpci.pAttachments = &attach_desc;
11018 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11019 VkRenderPass rp;
11020 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11021 VkPipelineObj pipe(m_device);
11022 pipe.AddShader(&vs);
11023 pipe.AddShader(&fs);
11024 pipe.AddColorAttachment();
11025 VkViewport view_port = {};
11026 m_viewports.push_back(view_port);
11027 pipe.SetViewport(m_viewports);
11028 VkRect2D rect = {};
11029 m_scissors.push_back(rect);
11030 pipe.SetScissor(m_scissors);
11031 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11032
11033 VkCommandBufferInheritanceInfo cbii = {};
11034 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11035 cbii.renderPass = rp;
11036 cbii.subpass = 0;
11037 VkCommandBufferBeginInfo cbbi = {};
11038 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11039 cbbi.pInheritanceInfo = &cbii;
11040 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11041 VkRenderPassBeginInfo rpbi = {};
11042 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11043 rpbi.framebuffer = m_framebuffer;
11044 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011045 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11046 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011047
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011049 // Render triangle (the error should trigger on the attempt to draw).
11050 Draw(3, 1, 0, 0);
11051
11052 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011053 m_commandBuffer->EndRenderPass();
11054 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011055
11056 m_errorMonitor->VerifyFound();
11057
11058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11060 vkDestroyRenderPass(m_device->device(), rp, NULL);
11061}
11062
Mark Youngc89c6312016-03-31 16:03:20 -060011063TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11064 // Create Pipeline where the number of blend attachments doesn't match the
11065 // number of color attachments. In this case, we don't add any color
11066 // blend attachments even though we have a color attachment.
11067 VkResult err;
11068
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011070
Tony Barbour1fa09702017-03-16 12:09:08 -060011071 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11073 VkDescriptorPoolSize ds_type_count = {};
11074 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11075 ds_type_count.descriptorCount = 1;
11076
11077 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11078 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11079 ds_pool_ci.pNext = NULL;
11080 ds_pool_ci.maxSets = 1;
11081 ds_pool_ci.poolSizeCount = 1;
11082 ds_pool_ci.pPoolSizes = &ds_type_count;
11083
11084 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011085 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011086 ASSERT_VK_SUCCESS(err);
11087
11088 VkDescriptorSetLayoutBinding dsl_binding = {};
11089 dsl_binding.binding = 0;
11090 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11091 dsl_binding.descriptorCount = 1;
11092 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11093 dsl_binding.pImmutableSamplers = NULL;
11094
11095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11097 ds_layout_ci.pNext = NULL;
11098 ds_layout_ci.bindingCount = 1;
11099 ds_layout_ci.pBindings = &dsl_binding;
11100
11101 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011103 ASSERT_VK_SUCCESS(err);
11104
11105 VkDescriptorSet descriptorSet;
11106 VkDescriptorSetAllocateInfo alloc_info = {};
11107 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11108 alloc_info.descriptorSetCount = 1;
11109 alloc_info.descriptorPool = ds_pool;
11110 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011111 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011112 ASSERT_VK_SUCCESS(err);
11113
11114 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011115 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011116 pipe_ms_state_ci.pNext = NULL;
11117 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11118 pipe_ms_state_ci.sampleShadingEnable = 0;
11119 pipe_ms_state_ci.minSampleShading = 1.0;
11120 pipe_ms_state_ci.pSampleMask = NULL;
11121
11122 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11123 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11124 pipeline_layout_ci.pNext = NULL;
11125 pipeline_layout_ci.setLayoutCount = 1;
11126 pipeline_layout_ci.pSetLayouts = &ds_layout;
11127
11128 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011129 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011130 ASSERT_VK_SUCCESS(err);
11131
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011132 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011133 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 -060011134 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011135 VkPipelineObj pipe(m_device);
11136 pipe.AddShader(&vs);
11137 pipe.AddShader(&fs);
11138 pipe.SetMSAA(&pipe_ms_state_ci);
11139 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011140 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011141
11142 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11143 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11144 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11145}
Mark Young29927482016-05-04 14:38:51 -060011146
Mark Muellerd4914412016-06-13 17:52:06 -060011147TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011148 TEST_DESCRIPTION(
11149 "Points to a wrong colorAttachment index in a VkClearAttachment "
11150 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011151 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011153
11154 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11155 m_errorMonitor->VerifyFound();
11156}
11157
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011158TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011159 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11160 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011161
Tony Barbour1fa09702017-03-16 12:09:08 -060011162 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011164
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011165 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011166 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11167 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011168
11169 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011170 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11171 ds_pool_ci.pNext = NULL;
11172 ds_pool_ci.maxSets = 1;
11173 ds_pool_ci.poolSizeCount = 1;
11174 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011175
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011176 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011177 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011178 ASSERT_VK_SUCCESS(err);
11179
Tony Barboureb254902015-07-15 12:50:33 -060011180 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011181 dsl_binding.binding = 0;
11182 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11183 dsl_binding.descriptorCount = 1;
11184 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11185 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011186
Tony Barboureb254902015-07-15 12:50:33 -060011187 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011188 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11189 ds_layout_ci.pNext = NULL;
11190 ds_layout_ci.bindingCount = 1;
11191 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011192
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011193 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011194 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011195 ASSERT_VK_SUCCESS(err);
11196
11197 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011198 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011199 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011200 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011201 alloc_info.descriptorPool = ds_pool;
11202 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011203 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011204 ASSERT_VK_SUCCESS(err);
11205
Tony Barboureb254902015-07-15 12:50:33 -060011206 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011207 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011208 pipe_ms_state_ci.pNext = NULL;
11209 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11210 pipe_ms_state_ci.sampleShadingEnable = 0;
11211 pipe_ms_state_ci.minSampleShading = 1.0;
11212 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011213
Tony Barboureb254902015-07-15 12:50:33 -060011214 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011215 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11216 pipeline_layout_ci.pNext = NULL;
11217 pipeline_layout_ci.setLayoutCount = 1;
11218 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011219
11220 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011221 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011222 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011223
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011224 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011225 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011226 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011228
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011229 VkPipelineObj pipe(m_device);
11230 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011231 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011232 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011233 pipe.SetMSAA(&pipe_ms_state_ci);
11234 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011235
Tony Barbour552f6c02016-12-21 14:34:07 -070011236 m_commandBuffer->BeginCommandBuffer();
11237 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011238
Karl Schultz6addd812016-02-02 17:17:23 -070011239 // Main thing we care about for this test is that the VkImage obj we're
11240 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011241 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011242 VkClearAttachment color_attachment;
11243 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11244 color_attachment.clearValue.color.float32[0] = 1.0;
11245 color_attachment.clearValue.color.float32[1] = 1.0;
11246 color_attachment.clearValue.color.float32[2] = 1.0;
11247 color_attachment.clearValue.color.float32[3] = 1.0;
11248 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011249 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011250
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011251 // Call for full-sized FB Color attachment prior to issuing a Draw
11252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011253 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011254 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011255 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011256
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011257 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11258 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11260 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11261 m_errorMonitor->VerifyFound();
11262
11263 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11264 clear_rect.layerCount = 2;
11265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11266 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011267 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011268
Chia-I Wuf7458c52015-10-26 21:10:41 +080011269 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11270 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11271 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011272}
11273
Karl Schultz6addd812016-02-02 17:17:23 -070011274TEST_F(VkLayerTest, VtxBufferBadIndex) {
11275 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011276
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11278 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011279
Tony Barbour1fa09702017-03-16 12:09:08 -060011280 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011281 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011282 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011283
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011284 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011285 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11286 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011287
11288 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011289 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11290 ds_pool_ci.pNext = NULL;
11291 ds_pool_ci.maxSets = 1;
11292 ds_pool_ci.poolSizeCount = 1;
11293 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011294
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011295 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011296 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011297 ASSERT_VK_SUCCESS(err);
11298
Tony Barboureb254902015-07-15 12:50:33 -060011299 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011300 dsl_binding.binding = 0;
11301 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11302 dsl_binding.descriptorCount = 1;
11303 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11304 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011305
Tony Barboureb254902015-07-15 12:50:33 -060011306 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011307 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11308 ds_layout_ci.pNext = NULL;
11309 ds_layout_ci.bindingCount = 1;
11310 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011311
Tobin Ehlis502480b2015-06-24 15:53:07 -060011312 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011313 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011314 ASSERT_VK_SUCCESS(err);
11315
11316 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011317 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011318 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011319 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011320 alloc_info.descriptorPool = ds_pool;
11321 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011322 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011323 ASSERT_VK_SUCCESS(err);
11324
Tony Barboureb254902015-07-15 12:50:33 -060011325 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011326 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011327 pipe_ms_state_ci.pNext = NULL;
11328 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11329 pipe_ms_state_ci.sampleShadingEnable = 0;
11330 pipe_ms_state_ci.minSampleShading = 1.0;
11331 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011332
Tony Barboureb254902015-07-15 12:50:33 -060011333 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011334 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11335 pipeline_layout_ci.pNext = NULL;
11336 pipeline_layout_ci.setLayoutCount = 1;
11337 pipeline_layout_ci.pSetLayouts = &ds_layout;
11338 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011339
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011340 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011341 ASSERT_VK_SUCCESS(err);
11342
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011343 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011344 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 -060011345 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011346 VkPipelineObj pipe(m_device);
11347 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011348 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011349 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011350 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011351 pipe.SetViewport(m_viewports);
11352 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011353 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011354
Tony Barbour552f6c02016-12-21 14:34:07 -070011355 m_commandBuffer->BeginCommandBuffer();
11356 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011357 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011358 // Don't care about actual data, just need to get to draw to flag error
11359 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011360 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011361 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011362 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011363
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011364 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011365
Chia-I Wuf7458c52015-10-26 21:10:41 +080011366 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11367 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11368 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011369}
Mark Muellerdfe37552016-07-07 14:47:42 -060011370
Mark Mueller2ee294f2016-08-04 12:59:48 -060011371TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011372 TEST_DESCRIPTION(
11373 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11374 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011375 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011376
Mark Mueller880fce52016-08-17 15:23:23 -060011377 // The following test fails with recent NVidia drivers.
11378 // By the time core_validation is reached, the NVidia
11379 // driver has sanitized the invalid condition and core_validation
11380 // is not introduced to the failure condition. This is not the case
11381 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011382 // uint32_t count = static_cast<uint32_t>(~0);
11383 // VkPhysicalDevice physical_device;
11384 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11385 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011386
Mark Mueller2ee294f2016-08-04 12:59:48 -060011387 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011388 VkDeviceQueueCreateInfo queue_create_info = {};
11389 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11390 queue_create_info.queueCount = 1;
11391 queue_create_info.pQueuePriorities = &queue_priority;
11392 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11393
11394 VkPhysicalDeviceFeatures features = m_device->phy().features();
11395 VkDevice testDevice;
11396 VkDeviceCreateInfo device_create_info = {};
11397 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11398 device_create_info.queueCreateInfoCount = 1;
11399 device_create_info.pQueueCreateInfos = &queue_create_info;
11400 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011401
11402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11403 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011404 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11405 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11406 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011407 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11408 m_errorMonitor->VerifyFound();
11409
11410 queue_create_info.queueFamilyIndex = 1;
11411
11412 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11413 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11414 for (unsigned i = 0; i < feature_count; i++) {
11415 if (VK_FALSE == feature_array[i]) {
11416 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011417 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11419 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011420 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11421 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11422 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11424 "You requested features that are unavailable on this device. You should first "
11425 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011426 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11427 m_errorMonitor->VerifyFound();
11428 break;
11429 }
11430 }
11431}
11432
Tobin Ehlis16edf082016-11-21 12:33:49 -070011433TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11434 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11435
Tony Barbour1fa09702017-03-16 12:09:08 -060011436 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011437
11438 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11439 std::vector<VkDeviceQueueCreateInfo> queue_info;
11440 queue_info.reserve(queue_props.size());
11441 std::vector<std::vector<float>> queue_priorities;
11442 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11443 VkDeviceQueueCreateInfo qi{};
11444 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11445 qi.queueFamilyIndex = i;
11446 qi.queueCount = queue_props[i].queueCount;
11447 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11448 qi.pQueuePriorities = queue_priorities[i].data();
11449 queue_info.push_back(qi);
11450 }
11451
11452 std::vector<const char *> device_extension_names;
11453
11454 VkDevice local_device;
11455 VkDeviceCreateInfo device_create_info = {};
11456 auto features = m_device->phy().features();
11457 // Intentionally disable pipeline stats
11458 features.pipelineStatisticsQuery = VK_FALSE;
11459 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11460 device_create_info.pNext = NULL;
11461 device_create_info.queueCreateInfoCount = queue_info.size();
11462 device_create_info.pQueueCreateInfos = queue_info.data();
11463 device_create_info.enabledLayerCount = 0;
11464 device_create_info.ppEnabledLayerNames = NULL;
11465 device_create_info.pEnabledFeatures = &features;
11466 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11467 ASSERT_VK_SUCCESS(err);
11468
11469 VkQueryPoolCreateInfo qpci{};
11470 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11471 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11472 qpci.queryCount = 1;
11473 VkQueryPool query_pool;
11474
11475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11476 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11477 m_errorMonitor->VerifyFound();
11478
11479 vkDestroyDevice(local_device, nullptr);
11480}
11481
Mark Mueller2ee294f2016-08-04 12:59:48 -060011482TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011483 TEST_DESCRIPTION(
11484 "Use an invalid queue index in a vkCmdWaitEvents call."
11485 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011486
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011487 const char *invalid_queue_index =
11488 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11489 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11490 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011491
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011492 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011493
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011495
Tony Barbour1fa09702017-03-16 12:09:08 -060011496 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011497
11498 VkEvent event;
11499 VkEventCreateInfo event_create_info{};
11500 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11501 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11502
Mark Mueller2ee294f2016-08-04 12:59:48 -060011503 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011504 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011505
Tony Barbour552f6c02016-12-21 14:34:07 -070011506 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011507
11508 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011509 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 -060011510 ASSERT_TRUE(image.initialized());
11511 VkImageMemoryBarrier img_barrier = {};
11512 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11513 img_barrier.pNext = NULL;
11514 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11515 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11516 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11517 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11518 img_barrier.image = image.handle();
11519 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011520
11521 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11522 // that layer validation catches the case when it is not.
11523 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011524 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11525 img_barrier.subresourceRange.baseArrayLayer = 0;
11526 img_barrier.subresourceRange.baseMipLevel = 0;
11527 img_barrier.subresourceRange.layerCount = 1;
11528 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011529 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11530 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011531 m_errorMonitor->VerifyFound();
11532
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011534
11535 VkQueryPool query_pool;
11536 VkQueryPoolCreateInfo query_pool_create_info = {};
11537 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11538 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11539 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011540 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011542 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011543 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11544
11545 vkEndCommandBuffer(m_commandBuffer->handle());
11546 m_errorMonitor->VerifyFound();
11547
11548 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11549 vkDestroyEvent(m_device->device(), event, nullptr);
11550}
11551
Mark Muellerdfe37552016-07-07 14:47:42 -060011552TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011553 TEST_DESCRIPTION(
11554 "Submit a command buffer using deleted vertex buffer, "
11555 "delete a buffer twice, use an invalid offset for each "
11556 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011557
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011558 const char *deleted_buffer_in_command_buffer =
11559 "Cannot submit cmd buffer "
11560 "using deleted buffer ";
11561 const char *invalid_offset_message =
11562 "vkBindBufferMemory(): "
11563 "memoryOffset is 0x";
11564 const char *invalid_storage_buffer_offset_message =
11565 "vkBindBufferMemory(): "
11566 "storage memoryOffset "
11567 "is 0x";
11568 const char *invalid_texel_buffer_offset_message =
11569 "vkBindBufferMemory(): "
11570 "texel memoryOffset "
11571 "is 0x";
11572 const char *invalid_uniform_buffer_offset_message =
11573 "vkBindBufferMemory(): "
11574 "uniform memoryOffset "
11575 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011576
Tony Barbour1fa09702017-03-16 12:09:08 -060011577 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011578 ASSERT_NO_FATAL_FAILURE(InitViewport());
11579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11580
11581 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011582 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011583 pipe_ms_state_ci.pNext = NULL;
11584 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11585 pipe_ms_state_ci.sampleShadingEnable = 0;
11586 pipe_ms_state_ci.minSampleShading = 1.0;
11587 pipe_ms_state_ci.pSampleMask = nullptr;
11588
11589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11591 VkPipelineLayout pipeline_layout;
11592
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011593 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011594 ASSERT_VK_SUCCESS(err);
11595
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011596 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11597 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011598 VkPipelineObj pipe(m_device);
11599 pipe.AddShader(&vs);
11600 pipe.AddShader(&fs);
11601 pipe.AddColorAttachment();
11602 pipe.SetMSAA(&pipe_ms_state_ci);
11603 pipe.SetViewport(m_viewports);
11604 pipe.SetScissor(m_scissors);
11605 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11606
Tony Barbour552f6c02016-12-21 14:34:07 -070011607 m_commandBuffer->BeginCommandBuffer();
11608 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011609 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011610
11611 {
11612 // Create and bind a vertex buffer in a reduced scope, which will cause
11613 // it to be deleted upon leaving this scope
11614 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011615 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011616 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11617 draw_verticies.AddVertexInputToPipe(pipe);
11618 }
11619
11620 Draw(1, 0, 0, 0);
11621
Tony Barbour552f6c02016-12-21 14:34:07 -070011622 m_commandBuffer->EndRenderPass();
11623 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011626 QueueCommandBuffer(false);
11627 m_errorMonitor->VerifyFound();
11628
11629 {
11630 // Create and bind a vertex buffer in a reduced scope, and delete it
11631 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011632 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011634 buffer_test.TestDoubleDestroy();
11635 }
11636 m_errorMonitor->VerifyFound();
11637
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011638 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011639 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011640 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011642 m_errorMonitor->SetUnexpectedError(
11643 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11644 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011645 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11646 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011647 m_errorMonitor->VerifyFound();
11648 }
11649
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011650 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11651 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011652 // Create and bind a memory buffer with an invalid offset again,
11653 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011655 m_errorMonitor->SetUnexpectedError(
11656 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11657 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011658 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11659 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011660 m_errorMonitor->VerifyFound();
11661 }
11662
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011663 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011664 // Create and bind a memory buffer with an invalid offset again, but
11665 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011667 m_errorMonitor->SetUnexpectedError(
11668 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11669 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011670 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11671 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011672 m_errorMonitor->VerifyFound();
11673 }
11674
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011675 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011676 // Create and bind a memory buffer with an invalid offset again, but
11677 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011679 m_errorMonitor->SetUnexpectedError(
11680 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11681 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011682 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11683 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011684 m_errorMonitor->VerifyFound();
11685 }
11686
11687 {
11688 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011690 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11691 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011692 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11693 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011694 m_errorMonitor->VerifyFound();
11695 }
11696
11697 {
11698 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011700 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11701 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011702 }
11703 m_errorMonitor->VerifyFound();
11704
11705 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11706}
11707
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011708// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11709TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011710 TEST_DESCRIPTION(
11711 "Hit all possible validation checks associated with the "
11712 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11713 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011714 // 3 in ValidateCmdBufImageLayouts
11715 // * -1 Attempt to submit cmd buf w/ deleted image
11716 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11717 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011718
Tony Barbour1fa09702017-03-16 12:09:08 -060011719 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070011720 auto depth_format = find_depth_stencil_format(m_device);
11721 if (!depth_format) {
11722 printf(" No Depth + Stencil format found. Skipped.\n");
11723 return;
11724 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011725 // Create src & dst images to use for copy operations
11726 VkImage src_image;
11727 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011728 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011729
11730 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11731 const int32_t tex_width = 32;
11732 const int32_t tex_height = 32;
11733
11734 VkImageCreateInfo image_create_info = {};
11735 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11736 image_create_info.pNext = NULL;
11737 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11738 image_create_info.format = tex_format;
11739 image_create_info.extent.width = tex_width;
11740 image_create_info.extent.height = tex_height;
11741 image_create_info.extent.depth = 1;
11742 image_create_info.mipLevels = 1;
11743 image_create_info.arrayLayers = 4;
11744 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11745 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11746 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011747 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011748 image_create_info.flags = 0;
11749
11750 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11751 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011752 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011753 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11754 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011755 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11756 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11757 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11758 ASSERT_VK_SUCCESS(err);
11759
11760 // Allocate memory
11761 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011762 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011763 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011764 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11765 mem_alloc.pNext = NULL;
11766 mem_alloc.allocationSize = 0;
11767 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011768
11769 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011770 mem_alloc.allocationSize = img_mem_reqs.size;
11771 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011772 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011773 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011774 ASSERT_VK_SUCCESS(err);
11775
11776 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011777 mem_alloc.allocationSize = img_mem_reqs.size;
11778 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011779 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011780 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011781 ASSERT_VK_SUCCESS(err);
11782
11783 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011784 mem_alloc.allocationSize = img_mem_reqs.size;
11785 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011786 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011787 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011788 ASSERT_VK_SUCCESS(err);
11789
11790 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11791 ASSERT_VK_SUCCESS(err);
11792 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11793 ASSERT_VK_SUCCESS(err);
11794 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11795 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011796
Tony Barbour552f6c02016-12-21 14:34:07 -070011797 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011798 VkImageCopy copy_region;
11799 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11800 copy_region.srcSubresource.mipLevel = 0;
11801 copy_region.srcSubresource.baseArrayLayer = 0;
11802 copy_region.srcSubresource.layerCount = 1;
11803 copy_region.srcOffset.x = 0;
11804 copy_region.srcOffset.y = 0;
11805 copy_region.srcOffset.z = 0;
11806 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11807 copy_region.dstSubresource.mipLevel = 0;
11808 copy_region.dstSubresource.baseArrayLayer = 0;
11809 copy_region.dstSubresource.layerCount = 1;
11810 copy_region.dstOffset.x = 0;
11811 copy_region.dstOffset.y = 0;
11812 copy_region.dstOffset.z = 0;
11813 copy_region.extent.width = 1;
11814 copy_region.extent.height = 1;
11815 copy_region.extent.depth = 1;
11816
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11818 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11819 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011820
Cort530cf382016-12-08 09:59:47 -080011821 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 -060011822 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011823 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11824 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011825 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11826 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011827 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 -060011828 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011830 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11831 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011832 m_errorMonitor->SetUnexpectedError(
11833 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011834 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 -060011835 m_errorMonitor->VerifyFound();
11836 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011838 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011839 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011840 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011841 "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 -080011842 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 -060011843 m_errorMonitor->VerifyFound();
11844 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11846 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11847 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011848 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 -060011849 m_errorMonitor->VerifyFound();
11850 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011852 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011853 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011854 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011855 "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 -080011856 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 -060011857 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011859 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11860 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011861 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011862 "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 -080011863 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 -060011864 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011865
Cort3b021012016-12-07 12:00:57 -080011866 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11867 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11868 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11869 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11870 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11871 transfer_dst_image_barrier[0].srcAccessMask = 0;
11872 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11873 transfer_dst_image_barrier[0].image = dst_image;
11874 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11875 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11876 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11877 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11878 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11879 transfer_dst_image_barrier[0].image = depth_image;
11880 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11881 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11882 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11883
11884 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011885 VkClearColorValue color_clear_value = {};
11886 VkImageSubresourceRange clear_range;
11887 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11888 clear_range.baseMipLevel = 0;
11889 clear_range.baseArrayLayer = 0;
11890 clear_range.layerCount = 1;
11891 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011892
Cort3b021012016-12-07 12:00:57 -080011893 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11894 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011897 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011898 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011899 // Fail due to provided layout not matching actual current layout for color clear.
11900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011901 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011902 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011903
Cort530cf382016-12-08 09:59:47 -080011904 VkClearDepthStencilValue depth_clear_value = {};
11905 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011906
11907 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11908 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011911 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011912 m_errorMonitor->VerifyFound();
11913 // Fail due to provided layout not matching actual current layout for depth clear.
11914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011915 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011916 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011917
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011918 // Now cause error due to bad image layout transition in PipelineBarrier
11919 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011920 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011921 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011922 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011923 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011924 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11925 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011926 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011928 "you cannot transition the layout of aspect 1 from "
11929 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11930 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011932 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11933 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011934 m_errorMonitor->VerifyFound();
11935
11936 // Finally some layout errors at RenderPass create time
11937 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11938 VkAttachmentReference attach = {};
11939 // perf warning for GENERAL layout w/ non-DS input attachment
11940 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11941 VkSubpassDescription subpass = {};
11942 subpass.inputAttachmentCount = 1;
11943 subpass.pInputAttachments = &attach;
11944 VkRenderPassCreateInfo rpci = {};
11945 rpci.subpassCount = 1;
11946 rpci.pSubpasses = &subpass;
11947 rpci.attachmentCount = 1;
11948 VkAttachmentDescription attach_desc = {};
11949 attach_desc.format = VK_FORMAT_UNDEFINED;
11950 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011951 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011952 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11954 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011955 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11956 m_errorMonitor->VerifyFound();
11957 // error w/ non-general layout
11958 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11959
11960 m_errorMonitor->SetDesiredFailureMsg(
11961 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11962 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11963 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11964 m_errorMonitor->VerifyFound();
11965 subpass.inputAttachmentCount = 0;
11966 subpass.colorAttachmentCount = 1;
11967 subpass.pColorAttachments = &attach;
11968 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11969 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11971 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011972 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11973 m_errorMonitor->VerifyFound();
11974 // error w/ non-color opt or GENERAL layout for color attachment
11975 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11976 m_errorMonitor->SetDesiredFailureMsg(
11977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11978 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11979 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11980 m_errorMonitor->VerifyFound();
11981 subpass.colorAttachmentCount = 0;
11982 subpass.pDepthStencilAttachment = &attach;
11983 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11984 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11986 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011987 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11988 m_errorMonitor->VerifyFound();
11989 // error w/ non-ds opt or GENERAL layout for color attachment
11990 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11992 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11993 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011994 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11995 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011996 // For this error we need a valid renderpass so create default one
11997 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11998 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070011999 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012000 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12001 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12002 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12003 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12004 // Can't do a CLEAR load on READ_ONLY initialLayout
12005 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12006 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12007 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012009 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012010 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12011 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012012
Cort3b021012016-12-07 12:00:57 -080012013 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12014 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12015 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012016 vkDestroyImage(m_device->device(), src_image, NULL);
12017 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012018 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012019}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012020
Tobin Ehlise0936662016-10-11 08:10:51 -060012021TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12022 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12023 VkResult err;
12024
Tony Barbour1fa09702017-03-16 12:09:08 -060012025 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012026
12027 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12028 VkImageTiling tiling;
12029 VkFormatProperties format_properties;
12030 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12031 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12032 tiling = VK_IMAGE_TILING_LINEAR;
12033 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12034 tiling = VK_IMAGE_TILING_OPTIMAL;
12035 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012036 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012037 return;
12038 }
12039
12040 VkDescriptorPoolSize ds_type = {};
12041 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12042 ds_type.descriptorCount = 1;
12043
12044 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12045 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12046 ds_pool_ci.maxSets = 1;
12047 ds_pool_ci.poolSizeCount = 1;
12048 ds_pool_ci.pPoolSizes = &ds_type;
12049 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12050
12051 VkDescriptorPool ds_pool;
12052 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12053 ASSERT_VK_SUCCESS(err);
12054
12055 VkDescriptorSetLayoutBinding dsl_binding = {};
12056 dsl_binding.binding = 0;
12057 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12058 dsl_binding.descriptorCount = 1;
12059 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12060 dsl_binding.pImmutableSamplers = NULL;
12061
12062 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12063 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12064 ds_layout_ci.pNext = NULL;
12065 ds_layout_ci.bindingCount = 1;
12066 ds_layout_ci.pBindings = &dsl_binding;
12067
12068 VkDescriptorSetLayout ds_layout;
12069 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12070 ASSERT_VK_SUCCESS(err);
12071
12072 VkDescriptorSetAllocateInfo alloc_info = {};
12073 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12074 alloc_info.descriptorSetCount = 1;
12075 alloc_info.descriptorPool = ds_pool;
12076 alloc_info.pSetLayouts = &ds_layout;
12077 VkDescriptorSet descriptor_set;
12078 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12079 ASSERT_VK_SUCCESS(err);
12080
12081 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12082 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12083 pipeline_layout_ci.pNext = NULL;
12084 pipeline_layout_ci.setLayoutCount = 1;
12085 pipeline_layout_ci.pSetLayouts = &ds_layout;
12086 VkPipelineLayout pipeline_layout;
12087 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12088 ASSERT_VK_SUCCESS(err);
12089
12090 VkImageObj image(m_device);
12091 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12092 ASSERT_TRUE(image.initialized());
12093 VkImageView view = image.targetView(tex_format);
12094
12095 VkDescriptorImageInfo image_info = {};
12096 image_info.imageView = view;
12097 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12098
12099 VkWriteDescriptorSet descriptor_write = {};
12100 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12101 descriptor_write.dstSet = descriptor_set;
12102 descriptor_write.dstBinding = 0;
12103 descriptor_write.descriptorCount = 1;
12104 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12105 descriptor_write.pImageInfo = &image_info;
12106
12107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12108 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12109 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12110 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12111 m_errorMonitor->VerifyFound();
12112
12113 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12115 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12116 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12117}
12118
Mark Mueller93b938f2016-08-18 10:27:40 -060012119TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012120 TEST_DESCRIPTION(
12121 "Use vkCmdExecuteCommands with invalid state "
12122 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012123
Tony Barbour1fa09702017-03-16 12:09:08 -060012124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12126
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012127 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012128 const char *simultaneous_use_message2 =
12129 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12130 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012131
12132 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012133 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012134 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012135 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12136 command_buffer_allocate_info.commandBufferCount = 1;
12137
12138 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012139 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012140 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12141 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012142 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012143 command_buffer_inheritance_info.renderPass = m_renderPass;
12144 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012145
Mark Mueller93b938f2016-08-18 10:27:40 -060012146 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012147 command_buffer_begin_info.flags =
12148 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012149 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12150
12151 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12152 vkEndCommandBuffer(secondary_command_buffer);
12153
Mark Mueller93b938f2016-08-18 10:27:40 -060012154 VkSubmitInfo submit_info = {};
12155 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12156 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012157 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012158
Mark Mueller4042b652016-09-05 22:52:21 -060012159 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012160 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12162 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012163 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012164 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012165 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12166 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012167
Dave Houltonfbf52152017-01-06 12:55:29 -070012168 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012170 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012171
Mark Mueller4042b652016-09-05 22:52:21 -060012172 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012173 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12174 m_errorMonitor->SetUnexpectedError(
12175 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12176 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012177 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012178 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12181 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012182 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012183 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12184 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012185
12186 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012187
12188 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012189}
12190
Tony Barbour626994c2017-02-08 15:29:37 -070012191TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12192 TEST_DESCRIPTION(
12193 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12194 "errors");
12195 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12196 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 -060012197 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012198
12199 VkCommandBuffer cmd_bufs[2];
12200 VkCommandBufferAllocateInfo alloc_info;
12201 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12202 alloc_info.pNext = NULL;
12203 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012204 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012205 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12206 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12207
12208 VkCommandBufferBeginInfo cb_binfo;
12209 cb_binfo.pNext = NULL;
12210 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12211 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12212 cb_binfo.flags = 0;
12213 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12214 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12215 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12216 vkEndCommandBuffer(cmd_bufs[0]);
12217 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12218
12219 VkSubmitInfo submit_info = {};
12220 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12221 submit_info.commandBufferCount = 2;
12222 submit_info.pCommandBuffers = duplicates;
12223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12224 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12225 m_errorMonitor->VerifyFound();
12226 vkQueueWaitIdle(m_device->m_queue);
12227
12228 // Set one time use and now look for one time submit
12229 duplicates[0] = duplicates[1] = cmd_bufs[1];
12230 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12231 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12232 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12233 vkEndCommandBuffer(cmd_bufs[1]);
12234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12235 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12236 m_errorMonitor->VerifyFound();
12237 vkQueueWaitIdle(m_device->m_queue);
12238}
12239
Tobin Ehlisb093da82017-01-19 12:05:27 -070012240TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012241 TEST_DESCRIPTION(
12242 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12243 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012244
Tony Barbour1fa09702017-03-16 12:09:08 -060012245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12247
12248 std::vector<const char *> device_extension_names;
12249 auto features = m_device->phy().features();
12250 // Make sure gs & ts are disabled
12251 features.geometryShader = false;
12252 features.tessellationShader = false;
12253 // The sacrificial device object
12254 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12255
12256 VkCommandPoolCreateInfo pool_create_info{};
12257 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12258 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12259
12260 VkCommandPool command_pool;
12261 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12262
12263 VkCommandBufferAllocateInfo cmd = {};
12264 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12265 cmd.pNext = NULL;
12266 cmd.commandPool = command_pool;
12267 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12268 cmd.commandBufferCount = 1;
12269
12270 VkCommandBuffer cmd_buffer;
12271 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12272 ASSERT_VK_SUCCESS(err);
12273
12274 VkEvent event;
12275 VkEventCreateInfo evci = {};
12276 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12277 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12278 ASSERT_VK_SUCCESS(result);
12279
12280 VkCommandBufferBeginInfo cbbi = {};
12281 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12282 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12284 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12285 m_errorMonitor->VerifyFound();
12286
12287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12288 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12289 m_errorMonitor->VerifyFound();
12290
12291 vkDestroyEvent(test_device.handle(), event, NULL);
12292 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12293}
12294
Mark Mueller917f6bc2016-08-30 10:57:19 -060012295TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012296 TEST_DESCRIPTION(
12297 "Use vkCmdExecuteCommands with invalid state "
12298 "in primary and secondary command buffers. "
12299 "Delete objects that are inuse. Call VkQueueSubmit "
12300 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012301
Tony Barbour1fa09702017-03-16 12:09:08 -060012302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12304
Tony Barbour552f6c02016-12-21 14:34:07 -070012305 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012306
12307 VkEvent event;
12308 VkEventCreateInfo event_create_info = {};
12309 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12310 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012311 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012312
Tony Barbour552f6c02016-12-21 14:34:07 -070012313 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012314 vkDestroyEvent(m_device->device(), event, nullptr);
12315
12316 VkSubmitInfo submit_info = {};
12317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12318 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012319 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012321 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12322 m_errorMonitor->VerifyFound();
12323
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012324 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012325 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12326
12327 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12328
Mark Mueller917f6bc2016-08-30 10:57:19 -060012329 VkSemaphoreCreateInfo semaphore_create_info = {};
12330 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12331 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012332 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012333 VkFenceCreateInfo fence_create_info = {};
12334 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12335 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012336 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012337
12338 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012339 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012340 descriptor_pool_type_count.descriptorCount = 1;
12341
12342 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12343 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12344 descriptor_pool_create_info.maxSets = 1;
12345 descriptor_pool_create_info.poolSizeCount = 1;
12346 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012347 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012348
12349 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012350 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012351
12352 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012353 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012354 descriptorset_layout_binding.descriptorCount = 1;
12355 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12356
12357 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012358 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012359 descriptorset_layout_create_info.bindingCount = 1;
12360 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12361
12362 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012363 ASSERT_VK_SUCCESS(
12364 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012365
12366 VkDescriptorSet descriptorset;
12367 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012368 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012369 descriptorset_allocate_info.descriptorSetCount = 1;
12370 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12371 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012372 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012373
Mark Mueller4042b652016-09-05 22:52:21 -060012374 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12375
12376 VkDescriptorBufferInfo buffer_info = {};
12377 buffer_info.buffer = buffer_test.GetBuffer();
12378 buffer_info.offset = 0;
12379 buffer_info.range = 1024;
12380
12381 VkWriteDescriptorSet write_descriptor_set = {};
12382 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12383 write_descriptor_set.dstSet = descriptorset;
12384 write_descriptor_set.descriptorCount = 1;
12385 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12386 write_descriptor_set.pBufferInfo = &buffer_info;
12387
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012388 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012389
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012390 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12391 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012392
12393 VkPipelineObj pipe(m_device);
12394 pipe.AddColorAttachment();
12395 pipe.AddShader(&vs);
12396 pipe.AddShader(&fs);
12397
12398 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012399 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012400 pipeline_layout_create_info.setLayoutCount = 1;
12401 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12402
12403 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012404 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012405
12406 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12407
Tony Barbour552f6c02016-12-21 14:34:07 -070012408 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012409 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012411 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12412 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12413 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012414
Tony Barbour552f6c02016-12-21 14:34:07 -070012415 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012416
Mark Mueller917f6bc2016-08-30 10:57:19 -060012417 submit_info.signalSemaphoreCount = 1;
12418 submit_info.pSignalSemaphores = &semaphore;
12419 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012420 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012421
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012423 vkDestroyEvent(m_device->device(), event, nullptr);
12424 m_errorMonitor->VerifyFound();
12425
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012427 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12428 m_errorMonitor->VerifyFound();
12429
Jeremy Hayes08369882017-02-02 10:31:06 -070012430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012431 vkDestroyFence(m_device->device(), fence, nullptr);
12432 m_errorMonitor->VerifyFound();
12433
Tobin Ehlis122207b2016-09-01 08:50:06 -070012434 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012435 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12436 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012437 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012438 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12439 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012440 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012441 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12442 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012443 vkDestroyEvent(m_device->device(), event, nullptr);
12444 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012445 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012446 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12447}
12448
Tobin Ehlis2adda372016-09-01 08:51:06 -070012449TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12450 TEST_DESCRIPTION("Delete in-use query pool.");
12451
Tony Barbour1fa09702017-03-16 12:09:08 -060012452 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12454
12455 VkQueryPool query_pool;
12456 VkQueryPoolCreateInfo query_pool_ci{};
12457 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12458 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12459 query_pool_ci.queryCount = 1;
12460 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012461 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012462 // Reset query pool to create binding with cmd buffer
12463 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12464
Tony Barbour552f6c02016-12-21 14:34:07 -070012465 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012466
12467 VkSubmitInfo submit_info = {};
12468 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12469 submit_info.commandBufferCount = 1;
12470 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12471 // Submit cmd buffer and then destroy query pool while in-flight
12472 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12473
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012475 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12476 m_errorMonitor->VerifyFound();
12477
12478 vkQueueWaitIdle(m_device->m_queue);
12479 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012480 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12481 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012482 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12483}
12484
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012485TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12486 TEST_DESCRIPTION("Delete in-use pipeline.");
12487
Tony Barbour1fa09702017-03-16 12:09:08 -060012488 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12490
12491 // Empty pipeline layout used for binding PSO
12492 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12493 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12494 pipeline_layout_ci.setLayoutCount = 0;
12495 pipeline_layout_ci.pSetLayouts = NULL;
12496
12497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012498 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012499 ASSERT_VK_SUCCESS(err);
12500
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012502 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012503 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12504 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012505 // Store pipeline handle so we can actually delete it before test finishes
12506 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012507 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012508 VkPipelineObj pipe(m_device);
12509 pipe.AddShader(&vs);
12510 pipe.AddShader(&fs);
12511 pipe.AddColorAttachment();
12512 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12513 delete_this_pipeline = pipe.handle();
12514
Tony Barbour552f6c02016-12-21 14:34:07 -070012515 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012516 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012517 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012518
Tony Barbour552f6c02016-12-21 14:34:07 -070012519 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012520
12521 VkSubmitInfo submit_info = {};
12522 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12523 submit_info.commandBufferCount = 1;
12524 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12525 // Submit cmd buffer and then pipeline destroyed while in-flight
12526 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012527 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012528 m_errorMonitor->VerifyFound();
12529 // Make sure queue finished and then actually delete pipeline
12530 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012531 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12532 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012533 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12534 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12535}
12536
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012537TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12538 TEST_DESCRIPTION("Delete in-use imageView.");
12539
Tony Barbour1fa09702017-03-16 12:09:08 -060012540 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12542
12543 VkDescriptorPoolSize ds_type_count;
12544 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12545 ds_type_count.descriptorCount = 1;
12546
12547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12549 ds_pool_ci.maxSets = 1;
12550 ds_pool_ci.poolSizeCount = 1;
12551 ds_pool_ci.pPoolSizes = &ds_type_count;
12552
12553 VkDescriptorPool ds_pool;
12554 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12555 ASSERT_VK_SUCCESS(err);
12556
12557 VkSamplerCreateInfo sampler_ci = {};
12558 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12559 sampler_ci.pNext = NULL;
12560 sampler_ci.magFilter = VK_FILTER_NEAREST;
12561 sampler_ci.minFilter = VK_FILTER_NEAREST;
12562 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12563 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12564 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12565 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12566 sampler_ci.mipLodBias = 1.0;
12567 sampler_ci.anisotropyEnable = VK_FALSE;
12568 sampler_ci.maxAnisotropy = 1;
12569 sampler_ci.compareEnable = VK_FALSE;
12570 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12571 sampler_ci.minLod = 1.0;
12572 sampler_ci.maxLod = 1.0;
12573 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12574 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12575 VkSampler sampler;
12576
12577 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12578 ASSERT_VK_SUCCESS(err);
12579
12580 VkDescriptorSetLayoutBinding layout_binding;
12581 layout_binding.binding = 0;
12582 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12583 layout_binding.descriptorCount = 1;
12584 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12585 layout_binding.pImmutableSamplers = NULL;
12586
12587 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12588 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12589 ds_layout_ci.bindingCount = 1;
12590 ds_layout_ci.pBindings = &layout_binding;
12591 VkDescriptorSetLayout ds_layout;
12592 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12593 ASSERT_VK_SUCCESS(err);
12594
12595 VkDescriptorSetAllocateInfo alloc_info = {};
12596 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12597 alloc_info.descriptorSetCount = 1;
12598 alloc_info.descriptorPool = ds_pool;
12599 alloc_info.pSetLayouts = &ds_layout;
12600 VkDescriptorSet descriptor_set;
12601 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12602 ASSERT_VK_SUCCESS(err);
12603
12604 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12605 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12606 pipeline_layout_ci.pNext = NULL;
12607 pipeline_layout_ci.setLayoutCount = 1;
12608 pipeline_layout_ci.pSetLayouts = &ds_layout;
12609
12610 VkPipelineLayout pipeline_layout;
12611 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12612 ASSERT_VK_SUCCESS(err);
12613
12614 VkImageObj image(m_device);
12615 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12616 ASSERT_TRUE(image.initialized());
12617
12618 VkImageView view;
12619 VkImageViewCreateInfo ivci = {};
12620 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12621 ivci.image = image.handle();
12622 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12623 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12624 ivci.subresourceRange.layerCount = 1;
12625 ivci.subresourceRange.baseMipLevel = 0;
12626 ivci.subresourceRange.levelCount = 1;
12627 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12628
12629 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12630 ASSERT_VK_SUCCESS(err);
12631
12632 VkDescriptorImageInfo image_info{};
12633 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12634 image_info.imageView = view;
12635 image_info.sampler = sampler;
12636
12637 VkWriteDescriptorSet descriptor_write = {};
12638 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12639 descriptor_write.dstSet = descriptor_set;
12640 descriptor_write.dstBinding = 0;
12641 descriptor_write.descriptorCount = 1;
12642 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12643 descriptor_write.pImageInfo = &image_info;
12644
12645 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12646
12647 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012648 char const *vsSource =
12649 "#version 450\n"
12650 "\n"
12651 "out gl_PerVertex { \n"
12652 " vec4 gl_Position;\n"
12653 "};\n"
12654 "void main(){\n"
12655 " gl_Position = vec4(1);\n"
12656 "}\n";
12657 char const *fsSource =
12658 "#version 450\n"
12659 "\n"
12660 "layout(set=0, binding=0) uniform sampler2D s;\n"
12661 "layout(location=0) out vec4 x;\n"
12662 "void main(){\n"
12663 " x = texture(s, vec2(1));\n"
12664 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012665 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12666 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12667 VkPipelineObj pipe(m_device);
12668 pipe.AddShader(&vs);
12669 pipe.AddShader(&fs);
12670 pipe.AddColorAttachment();
12671 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12672
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012674
Tony Barbour552f6c02016-12-21 14:34:07 -070012675 m_commandBuffer->BeginCommandBuffer();
12676 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012677 // Bind pipeline to cmd buffer
12678 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12679 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12680 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012681
12682 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12683 VkRect2D scissor = {{0, 0}, {16, 16}};
12684 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12685 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12686
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012687 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012688 m_commandBuffer->EndRenderPass();
12689 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012690 // Submit cmd buffer then destroy sampler
12691 VkSubmitInfo submit_info = {};
12692 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12693 submit_info.commandBufferCount = 1;
12694 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12695 // Submit cmd buffer and then destroy imageView while in-flight
12696 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12697
12698 vkDestroyImageView(m_device->device(), view, nullptr);
12699 m_errorMonitor->VerifyFound();
12700 vkQueueWaitIdle(m_device->m_queue);
12701 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012702 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12703 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012704 vkDestroyImageView(m_device->device(), view, NULL);
12705 vkDestroySampler(m_device->device(), sampler, nullptr);
12706 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12707 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12708 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12709}
12710
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012711TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12712 TEST_DESCRIPTION("Delete in-use bufferView.");
12713
Tony Barbour1fa09702017-03-16 12:09:08 -060012714 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012715 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12716
12717 VkDescriptorPoolSize ds_type_count;
12718 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12719 ds_type_count.descriptorCount = 1;
12720
12721 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12722 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12723 ds_pool_ci.maxSets = 1;
12724 ds_pool_ci.poolSizeCount = 1;
12725 ds_pool_ci.pPoolSizes = &ds_type_count;
12726
12727 VkDescriptorPool ds_pool;
12728 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12729 ASSERT_VK_SUCCESS(err);
12730
12731 VkDescriptorSetLayoutBinding layout_binding;
12732 layout_binding.binding = 0;
12733 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12734 layout_binding.descriptorCount = 1;
12735 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12736 layout_binding.pImmutableSamplers = NULL;
12737
12738 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12739 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12740 ds_layout_ci.bindingCount = 1;
12741 ds_layout_ci.pBindings = &layout_binding;
12742 VkDescriptorSetLayout ds_layout;
12743 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12744 ASSERT_VK_SUCCESS(err);
12745
12746 VkDescriptorSetAllocateInfo alloc_info = {};
12747 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12748 alloc_info.descriptorSetCount = 1;
12749 alloc_info.descriptorPool = ds_pool;
12750 alloc_info.pSetLayouts = &ds_layout;
12751 VkDescriptorSet descriptor_set;
12752 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12753 ASSERT_VK_SUCCESS(err);
12754
12755 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12756 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12757 pipeline_layout_ci.pNext = NULL;
12758 pipeline_layout_ci.setLayoutCount = 1;
12759 pipeline_layout_ci.pSetLayouts = &ds_layout;
12760
12761 VkPipelineLayout pipeline_layout;
12762 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12763 ASSERT_VK_SUCCESS(err);
12764
12765 VkBuffer buffer;
12766 uint32_t queue_family_index = 0;
12767 VkBufferCreateInfo buffer_create_info = {};
12768 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12769 buffer_create_info.size = 1024;
12770 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12771 buffer_create_info.queueFamilyIndexCount = 1;
12772 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12773
12774 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12775 ASSERT_VK_SUCCESS(err);
12776
12777 VkMemoryRequirements memory_reqs;
12778 VkDeviceMemory buffer_memory;
12779
12780 VkMemoryAllocateInfo memory_info = {};
12781 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12782 memory_info.allocationSize = 0;
12783 memory_info.memoryTypeIndex = 0;
12784
12785 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12786 memory_info.allocationSize = memory_reqs.size;
12787 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12788 ASSERT_TRUE(pass);
12789
12790 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12791 ASSERT_VK_SUCCESS(err);
12792 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12793 ASSERT_VK_SUCCESS(err);
12794
12795 VkBufferView view;
12796 VkBufferViewCreateInfo bvci = {};
12797 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12798 bvci.buffer = buffer;
12799 bvci.format = VK_FORMAT_R8_UNORM;
12800 bvci.range = VK_WHOLE_SIZE;
12801
12802 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12803 ASSERT_VK_SUCCESS(err);
12804
12805 VkWriteDescriptorSet descriptor_write = {};
12806 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12807 descriptor_write.dstSet = descriptor_set;
12808 descriptor_write.dstBinding = 0;
12809 descriptor_write.descriptorCount = 1;
12810 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12811 descriptor_write.pTexelBufferView = &view;
12812
12813 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12814
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012815 char const *vsSource =
12816 "#version 450\n"
12817 "\n"
12818 "out gl_PerVertex { \n"
12819 " vec4 gl_Position;\n"
12820 "};\n"
12821 "void main(){\n"
12822 " gl_Position = vec4(1);\n"
12823 "}\n";
12824 char const *fsSource =
12825 "#version 450\n"
12826 "\n"
12827 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12828 "layout(location=0) out vec4 x;\n"
12829 "void main(){\n"
12830 " x = imageLoad(s, 0);\n"
12831 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12834 VkPipelineObj pipe(m_device);
12835 pipe.AddShader(&vs);
12836 pipe.AddShader(&fs);
12837 pipe.AddColorAttachment();
12838 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12839
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012841
Tony Barbour552f6c02016-12-21 14:34:07 -070012842 m_commandBuffer->BeginCommandBuffer();
12843 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012844 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12845 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12846 VkRect2D scissor = {{0, 0}, {16, 16}};
12847 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12848 // Bind pipeline to cmd buffer
12849 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12850 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12851 &descriptor_set, 0, nullptr);
12852 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012853 m_commandBuffer->EndRenderPass();
12854 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012855
12856 VkSubmitInfo submit_info = {};
12857 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12858 submit_info.commandBufferCount = 1;
12859 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12860 // Submit cmd buffer and then destroy bufferView while in-flight
12861 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12862
12863 vkDestroyBufferView(m_device->device(), view, nullptr);
12864 m_errorMonitor->VerifyFound();
12865 vkQueueWaitIdle(m_device->m_queue);
12866 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012867 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12868 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012869 vkDestroyBufferView(m_device->device(), view, NULL);
12870 vkDestroyBuffer(m_device->device(), buffer, NULL);
12871 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12872 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12873 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12874 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12875}
12876
Tobin Ehlis209532e2016-09-07 13:52:18 -060012877TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12878 TEST_DESCRIPTION("Delete in-use sampler.");
12879
Tony Barbour1fa09702017-03-16 12:09:08 -060012880 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12882
12883 VkDescriptorPoolSize ds_type_count;
12884 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12885 ds_type_count.descriptorCount = 1;
12886
12887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12889 ds_pool_ci.maxSets = 1;
12890 ds_pool_ci.poolSizeCount = 1;
12891 ds_pool_ci.pPoolSizes = &ds_type_count;
12892
12893 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012894 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012895 ASSERT_VK_SUCCESS(err);
12896
12897 VkSamplerCreateInfo sampler_ci = {};
12898 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12899 sampler_ci.pNext = NULL;
12900 sampler_ci.magFilter = VK_FILTER_NEAREST;
12901 sampler_ci.minFilter = VK_FILTER_NEAREST;
12902 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12903 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12904 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12905 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12906 sampler_ci.mipLodBias = 1.0;
12907 sampler_ci.anisotropyEnable = VK_FALSE;
12908 sampler_ci.maxAnisotropy = 1;
12909 sampler_ci.compareEnable = VK_FALSE;
12910 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12911 sampler_ci.minLod = 1.0;
12912 sampler_ci.maxLod = 1.0;
12913 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12914 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12915 VkSampler sampler;
12916
12917 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12918 ASSERT_VK_SUCCESS(err);
12919
12920 VkDescriptorSetLayoutBinding layout_binding;
12921 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012922 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012923 layout_binding.descriptorCount = 1;
12924 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12925 layout_binding.pImmutableSamplers = NULL;
12926
12927 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12928 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12929 ds_layout_ci.bindingCount = 1;
12930 ds_layout_ci.pBindings = &layout_binding;
12931 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012932 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012933 ASSERT_VK_SUCCESS(err);
12934
12935 VkDescriptorSetAllocateInfo alloc_info = {};
12936 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12937 alloc_info.descriptorSetCount = 1;
12938 alloc_info.descriptorPool = ds_pool;
12939 alloc_info.pSetLayouts = &ds_layout;
12940 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012941 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012942 ASSERT_VK_SUCCESS(err);
12943
12944 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12945 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12946 pipeline_layout_ci.pNext = NULL;
12947 pipeline_layout_ci.setLayoutCount = 1;
12948 pipeline_layout_ci.pSetLayouts = &ds_layout;
12949
12950 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012951 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012952 ASSERT_VK_SUCCESS(err);
12953
12954 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012955 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 -060012956 ASSERT_TRUE(image.initialized());
12957
12958 VkImageView view;
12959 VkImageViewCreateInfo ivci = {};
12960 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12961 ivci.image = image.handle();
12962 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12963 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12964 ivci.subresourceRange.layerCount = 1;
12965 ivci.subresourceRange.baseMipLevel = 0;
12966 ivci.subresourceRange.levelCount = 1;
12967 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12968
12969 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12970 ASSERT_VK_SUCCESS(err);
12971
12972 VkDescriptorImageInfo image_info{};
12973 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12974 image_info.imageView = view;
12975 image_info.sampler = sampler;
12976
12977 VkWriteDescriptorSet descriptor_write = {};
12978 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12979 descriptor_write.dstSet = descriptor_set;
12980 descriptor_write.dstBinding = 0;
12981 descriptor_write.descriptorCount = 1;
12982 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12983 descriptor_write.pImageInfo = &image_info;
12984
12985 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12986
12987 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012988 char const *vsSource =
12989 "#version 450\n"
12990 "\n"
12991 "out gl_PerVertex { \n"
12992 " vec4 gl_Position;\n"
12993 "};\n"
12994 "void main(){\n"
12995 " gl_Position = vec4(1);\n"
12996 "}\n";
12997 char const *fsSource =
12998 "#version 450\n"
12999 "\n"
13000 "layout(set=0, binding=0) uniform sampler2D s;\n"
13001 "layout(location=0) out vec4 x;\n"
13002 "void main(){\n"
13003 " x = texture(s, vec2(1));\n"
13004 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013005 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13006 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13007 VkPipelineObj pipe(m_device);
13008 pipe.AddShader(&vs);
13009 pipe.AddShader(&fs);
13010 pipe.AddColorAttachment();
13011 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13012
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013014
Tony Barbour552f6c02016-12-21 14:34:07 -070013015 m_commandBuffer->BeginCommandBuffer();
13016 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013017 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013018 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13019 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13020 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013021
13022 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13023 VkRect2D scissor = {{0, 0}, {16, 16}};
13024 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13025 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13026
Tobin Ehlis209532e2016-09-07 13:52:18 -060013027 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013028 m_commandBuffer->EndRenderPass();
13029 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013030 // Submit cmd buffer then destroy sampler
13031 VkSubmitInfo submit_info = {};
13032 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13033 submit_info.commandBufferCount = 1;
13034 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13035 // Submit cmd buffer and then destroy sampler while in-flight
13036 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13037
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013038 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013039 m_errorMonitor->VerifyFound();
13040 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013041
Tobin Ehlis209532e2016-09-07 13:52:18 -060013042 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013043 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13044 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013045 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013046 vkDestroyImageView(m_device->device(), view, NULL);
13047 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13048 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13049 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13050}
13051
Mark Mueller1cd9f412016-08-25 13:23:52 -060013052TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013053 TEST_DESCRIPTION(
13054 "Call VkQueueSubmit with a semaphore that is already "
13055 "signaled but not waited on by the queue. Wait on a "
13056 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013057
Tony Barbour1fa09702017-03-16 12:09:08 -060013058 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13060
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013061 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 -070013062 const char *invalid_fence_wait_message =
13063 " which has not been submitted on a Queue or during "
13064 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013065
Tony Barbour552f6c02016-12-21 14:34:07 -070013066 m_commandBuffer->BeginCommandBuffer();
13067 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013068
13069 VkSemaphoreCreateInfo semaphore_create_info = {};
13070 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13071 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013072 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013073 VkSubmitInfo submit_info = {};
13074 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13075 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013076 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013077 submit_info.signalSemaphoreCount = 1;
13078 submit_info.pSignalSemaphores = &semaphore;
13079 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013080 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013081 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013082 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013083 m_commandBuffer->BeginCommandBuffer();
13084 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013086 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13087 m_errorMonitor->VerifyFound();
13088
Mark Mueller1cd9f412016-08-25 13:23:52 -060013089 VkFenceCreateInfo fence_create_info = {};
13090 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13091 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013092 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013095 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13096 m_errorMonitor->VerifyFound();
13097
Mark Mueller4042b652016-09-05 22:52:21 -060013098 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013099 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013100 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13101}
13102
Tobin Ehlis4af23302016-07-19 10:50:30 -060013103TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013104 TEST_DESCRIPTION(
13105 "Bind a secondary command buffer with with a framebuffer "
13106 "that does not match the framebuffer for the active "
13107 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013108 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013109 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13110
13111 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013112 VkAttachmentDescription attachment = {0,
13113 VK_FORMAT_B8G8R8A8_UNORM,
13114 VK_SAMPLE_COUNT_1_BIT,
13115 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13116 VK_ATTACHMENT_STORE_OP_STORE,
13117 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13118 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13119 VK_IMAGE_LAYOUT_UNDEFINED,
13120 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013121
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013122 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013123
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013124 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013126 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013127
13128 VkRenderPass rp;
13129 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13130 ASSERT_VK_SUCCESS(err);
13131
13132 // A compatible framebuffer.
13133 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013134 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 -060013135 ASSERT_TRUE(image.initialized());
13136
13137 VkImageViewCreateInfo ivci = {
13138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13139 nullptr,
13140 0,
13141 image.handle(),
13142 VK_IMAGE_VIEW_TYPE_2D,
13143 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013144 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13145 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013146 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13147 };
13148 VkImageView view;
13149 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13150 ASSERT_VK_SUCCESS(err);
13151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013152 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013153 VkFramebuffer fb;
13154 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13155 ASSERT_VK_SUCCESS(err);
13156
13157 VkCommandBufferAllocateInfo cbai = {};
13158 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013159 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013160 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13161 cbai.commandBufferCount = 1;
13162
13163 VkCommandBuffer sec_cb;
13164 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13165 ASSERT_VK_SUCCESS(err);
13166 VkCommandBufferBeginInfo cbbi = {};
13167 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013168 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013169 cbii.renderPass = renderPass();
13170 cbii.framebuffer = fb;
13171 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13172 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013173 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 -060013174 cbbi.pInheritanceInfo = &cbii;
13175 vkBeginCommandBuffer(sec_cb, &cbbi);
13176 vkEndCommandBuffer(sec_cb);
13177
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013178 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013179 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13180 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013181
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013183 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013184 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13185 m_errorMonitor->VerifyFound();
13186 // Cleanup
13187 vkDestroyImageView(m_device->device(), view, NULL);
13188 vkDestroyRenderPass(m_device->device(), rp, NULL);
13189 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13190}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013191
13192TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013193 TEST_DESCRIPTION(
13194 "If logicOp is available on the device, set it to an "
13195 "invalid value. If logicOp is not available, attempt to "
13196 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013197 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013198 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13199
13200 auto features = m_device->phy().features();
13201 // Set the expected error depending on whether or not logicOp available
13202 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13204 "If logic operations feature not "
13205 "enabled, logicOpEnable must be "
13206 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013207 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013209 }
13210 // Create a pipeline using logicOp
13211 VkResult err;
13212
13213 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13214 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13215
13216 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013217 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013218 ASSERT_VK_SUCCESS(err);
13219
13220 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13221 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13222 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013223 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013224 vp_state_ci.pViewports = &vp;
13225 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013226 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013227 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013228
13229 VkPipelineShaderStageCreateInfo shaderStages[2];
13230 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13231
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013232 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13233 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013234 shaderStages[0] = vs.GetStageCreateInfo();
13235 shaderStages[1] = fs.GetStageCreateInfo();
13236
13237 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13238 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13239
13240 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13241 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13242 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13243
13244 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13245 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013246 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013247
13248 VkPipelineColorBlendAttachmentState att = {};
13249 att.blendEnable = VK_FALSE;
13250 att.colorWriteMask = 0xf;
13251
13252 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13253 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13254 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13255 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013256 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013257 cb_ci.attachmentCount = 1;
13258 cb_ci.pAttachments = &att;
13259
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013260 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13261 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13262 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13263
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013264 VkGraphicsPipelineCreateInfo gp_ci = {};
13265 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13266 gp_ci.stageCount = 2;
13267 gp_ci.pStages = shaderStages;
13268 gp_ci.pVertexInputState = &vi_ci;
13269 gp_ci.pInputAssemblyState = &ia_ci;
13270 gp_ci.pViewportState = &vp_state_ci;
13271 gp_ci.pRasterizationState = &rs_ci;
13272 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013273 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013274 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13275 gp_ci.layout = pipeline_layout;
13276 gp_ci.renderPass = renderPass();
13277
13278 VkPipelineCacheCreateInfo pc_ci = {};
13279 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13280
13281 VkPipeline pipeline;
13282 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013283 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013284 ASSERT_VK_SUCCESS(err);
13285
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013286 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013287 m_errorMonitor->VerifyFound();
13288 if (VK_SUCCESS == err) {
13289 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13290 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013291 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13292 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13293}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013294
Mike Stroyanaccf7692015-05-12 16:00:45 -060013295#if GTEST_IS_THREADSAFE
13296struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013297 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013298 VkEvent event;
13299 bool bailout;
13300};
13301
Karl Schultz6addd812016-02-02 17:17:23 -070013302extern "C" void *AddToCommandBuffer(void *arg) {
13303 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013304
Mike Stroyana6d14942016-07-13 15:10:05 -060013305 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013306 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013307 if (data->bailout) {
13308 break;
13309 }
13310 }
13311 return NULL;
13312}
13313
Karl Schultz6addd812016-02-02 17:17:23 -070013314TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013315 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013316
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013318
Tony Barbour1fa09702017-03-16 12:09:08 -060013319 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013320 ASSERT_NO_FATAL_FAILURE(InitViewport());
13321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13322
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013323 // Calls AllocateCommandBuffers
13324 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013325
13326 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013327 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013328
13329 VkEventCreateInfo event_info;
13330 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013331 VkResult err;
13332
13333 memset(&event_info, 0, sizeof(event_info));
13334 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13335
Chia-I Wuf7458c52015-10-26 21:10:41 +080013336 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013337 ASSERT_VK_SUCCESS(err);
13338
Mike Stroyanaccf7692015-05-12 16:00:45 -060013339 err = vkResetEvent(device(), event);
13340 ASSERT_VK_SUCCESS(err);
13341
13342 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013343 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013344 data.event = event;
13345 data.bailout = false;
13346 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013347
13348 // First do some correct operations using multiple threads.
13349 // Add many entries to command buffer from another thread.
13350 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13351 // Make non-conflicting calls from this thread at the same time.
13352 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013353 uint32_t count;
13354 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013355 }
13356 test_platform_thread_join(thread, NULL);
13357
13358 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013359 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013360 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013361 // Add many entries to command buffer from this thread at the same time.
13362 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013363
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013364 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013365 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013366
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013367 m_errorMonitor->SetBailout(NULL);
13368
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013369 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013370
Chia-I Wuf7458c52015-10-26 21:10:41 +080013371 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013372}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013373#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013374
Karl Schultz6addd812016-02-02 17:17:23 -070013375TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013376 TEST_DESCRIPTION(
13377 "Test that an error is produced for a spirv module "
13378 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013379
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013381
Tony Barbour1fa09702017-03-16 12:09:08 -060013382 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13384
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013385 VkShaderModule module;
13386 VkShaderModuleCreateInfo moduleCreateInfo;
13387 struct icd_spv_header spv;
13388
13389 spv.magic = ICD_SPV_MAGIC;
13390 spv.version = ICD_SPV_VERSION;
13391 spv.gen_magic = 0;
13392
13393 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13394 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013395 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013396 moduleCreateInfo.codeSize = 4;
13397 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013398 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013399
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013400 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013401}
13402
Karl Schultz6addd812016-02-02 17:17:23 -070013403TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013404 TEST_DESCRIPTION(
13405 "Test that an error is produced for a spirv module "
13406 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013409
Tony Barbour1fa09702017-03-16 12:09:08 -060013410 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13412
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013413 VkShaderModule module;
13414 VkShaderModuleCreateInfo moduleCreateInfo;
13415 struct icd_spv_header spv;
13416
13417 spv.magic = ~ICD_SPV_MAGIC;
13418 spv.version = ICD_SPV_VERSION;
13419 spv.gen_magic = 0;
13420
13421 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13422 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013423 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013424 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13425 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013426 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013427
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013428 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013429}
13430
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013431#if 0
13432// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013433TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013435 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013436
Tony Barbour1fa09702017-03-16 12:09:08 -060013437 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13439
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013440 VkShaderModule module;
13441 VkShaderModuleCreateInfo moduleCreateInfo;
13442 struct icd_spv_header spv;
13443
13444 spv.magic = ICD_SPV_MAGIC;
13445 spv.version = ~ICD_SPV_VERSION;
13446 spv.gen_magic = 0;
13447
13448 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13449 moduleCreateInfo.pNext = NULL;
13450
Karl Schultz6addd812016-02-02 17:17:23 -070013451 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013452 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13453 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013454 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013455
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013456 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013457}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013458#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013459
Karl Schultz6addd812016-02-02 17:17:23 -070013460TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013461 TEST_DESCRIPTION(
13462 "Test that a warning is produced for a vertex output that "
13463 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013465
Tony Barbour1fa09702017-03-16 12:09:08 -060013466 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013468
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013469 char const *vsSource =
13470 "#version 450\n"
13471 "\n"
13472 "layout(location=0) out float x;\n"
13473 "out gl_PerVertex {\n"
13474 " vec4 gl_Position;\n"
13475 "};\n"
13476 "void main(){\n"
13477 " gl_Position = vec4(1);\n"
13478 " x = 0;\n"
13479 "}\n";
13480 char const *fsSource =
13481 "#version 450\n"
13482 "\n"
13483 "layout(location=0) out vec4 color;\n"
13484 "void main(){\n"
13485 " color = vec4(1);\n"
13486 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013487
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013488 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13489 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013490
13491 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013492 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013493 pipe.AddShader(&vs);
13494 pipe.AddShader(&fs);
13495
Chris Forbes9f7ff632015-05-25 11:13:08 +120013496 VkDescriptorSetObj descriptorSet(m_device);
13497 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013498 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013499
Tony Barbour5781e8f2015-08-04 16:23:11 -060013500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013502 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013503}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013504
Mark Mueller098c9cb2016-09-08 09:01:57 -060013505TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13506 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13507
Tony Barbour1fa09702017-03-16 12:09:08 -060013508 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13510
13511 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013512 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013513
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013514 char const *vsSource =
13515 "#version 450\n"
13516 "\n"
13517 "out gl_PerVertex {\n"
13518 " vec4 gl_Position;\n"
13519 "};\n"
13520 "void main(){\n"
13521 " gl_Position = vec4(1);\n"
13522 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013523
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013524 char const *fsSource =
13525 "#version 450\n"
13526 "\n"
13527 "layout (constant_id = 0) const float r = 0.0f;\n"
13528 "layout(location = 0) out vec4 uFragColor;\n"
13529 "void main(){\n"
13530 " uFragColor = vec4(r,1,0,1);\n"
13531 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013532
13533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13535
13536 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13537 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13538
13539 VkPipelineLayout pipeline_layout;
13540 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13541
13542 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13543 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13544 vp_state_create_info.viewportCount = 1;
13545 VkViewport viewport = {};
13546 vp_state_create_info.pViewports = &viewport;
13547 vp_state_create_info.scissorCount = 1;
13548 VkRect2D scissors = {};
13549 vp_state_create_info.pScissors = &scissors;
13550
13551 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13552
13553 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13554 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13555 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13556 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13557
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013558 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013559
13560 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13561 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13562
13563 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13564 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13565 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13566
13567 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13568 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13569 rasterization_state_create_info.pNext = nullptr;
13570 rasterization_state_create_info.lineWidth = 1.0f;
13571 rasterization_state_create_info.rasterizerDiscardEnable = true;
13572
13573 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13574 color_blend_attachment_state.blendEnable = VK_FALSE;
13575 color_blend_attachment_state.colorWriteMask = 0xf;
13576
13577 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13578 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13579 color_blend_state_create_info.attachmentCount = 1;
13580 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13581
13582 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13583 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13584 graphicspipe_create_info.stageCount = 2;
13585 graphicspipe_create_info.pStages = shader_stage_create_info;
13586 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13587 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13588 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13589 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13590 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13591 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13592 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13593 graphicspipe_create_info.layout = pipeline_layout;
13594 graphicspipe_create_info.renderPass = renderPass();
13595
13596 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13597 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13598
13599 VkPipelineCache pipelineCache;
13600 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13601
13602 // This structure maps constant ids to data locations.
13603 const VkSpecializationMapEntry entry =
13604 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013605 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013606
13607 uint32_t data = 1;
13608
13609 // Set up the info describing spec map and data
13610 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013611 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013612 };
13613 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13614
13615 VkPipeline pipeline;
13616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13617 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13618 m_errorMonitor->VerifyFound();
13619
13620 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13621 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13622}
13623
13624TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13625 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13626
Tony Barbour1fa09702017-03-16 12:09:08 -060013627 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13629
13630 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13631
13632 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13633 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13634 descriptor_pool_type_count[0].descriptorCount = 1;
13635 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13636 descriptor_pool_type_count[1].descriptorCount = 1;
13637
13638 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13639 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13640 descriptor_pool_create_info.maxSets = 1;
13641 descriptor_pool_create_info.poolSizeCount = 2;
13642 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13643 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13644
13645 VkDescriptorPool descriptorset_pool;
13646 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13647
13648 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13649 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13650 descriptorset_layout_binding.descriptorCount = 1;
13651 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013652 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013653
13654 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13655 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13656 descriptorset_layout_create_info.bindingCount = 1;
13657 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13658
13659 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013660 ASSERT_VK_SUCCESS(
13661 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013662
13663 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13664 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13665 descriptorset_allocate_info.descriptorSetCount = 1;
13666 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13667 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13668 VkDescriptorSet descriptorset;
13669 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13670
13671 // Challenge core_validation with a non uniform buffer type.
13672 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13673
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013674 char const *vsSource =
13675 "#version 450\n"
13676 "\n"
13677 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13678 " mat4 mvp;\n"
13679 "} ubuf;\n"
13680 "out gl_PerVertex {\n"
13681 " vec4 gl_Position;\n"
13682 "};\n"
13683 "void main(){\n"
13684 " gl_Position = ubuf.mvp * vec4(1);\n"
13685 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013686
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013687 char const *fsSource =
13688 "#version 450\n"
13689 "\n"
13690 "layout(location = 0) out vec4 uFragColor;\n"
13691 "void main(){\n"
13692 " uFragColor = vec4(0,1,0,1);\n"
13693 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013694
13695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13697
13698 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13699 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13700 pipeline_layout_create_info.setLayoutCount = 1;
13701 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13702
13703 VkPipelineLayout pipeline_layout;
13704 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13705
13706 VkPipelineObj pipe(m_device);
13707 pipe.AddColorAttachment();
13708 pipe.AddShader(&vs);
13709 pipe.AddShader(&fs);
13710
13711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13712 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13713 m_errorMonitor->VerifyFound();
13714
13715 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13716 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13717 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13718}
13719
13720TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13721 TEST_DESCRIPTION(
13722 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13723
Tony Barbour1fa09702017-03-16 12:09:08 -060013724 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013725 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13726
13727 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13728
13729 VkDescriptorPoolSize descriptor_pool_type_count = {};
13730 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13731 descriptor_pool_type_count.descriptorCount = 1;
13732
13733 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13734 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13735 descriptor_pool_create_info.maxSets = 1;
13736 descriptor_pool_create_info.poolSizeCount = 1;
13737 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13738 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13739
13740 VkDescriptorPool descriptorset_pool;
13741 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13742
13743 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13744 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13745 descriptorset_layout_binding.descriptorCount = 1;
13746 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13747 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013748 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013749
13750 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13751 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13752 descriptorset_layout_create_info.bindingCount = 1;
13753 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13754
13755 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013756 ASSERT_VK_SUCCESS(
13757 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013758
13759 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13760 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13761 descriptorset_allocate_info.descriptorSetCount = 1;
13762 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13763 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13764 VkDescriptorSet descriptorset;
13765 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13766
13767 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13768
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013769 char const *vsSource =
13770 "#version 450\n"
13771 "\n"
13772 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13773 " mat4 mvp;\n"
13774 "} ubuf;\n"
13775 "out gl_PerVertex {\n"
13776 " vec4 gl_Position;\n"
13777 "};\n"
13778 "void main(){\n"
13779 " gl_Position = ubuf.mvp * vec4(1);\n"
13780 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013781
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013782 char const *fsSource =
13783 "#version 450\n"
13784 "\n"
13785 "layout(location = 0) out vec4 uFragColor;\n"
13786 "void main(){\n"
13787 " uFragColor = vec4(0,1,0,1);\n"
13788 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013789
13790 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13791 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13792
13793 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13794 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13795 pipeline_layout_create_info.setLayoutCount = 1;
13796 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13797
13798 VkPipelineLayout pipeline_layout;
13799 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13800
13801 VkPipelineObj pipe(m_device);
13802 pipe.AddColorAttachment();
13803 pipe.AddShader(&vs);
13804 pipe.AddShader(&fs);
13805
13806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13807 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13808 m_errorMonitor->VerifyFound();
13809
13810 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13811 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13812 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13813}
13814
13815TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013816 TEST_DESCRIPTION(
13817 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13818 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013819
Tony Barbour1fa09702017-03-16 12:09:08 -060013820 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013821 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13822
13823 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013824 "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 -060013825
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013826 char const *vsSource =
13827 "#version 450\n"
13828 "\n"
13829 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13830 "out gl_PerVertex {\n"
13831 " vec4 gl_Position;\n"
13832 "};\n"
13833 "void main(){\n"
13834 " gl_Position = vec4(consts.x);\n"
13835 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013836
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013837 char const *fsSource =
13838 "#version 450\n"
13839 "\n"
13840 "layout(location = 0) out vec4 uFragColor;\n"
13841 "void main(){\n"
13842 " uFragColor = vec4(0,1,0,1);\n"
13843 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013844
13845 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13846 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13847
13848 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13849 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13850
13851 // Set up a push constant range
13852 VkPushConstantRange push_constant_ranges = {};
13853 // Set to the wrong stage to challenge core_validation
13854 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13855 push_constant_ranges.size = 4;
13856
13857 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13858 pipeline_layout_create_info.pushConstantRangeCount = 1;
13859
13860 VkPipelineLayout pipeline_layout;
13861 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13862
13863 VkPipelineObj pipe(m_device);
13864 pipe.AddColorAttachment();
13865 pipe.AddShader(&vs);
13866 pipe.AddShader(&fs);
13867
13868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13869 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13870 m_errorMonitor->VerifyFound();
13871
13872 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13873}
13874
13875TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13876 TEST_DESCRIPTION(
13877 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13878
Tony Barbour1fa09702017-03-16 12:09:08 -060013879 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13881
13882 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013883 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013884
13885 // Some awkward steps are required to test with custom device features.
13886 std::vector<const char *> device_extension_names;
13887 auto features = m_device->phy().features();
13888 // Disable support for 64 bit floats
13889 features.shaderFloat64 = false;
13890 // The sacrificial device object
13891 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13892
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013893 char const *vsSource =
13894 "#version 450\n"
13895 "\n"
13896 "out gl_PerVertex {\n"
13897 " vec4 gl_Position;\n"
13898 "};\n"
13899 "void main(){\n"
13900 " gl_Position = vec4(1);\n"
13901 "}\n";
13902 char const *fsSource =
13903 "#version 450\n"
13904 "\n"
13905 "layout(location=0) out vec4 color;\n"
13906 "void main(){\n"
13907 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13908 " color = vec4(green);\n"
13909 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013910
13911 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13912 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13913
13914 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013915
13916 VkPipelineObj pipe(&test_device);
13917 pipe.AddColorAttachment();
13918 pipe.AddShader(&vs);
13919 pipe.AddShader(&fs);
13920
13921 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13922 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13923 VkPipelineLayout pipeline_layout;
13924 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13925
13926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13927 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13928 m_errorMonitor->VerifyFound();
13929
13930 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13931}
13932
13933TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13934 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13935
Tony Barbour1fa09702017-03-16 12:09:08 -060013936 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013937 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13938
13939 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13940
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013941 char const *vsSource =
13942 "#version 450\n"
13943 "\n"
13944 "out gl_PerVertex {\n"
13945 " vec4 gl_Position;\n"
13946 "};\n"
13947 "layout(xfb_buffer = 1) out;"
13948 "void main(){\n"
13949 " gl_Position = vec4(1);\n"
13950 "}\n";
13951 char const *fsSource =
13952 "#version 450\n"
13953 "\n"
13954 "layout(location=0) out vec4 color;\n"
13955 "void main(){\n"
13956 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13957 " color = vec4(green);\n"
13958 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013959
13960 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13961 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13962
13963 VkPipelineObj pipe(m_device);
13964 pipe.AddColorAttachment();
13965 pipe.AddShader(&vs);
13966 pipe.AddShader(&fs);
13967
13968 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13969 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13970 VkPipelineLayout pipeline_layout;
13971 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13972
13973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13974 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13975 m_errorMonitor->VerifyFound();
13976
13977 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13978}
13979
Karl Schultz6addd812016-02-02 17:17:23 -070013980TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013981 TEST_DESCRIPTION(
13982 "Test that an error is produced for a fragment shader input "
13983 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013984
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013986
Tony Barbour1fa09702017-03-16 12:09:08 -060013987 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013989
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013990 char const *vsSource =
13991 "#version 450\n"
13992 "\n"
13993 "out gl_PerVertex {\n"
13994 " vec4 gl_Position;\n"
13995 "};\n"
13996 "void main(){\n"
13997 " gl_Position = vec4(1);\n"
13998 "}\n";
13999 char const *fsSource =
14000 "#version 450\n"
14001 "\n"
14002 "layout(location=0) in float x;\n"
14003 "layout(location=0) out vec4 color;\n"
14004 "void main(){\n"
14005 " color = vec4(x);\n"
14006 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014007
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014008 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14009 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014010
14011 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014012 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014013 pipe.AddShader(&vs);
14014 pipe.AddShader(&fs);
14015
Chris Forbes59cb88d2015-05-25 11:13:13 +120014016 VkDescriptorSetObj descriptorSet(m_device);
14017 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014018 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014019
Tony Barbour5781e8f2015-08-04 16:23:11 -060014020 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014021
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014022 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014023}
14024
Karl Schultz6addd812016-02-02 17:17:23 -070014025TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014026 TEST_DESCRIPTION(
14027 "Test that an error is produced for a fragment shader input "
14028 "within an interace block, which is not present in the outputs "
14029 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014031
Tony Barbour1fa09702017-03-16 12:09:08 -060014032 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14034
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014035 char const *vsSource =
14036 "#version 450\n"
14037 "\n"
14038 "out gl_PerVertex {\n"
14039 " vec4 gl_Position;\n"
14040 "};\n"
14041 "void main(){\n"
14042 " gl_Position = vec4(1);\n"
14043 "}\n";
14044 char const *fsSource =
14045 "#version 450\n"
14046 "\n"
14047 "in block { layout(location=0) float x; } ins;\n"
14048 "layout(location=0) out vec4 color;\n"
14049 "void main(){\n"
14050 " color = vec4(ins.x);\n"
14051 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014052
14053 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14054 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14055
14056 VkPipelineObj pipe(m_device);
14057 pipe.AddColorAttachment();
14058 pipe.AddShader(&vs);
14059 pipe.AddShader(&fs);
14060
14061 VkDescriptorSetObj descriptorSet(m_device);
14062 descriptorSet.AppendDummy();
14063 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14064
14065 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14066
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014067 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014068}
14069
Karl Schultz6addd812016-02-02 17:17:23 -070014070TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014071 TEST_DESCRIPTION(
14072 "Test that an error is produced for mismatched array sizes "
14073 "across the vertex->fragment shader interface");
14074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14075 "Type mismatch on location 0.0: 'ptr to "
14076 "output arr[2] of float32' vs 'ptr to "
14077 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014078
Tony Barbour1fa09702017-03-16 12:09:08 -060014079 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014082 char const *vsSource =
14083 "#version 450\n"
14084 "\n"
14085 "layout(location=0) out float x[2];\n"
14086 "out gl_PerVertex {\n"
14087 " vec4 gl_Position;\n"
14088 "};\n"
14089 "void main(){\n"
14090 " x[0] = 0; x[1] = 0;\n"
14091 " gl_Position = vec4(1);\n"
14092 "}\n";
14093 char const *fsSource =
14094 "#version 450\n"
14095 "\n"
14096 "layout(location=0) in float x[1];\n"
14097 "layout(location=0) out vec4 color;\n"
14098 "void main(){\n"
14099 " color = vec4(x[0]);\n"
14100 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014101
14102 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14103 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14104
14105 VkPipelineObj pipe(m_device);
14106 pipe.AddColorAttachment();
14107 pipe.AddShader(&vs);
14108 pipe.AddShader(&fs);
14109
14110 VkDescriptorSetObj descriptorSet(m_device);
14111 descriptorSet.AppendDummy();
14112 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14113
14114 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14115
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014116 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014117}
14118
Karl Schultz6addd812016-02-02 17:17:23 -070014119TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014120 TEST_DESCRIPTION(
14121 "Test that an error is produced for mismatched types across "
14122 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014124
Tony Barbour1fa09702017-03-16 12:09:08 -060014125 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014128 char const *vsSource =
14129 "#version 450\n"
14130 "\n"
14131 "layout(location=0) out int x;\n"
14132 "out gl_PerVertex {\n"
14133 " vec4 gl_Position;\n"
14134 "};\n"
14135 "void main(){\n"
14136 " x = 0;\n"
14137 " gl_Position = vec4(1);\n"
14138 "}\n";
14139 char const *fsSource =
14140 "#version 450\n"
14141 "\n"
14142 "layout(location=0) in float x;\n" /* VS writes int */
14143 "layout(location=0) out vec4 color;\n"
14144 "void main(){\n"
14145 " color = vec4(x);\n"
14146 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014147
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014148 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14149 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014150
14151 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014152 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014153 pipe.AddShader(&vs);
14154 pipe.AddShader(&fs);
14155
Chris Forbesb56af562015-05-25 11:13:17 +120014156 VkDescriptorSetObj descriptorSet(m_device);
14157 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014158 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014159
Tony Barbour5781e8f2015-08-04 16:23:11 -060014160 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014161
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014162 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014163}
14164
Karl Schultz6addd812016-02-02 17:17:23 -070014165TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014166 TEST_DESCRIPTION(
14167 "Test that an error is produced for mismatched types across "
14168 "the vertex->fragment shader interface, when the variable is contained within "
14169 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014171
Tony Barbour1fa09702017-03-16 12:09:08 -060014172 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14174
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014175 char const *vsSource =
14176 "#version 450\n"
14177 "\n"
14178 "out block { layout(location=0) int x; } outs;\n"
14179 "out gl_PerVertex {\n"
14180 " vec4 gl_Position;\n"
14181 "};\n"
14182 "void main(){\n"
14183 " outs.x = 0;\n"
14184 " gl_Position = vec4(1);\n"
14185 "}\n";
14186 char const *fsSource =
14187 "#version 450\n"
14188 "\n"
14189 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14190 "layout(location=0) out vec4 color;\n"
14191 "void main(){\n"
14192 " color = vec4(ins.x);\n"
14193 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014194
14195 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14196 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14197
14198 VkPipelineObj pipe(m_device);
14199 pipe.AddColorAttachment();
14200 pipe.AddShader(&vs);
14201 pipe.AddShader(&fs);
14202
14203 VkDescriptorSetObj descriptorSet(m_device);
14204 descriptorSet.AppendDummy();
14205 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14206
14207 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14208
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014209 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014210}
14211
14212TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014213 TEST_DESCRIPTION(
14214 "Test that an error is produced for location mismatches across "
14215 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14216 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014217 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 +130014218
Tony Barbour1fa09702017-03-16 12:09:08 -060014219 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14221
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014222 char const *vsSource =
14223 "#version 450\n"
14224 "\n"
14225 "out block { layout(location=1) float x; } outs;\n"
14226 "out gl_PerVertex {\n"
14227 " vec4 gl_Position;\n"
14228 "};\n"
14229 "void main(){\n"
14230 " outs.x = 0;\n"
14231 " gl_Position = vec4(1);\n"
14232 "}\n";
14233 char const *fsSource =
14234 "#version 450\n"
14235 "\n"
14236 "in block { layout(location=0) float x; } ins;\n"
14237 "layout(location=0) out vec4 color;\n"
14238 "void main(){\n"
14239 " color = vec4(ins.x);\n"
14240 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014241
14242 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14243 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14244
14245 VkPipelineObj pipe(m_device);
14246 pipe.AddColorAttachment();
14247 pipe.AddShader(&vs);
14248 pipe.AddShader(&fs);
14249
14250 VkDescriptorSetObj descriptorSet(m_device);
14251 descriptorSet.AppendDummy();
14252 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14253
14254 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14255
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014256 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014257}
14258
14259TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014260 TEST_DESCRIPTION(
14261 "Test that an error is produced for component mismatches across the "
14262 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14263 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014264 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 +130014265
Tony Barbour1fa09702017-03-16 12:09:08 -060014266 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014267 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14268
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014269 char const *vsSource =
14270 "#version 450\n"
14271 "\n"
14272 "out block { layout(location=0, component=0) float x; } outs;\n"
14273 "out gl_PerVertex {\n"
14274 " vec4 gl_Position;\n"
14275 "};\n"
14276 "void main(){\n"
14277 " outs.x = 0;\n"
14278 " gl_Position = vec4(1);\n"
14279 "}\n";
14280 char const *fsSource =
14281 "#version 450\n"
14282 "\n"
14283 "in block { layout(location=0, component=1) float x; } ins;\n"
14284 "layout(location=0) out vec4 color;\n"
14285 "void main(){\n"
14286 " color = vec4(ins.x);\n"
14287 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014288
14289 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14290 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14291
14292 VkPipelineObj pipe(m_device);
14293 pipe.AddColorAttachment();
14294 pipe.AddShader(&vs);
14295 pipe.AddShader(&fs);
14296
14297 VkDescriptorSetObj descriptorSet(m_device);
14298 descriptorSet.AppendDummy();
14299 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14300
14301 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14302
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014303 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014304}
14305
Chris Forbes1f3b0152016-11-30 12:48:40 +130014306TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14307 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14308
Tony Barbour1fa09702017-03-16 12:09:08 -060014309 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14311
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014312 char const *vsSource =
14313 "#version 450\n"
14314 "layout(location=0) out mediump float x;\n"
14315 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14316 char const *fsSource =
14317 "#version 450\n"
14318 "layout(location=0) in highp float x;\n"
14319 "layout(location=0) out vec4 color;\n"
14320 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014321
14322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14324
14325 VkPipelineObj pipe(m_device);
14326 pipe.AddColorAttachment();
14327 pipe.AddShader(&vs);
14328 pipe.AddShader(&fs);
14329
14330 VkDescriptorSetObj descriptorSet(m_device);
14331 descriptorSet.AppendDummy();
14332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14333
14334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14335
14336 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14337
14338 m_errorMonitor->VerifyFound();
14339}
14340
Chris Forbes870a39e2016-11-30 12:55:56 +130014341TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14342 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14343
Tony Barbour1fa09702017-03-16 12:09:08 -060014344 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014345 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14346
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014347 char const *vsSource =
14348 "#version 450\n"
14349 "out block { layout(location=0) mediump float x; };\n"
14350 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14351 char const *fsSource =
14352 "#version 450\n"
14353 "in block { layout(location=0) highp float x; };\n"
14354 "layout(location=0) out vec4 color;\n"
14355 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014356
14357 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14358 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14359
14360 VkPipelineObj pipe(m_device);
14361 pipe.AddColorAttachment();
14362 pipe.AddShader(&vs);
14363 pipe.AddShader(&fs);
14364
14365 VkDescriptorSetObj descriptorSet(m_device);
14366 descriptorSet.AppendDummy();
14367 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14368
14369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14370
14371 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14372
14373 m_errorMonitor->VerifyFound();
14374}
14375
Karl Schultz6addd812016-02-02 17:17:23 -070014376TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014377 TEST_DESCRIPTION(
14378 "Test that a warning is produced for a vertex attribute which is "
14379 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014381
Tony Barbour1fa09702017-03-16 12:09:08 -060014382 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014384
14385 VkVertexInputBindingDescription input_binding;
14386 memset(&input_binding, 0, sizeof(input_binding));
14387
14388 VkVertexInputAttributeDescription input_attrib;
14389 memset(&input_attrib, 0, sizeof(input_attrib));
14390 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14391
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014392 char const *vsSource =
14393 "#version 450\n"
14394 "\n"
14395 "out gl_PerVertex {\n"
14396 " vec4 gl_Position;\n"
14397 "};\n"
14398 "void main(){\n"
14399 " gl_Position = vec4(1);\n"
14400 "}\n";
14401 char const *fsSource =
14402 "#version 450\n"
14403 "\n"
14404 "layout(location=0) out vec4 color;\n"
14405 "void main(){\n"
14406 " color = vec4(1);\n"
14407 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014408
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014409 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14410 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014411
14412 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014413 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014414 pipe.AddShader(&vs);
14415 pipe.AddShader(&fs);
14416
14417 pipe.AddVertexInputBindings(&input_binding, 1);
14418 pipe.AddVertexInputAttribs(&input_attrib, 1);
14419
Chris Forbesde136e02015-05-25 11:13:28 +120014420 VkDescriptorSetObj descriptorSet(m_device);
14421 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014423
Tony Barbour5781e8f2015-08-04 16:23:11 -060014424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014425
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014426 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014427}
14428
Karl Schultz6addd812016-02-02 17:17:23 -070014429TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014430 TEST_DESCRIPTION(
14431 "Test that a warning is produced for a location mismatch on "
14432 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014434
Tony Barbour1fa09702017-03-16 12:09:08 -060014435 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14437
14438 VkVertexInputBindingDescription input_binding;
14439 memset(&input_binding, 0, sizeof(input_binding));
14440
14441 VkVertexInputAttributeDescription input_attrib;
14442 memset(&input_attrib, 0, sizeof(input_attrib));
14443 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14444
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014445 char const *vsSource =
14446 "#version 450\n"
14447 "\n"
14448 "layout(location=1) in float x;\n"
14449 "out gl_PerVertex {\n"
14450 " vec4 gl_Position;\n"
14451 "};\n"
14452 "void main(){\n"
14453 " gl_Position = vec4(x);\n"
14454 "}\n";
14455 char const *fsSource =
14456 "#version 450\n"
14457 "\n"
14458 "layout(location=0) out vec4 color;\n"
14459 "void main(){\n"
14460 " color = vec4(1);\n"
14461 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014462
14463 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14464 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14465
14466 VkPipelineObj pipe(m_device);
14467 pipe.AddColorAttachment();
14468 pipe.AddShader(&vs);
14469 pipe.AddShader(&fs);
14470
14471 pipe.AddVertexInputBindings(&input_binding, 1);
14472 pipe.AddVertexInputAttribs(&input_attrib, 1);
14473
14474 VkDescriptorSetObj descriptorSet(m_device);
14475 descriptorSet.AppendDummy();
14476 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14477
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014478 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014479 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14480
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014481 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014482}
14483
Karl Schultz6addd812016-02-02 17:17:23 -070014484TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014485 TEST_DESCRIPTION(
14486 "Test that an error is produced for a vertex shader input which is not "
14487 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14489 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014490
Tony Barbour1fa09702017-03-16 12:09:08 -060014491 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014494 char const *vsSource =
14495 "#version 450\n"
14496 "\n"
14497 "layout(location=0) in vec4 x;\n" /* not provided */
14498 "out gl_PerVertex {\n"
14499 " vec4 gl_Position;\n"
14500 "};\n"
14501 "void main(){\n"
14502 " gl_Position = x;\n"
14503 "}\n";
14504 char const *fsSource =
14505 "#version 450\n"
14506 "\n"
14507 "layout(location=0) out vec4 color;\n"
14508 "void main(){\n"
14509 " color = vec4(1);\n"
14510 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014511
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014512 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14513 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014514
14515 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014516 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014517 pipe.AddShader(&vs);
14518 pipe.AddShader(&fs);
14519
Chris Forbes62e8e502015-05-25 11:13:29 +120014520 VkDescriptorSetObj descriptorSet(m_device);
14521 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014523
Tony Barbour5781e8f2015-08-04 16:23:11 -060014524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014525
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014526 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014527}
14528
Karl Schultz6addd812016-02-02 17:17:23 -070014529TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014530 TEST_DESCRIPTION(
14531 "Test that an error is produced for a mismatch between the "
14532 "fundamental type (float/int/uint) of an attribute and the "
14533 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014534 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 -060014535
Tony Barbour1fa09702017-03-16 12:09:08 -060014536 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014538
14539 VkVertexInputBindingDescription input_binding;
14540 memset(&input_binding, 0, sizeof(input_binding));
14541
14542 VkVertexInputAttributeDescription input_attrib;
14543 memset(&input_attrib, 0, sizeof(input_attrib));
14544 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14545
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014546 char const *vsSource =
14547 "#version 450\n"
14548 "\n"
14549 "layout(location=0) in int x;\n" /* attrib provided float */
14550 "out gl_PerVertex {\n"
14551 " vec4 gl_Position;\n"
14552 "};\n"
14553 "void main(){\n"
14554 " gl_Position = vec4(x);\n"
14555 "}\n";
14556 char const *fsSource =
14557 "#version 450\n"
14558 "\n"
14559 "layout(location=0) out vec4 color;\n"
14560 "void main(){\n"
14561 " color = vec4(1);\n"
14562 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014563
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014564 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14565 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014566
14567 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014568 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014569 pipe.AddShader(&vs);
14570 pipe.AddShader(&fs);
14571
14572 pipe.AddVertexInputBindings(&input_binding, 1);
14573 pipe.AddVertexInputAttribs(&input_attrib, 1);
14574
Chris Forbesc97d98e2015-05-25 11:13:31 +120014575 VkDescriptorSetObj descriptorSet(m_device);
14576 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014577 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014578
Tony Barbour5781e8f2015-08-04 16:23:11 -060014579 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014580
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014581 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014582}
14583
Chris Forbesc68b43c2016-04-06 11:18:47 +120014584TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014585 TEST_DESCRIPTION(
14586 "Test that an error is produced for a pipeline containing multiple "
14587 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14589 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014590
Tony Barbour1fa09702017-03-16 12:09:08 -060014591 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14593
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014594 char const *vsSource =
14595 "#version 450\n"
14596 "\n"
14597 "out gl_PerVertex {\n"
14598 " vec4 gl_Position;\n"
14599 "};\n"
14600 "void main(){\n"
14601 " gl_Position = vec4(1);\n"
14602 "}\n";
14603 char const *fsSource =
14604 "#version 450\n"
14605 "\n"
14606 "layout(location=0) out vec4 color;\n"
14607 "void main(){\n"
14608 " color = vec4(1);\n"
14609 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014610
14611 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14612 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14613
14614 VkPipelineObj pipe(m_device);
14615 pipe.AddColorAttachment();
14616 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014617 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014618 pipe.AddShader(&fs);
14619
14620 VkDescriptorSetObj descriptorSet(m_device);
14621 descriptorSet.AppendDummy();
14622 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14623
14624 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14625
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014626 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014627}
14628
Chris Forbes82ff92a2016-09-09 10:50:24 +120014629TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014631
Tony Barbour1fa09702017-03-16 12:09:08 -060014632 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14634
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014635 char const *vsSource =
14636 "#version 450\n"
14637 "out gl_PerVertex {\n"
14638 " vec4 gl_Position;\n"
14639 "};\n"
14640 "void main(){\n"
14641 " gl_Position = vec4(0);\n"
14642 "}\n";
14643 char const *fsSource =
14644 "#version 450\n"
14645 "\n"
14646 "layout(location=0) out vec4 color;\n"
14647 "void main(){\n"
14648 " color = vec4(1);\n"
14649 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014650
14651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14653
14654 VkPipelineObj pipe(m_device);
14655 pipe.AddColorAttachment();
14656 pipe.AddShader(&vs);
14657 pipe.AddShader(&fs);
14658
14659 VkDescriptorSetObj descriptorSet(m_device);
14660 descriptorSet.AppendDummy();
14661 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14662
14663 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14664
14665 m_errorMonitor->VerifyFound();
14666}
14667
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014668TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14670 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14671 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014672
Tony Barbour1fa09702017-03-16 12:09:08 -060014673 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14675
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014676 char const *vsSource =
14677 "#version 450\n"
14678 "void main(){ gl_Position = vec4(0); }\n";
14679 char const *fsSource =
14680 "#version 450\n"
14681 "\n"
14682 "layout(location=0) out vec4 color;\n"
14683 "void main(){\n"
14684 " color = vec4(1);\n"
14685 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014686
14687 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14688 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14689
14690 VkPipelineObj pipe(m_device);
14691 pipe.AddColorAttachment();
14692 pipe.AddShader(&vs);
14693 pipe.AddShader(&fs);
14694
14695 VkDescriptorSetObj descriptorSet(m_device);
14696 descriptorSet.AppendDummy();
14697 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14698
14699 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014700 {
14701 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14702 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14703 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014704 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014705 {
14706 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14707 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14708 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014709 },
14710 };
14711 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014712 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014713 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014714 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14715 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014716 VkRenderPass rp;
14717 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14718 ASSERT_VK_SUCCESS(err);
14719
14720 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14721
14722 m_errorMonitor->VerifyFound();
14723
14724 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14725}
14726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014727TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014728 TEST_DESCRIPTION(
14729 "Test that an error is produced for a variable output from "
14730 "the TCS without the patch decoration, but consumed in the TES "
14731 "with the decoration.");
14732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14733 "is per-vertex in tessellation control shader stage "
14734 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014735
Tony Barbour1fa09702017-03-16 12:09:08 -060014736 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14738
Chris Forbesc1e852d2016-04-04 19:26:42 +120014739 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014740 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014741 return;
14742 }
14743
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014744 char const *vsSource =
14745 "#version 450\n"
14746 "void main(){}\n";
14747 char const *tcsSource =
14748 "#version 450\n"
14749 "layout(location=0) out int x[];\n"
14750 "layout(vertices=3) out;\n"
14751 "void main(){\n"
14752 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14753 " gl_TessLevelInner[0] = 1;\n"
14754 " x[gl_InvocationID] = gl_InvocationID;\n"
14755 "}\n";
14756 char const *tesSource =
14757 "#version 450\n"
14758 "layout(triangles, equal_spacing, cw) in;\n"
14759 "layout(location=0) patch in int x;\n"
14760 "out gl_PerVertex { vec4 gl_Position; };\n"
14761 "void main(){\n"
14762 " gl_Position.xyz = gl_TessCoord;\n"
14763 " gl_Position.w = x;\n"
14764 "}\n";
14765 char const *fsSource =
14766 "#version 450\n"
14767 "layout(location=0) out vec4 color;\n"
14768 "void main(){\n"
14769 " color = vec4(1);\n"
14770 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014771
14772 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14773 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14774 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14775 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14776
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014777 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14778 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014779
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014780 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014781
14782 VkPipelineObj pipe(m_device);
14783 pipe.SetInputAssembly(&iasci);
14784 pipe.SetTessellation(&tsci);
14785 pipe.AddColorAttachment();
14786 pipe.AddShader(&vs);
14787 pipe.AddShader(&tcs);
14788 pipe.AddShader(&tes);
14789 pipe.AddShader(&fs);
14790
14791 VkDescriptorSetObj descriptorSet(m_device);
14792 descriptorSet.AppendDummy();
14793 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14794
14795 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14796
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014797 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014798}
14799
Karl Schultz6addd812016-02-02 17:17:23 -070014800TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014801 TEST_DESCRIPTION(
14802 "Test that an error is produced for a vertex attribute setup where multiple "
14803 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14805 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014806
Tony Barbour1fa09702017-03-16 12:09:08 -060014807 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014809
14810 /* Two binding descriptions for binding 0 */
14811 VkVertexInputBindingDescription input_bindings[2];
14812 memset(input_bindings, 0, sizeof(input_bindings));
14813
14814 VkVertexInputAttributeDescription input_attrib;
14815 memset(&input_attrib, 0, sizeof(input_attrib));
14816 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14817
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014818 char const *vsSource =
14819 "#version 450\n"
14820 "\n"
14821 "layout(location=0) in float x;\n" /* attrib provided float */
14822 "out gl_PerVertex {\n"
14823 " vec4 gl_Position;\n"
14824 "};\n"
14825 "void main(){\n"
14826 " gl_Position = vec4(x);\n"
14827 "}\n";
14828 char const *fsSource =
14829 "#version 450\n"
14830 "\n"
14831 "layout(location=0) out vec4 color;\n"
14832 "void main(){\n"
14833 " color = vec4(1);\n"
14834 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014835
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014836 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14837 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014838
14839 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014840 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014841 pipe.AddShader(&vs);
14842 pipe.AddShader(&fs);
14843
14844 pipe.AddVertexInputBindings(input_bindings, 2);
14845 pipe.AddVertexInputAttribs(&input_attrib, 1);
14846
Chris Forbes280ba2c2015-06-12 11:16:41 +120014847 VkDescriptorSetObj descriptorSet(m_device);
14848 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014849 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014850
Tony Barbour5781e8f2015-08-04 16:23:11 -060014851 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014852
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014853 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014854}
Chris Forbes8f68b562015-05-25 11:13:32 +120014855
Karl Schultz6addd812016-02-02 17:17:23 -070014856TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014857 TEST_DESCRIPTION(
14858 "Test that an error is produced for a fragment shader which does not "
14859 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014861
Tony Barbour1fa09702017-03-16 12:09:08 -060014862 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014863
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014864 char const *vsSource =
14865 "#version 450\n"
14866 "\n"
14867 "out gl_PerVertex {\n"
14868 " vec4 gl_Position;\n"
14869 "};\n"
14870 "void main(){\n"
14871 " gl_Position = vec4(1);\n"
14872 "}\n";
14873 char const *fsSource =
14874 "#version 450\n"
14875 "\n"
14876 "void main(){\n"
14877 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014878
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014879 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14880 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014881
14882 VkPipelineObj pipe(m_device);
14883 pipe.AddShader(&vs);
14884 pipe.AddShader(&fs);
14885
Chia-I Wu08accc62015-07-07 11:50:03 +080014886 /* set up CB 0, not written */
14887 pipe.AddColorAttachment();
14888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014889
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014890 VkDescriptorSetObj descriptorSet(m_device);
14891 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014892 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014893
Tony Barbour5781e8f2015-08-04 16:23:11 -060014894 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014895
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014896 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014897}
14898
Karl Schultz6addd812016-02-02 17:17:23 -070014899TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014900 TEST_DESCRIPTION(
14901 "Test that a warning is produced for a fragment shader which provides a spurious "
14902 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014904 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014905
Tony Barbour1fa09702017-03-16 12:09:08 -060014906 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014907
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014908 char const *vsSource =
14909 "#version 450\n"
14910 "\n"
14911 "out gl_PerVertex {\n"
14912 " vec4 gl_Position;\n"
14913 "};\n"
14914 "void main(){\n"
14915 " gl_Position = vec4(1);\n"
14916 "}\n";
14917 char const *fsSource =
14918 "#version 450\n"
14919 "\n"
14920 "layout(location=0) out vec4 x;\n"
14921 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14922 "void main(){\n"
14923 " x = vec4(1);\n"
14924 " y = vec4(1);\n"
14925 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014926
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014929
14930 VkPipelineObj pipe(m_device);
14931 pipe.AddShader(&vs);
14932 pipe.AddShader(&fs);
14933
Chia-I Wu08accc62015-07-07 11:50:03 +080014934 /* set up CB 0, not written */
14935 pipe.AddColorAttachment();
14936 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014937 /* FS writes CB 1, but we don't configure it */
14938
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014939 VkDescriptorSetObj descriptorSet(m_device);
14940 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014941 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014942
Tony Barbour5781e8f2015-08-04 16:23:11 -060014943 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014944
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014945 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014946}
14947
Karl Schultz6addd812016-02-02 17:17:23 -070014948TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014949 TEST_DESCRIPTION(
14950 "Test that an error is produced for a mismatch between the fundamental "
14951 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014953
Tony Barbour1fa09702017-03-16 12:09:08 -060014954 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014955
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014956 char const *vsSource =
14957 "#version 450\n"
14958 "\n"
14959 "out gl_PerVertex {\n"
14960 " vec4 gl_Position;\n"
14961 "};\n"
14962 "void main(){\n"
14963 " gl_Position = vec4(1);\n"
14964 "}\n";
14965 char const *fsSource =
14966 "#version 450\n"
14967 "\n"
14968 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14969 "void main(){\n"
14970 " x = ivec4(1);\n"
14971 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014972
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014973 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14974 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014975
14976 VkPipelineObj pipe(m_device);
14977 pipe.AddShader(&vs);
14978 pipe.AddShader(&fs);
14979
Chia-I Wu08accc62015-07-07 11:50:03 +080014980 /* set up CB 0; type is UNORM by default */
14981 pipe.AddColorAttachment();
14982 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014983
Chris Forbesa36d69e2015-05-25 11:13:44 +120014984 VkDescriptorSetObj descriptorSet(m_device);
14985 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014986 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014987
Tony Barbour5781e8f2015-08-04 16:23:11 -060014988 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014989
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014990 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014991}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014992
Karl Schultz6addd812016-02-02 17:17:23 -070014993TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014994 TEST_DESCRIPTION(
14995 "Test that an error is produced for a shader consuming a uniform "
14996 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014998
Tony Barbour1fa09702017-03-16 12:09:08 -060014999 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015000
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015001 char const *vsSource =
15002 "#version 450\n"
15003 "\n"
15004 "out gl_PerVertex {\n"
15005 " vec4 gl_Position;\n"
15006 "};\n"
15007 "void main(){\n"
15008 " gl_Position = vec4(1);\n"
15009 "}\n";
15010 char const *fsSource =
15011 "#version 450\n"
15012 "\n"
15013 "layout(location=0) out vec4 x;\n"
15014 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15015 "void main(){\n"
15016 " x = vec4(bar.y);\n"
15017 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015018
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015019 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15020 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015021
Chris Forbes556c76c2015-08-14 12:04:59 +120015022 VkPipelineObj pipe(m_device);
15023 pipe.AddShader(&vs);
15024 pipe.AddShader(&fs);
15025
15026 /* set up CB 0; type is UNORM by default */
15027 pipe.AddColorAttachment();
15028 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15029
15030 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015031 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015032
15033 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15034
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015035 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015036}
15037
Chris Forbes5c59e902016-02-26 16:56:09 +130015038TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015039 TEST_DESCRIPTION(
15040 "Test that an error is produced for a shader consuming push constants "
15041 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015043
Tony Barbour1fa09702017-03-16 12:09:08 -060015044 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015045
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015046 char const *vsSource =
15047 "#version 450\n"
15048 "\n"
15049 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15050 "out gl_PerVertex {\n"
15051 " vec4 gl_Position;\n"
15052 "};\n"
15053 "void main(){\n"
15054 " gl_Position = vec4(consts.x);\n"
15055 "}\n";
15056 char const *fsSource =
15057 "#version 450\n"
15058 "\n"
15059 "layout(location=0) out vec4 x;\n"
15060 "void main(){\n"
15061 " x = vec4(1);\n"
15062 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015063
15064 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15065 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15066
15067 VkPipelineObj pipe(m_device);
15068 pipe.AddShader(&vs);
15069 pipe.AddShader(&fs);
15070
15071 /* set up CB 0; type is UNORM by default */
15072 pipe.AddColorAttachment();
15073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15074
15075 VkDescriptorSetObj descriptorSet(m_device);
15076 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15077
15078 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15079
15080 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015081 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015082}
15083
Chris Forbes3fb17902016-08-22 14:57:55 +120015084TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015085 TEST_DESCRIPTION(
15086 "Test that an error is produced for a shader consuming an input attachment "
15087 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15089 "consumes input attachment index 0 but not provided in subpass");
15090
Tony Barbour1fa09702017-03-16 12:09:08 -060015091 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015092
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015093 char const *vsSource =
15094 "#version 450\n"
15095 "\n"
15096 "out gl_PerVertex {\n"
15097 " vec4 gl_Position;\n"
15098 "};\n"
15099 "void main(){\n"
15100 " gl_Position = vec4(1);\n"
15101 "}\n";
15102 char const *fsSource =
15103 "#version 450\n"
15104 "\n"
15105 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15106 "layout(location=0) out vec4 color;\n"
15107 "void main() {\n"
15108 " color = subpassLoad(x);\n"
15109 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015110
15111 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15112 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15113
15114 VkPipelineObj pipe(m_device);
15115 pipe.AddShader(&vs);
15116 pipe.AddShader(&fs);
15117 pipe.AddColorAttachment();
15118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015120 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15121 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015122 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015123 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015124 ASSERT_VK_SUCCESS(err);
15125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015126 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015127 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015128 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015129 ASSERT_VK_SUCCESS(err);
15130
15131 // error here.
15132 pipe.CreateVKPipeline(pl, renderPass());
15133
15134 m_errorMonitor->VerifyFound();
15135
15136 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15137 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15138}
15139
Chris Forbes5a9a0472016-08-22 16:02:09 +120015140TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015141 TEST_DESCRIPTION(
15142 "Test that an error is produced for a shader consuming an input attachment "
15143 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15145 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15146
Tony Barbour1fa09702017-03-16 12:09:08 -060015147 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015148
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015149 char const *vsSource =
15150 "#version 450\n"
15151 "\n"
15152 "out gl_PerVertex {\n"
15153 " vec4 gl_Position;\n"
15154 "};\n"
15155 "void main(){\n"
15156 " gl_Position = vec4(1);\n"
15157 "}\n";
15158 char const *fsSource =
15159 "#version 450\n"
15160 "\n"
15161 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15162 "layout(location=0) out vec4 color;\n"
15163 "void main() {\n"
15164 " color = subpassLoad(x);\n"
15165 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015166
15167 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15168 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15169
15170 VkPipelineObj pipe(m_device);
15171 pipe.AddShader(&vs);
15172 pipe.AddShader(&fs);
15173 pipe.AddColorAttachment();
15174 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15175
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015176 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15177 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015178 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015179 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015180 ASSERT_VK_SUCCESS(err);
15181
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015182 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015183 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015184 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015185 ASSERT_VK_SUCCESS(err);
15186
15187 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015188 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15189 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15190 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15191 {0, VK_FORMAT_R8G8B8A8_UINT, 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_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes5a9a0472016-08-22 16:02:09 +120015193 };
15194 VkAttachmentReference color = {
15195 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15196 };
15197 VkAttachmentReference input = {
15198 1, VK_IMAGE_LAYOUT_GENERAL,
15199 };
15200
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015201 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015202
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015203 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015204 VkRenderPass rp;
15205 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15206 ASSERT_VK_SUCCESS(err);
15207
15208 // error here.
15209 pipe.CreateVKPipeline(pl, rp);
15210
15211 m_errorMonitor->VerifyFound();
15212
15213 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15214 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15215 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15216}
15217
Chris Forbes541f7b02016-08-22 15:30:27 +120015218TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015219 TEST_DESCRIPTION(
15220 "Test that an error is produced for a shader consuming an input attachment "
15221 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015223 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015224
Tony Barbour1fa09702017-03-16 12:09:08 -060015225 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015226
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015227 char const *vsSource =
15228 "#version 450\n"
15229 "\n"
15230 "out gl_PerVertex {\n"
15231 " vec4 gl_Position;\n"
15232 "};\n"
15233 "void main(){\n"
15234 " gl_Position = vec4(1);\n"
15235 "}\n";
15236 char const *fsSource =
15237 "#version 450\n"
15238 "\n"
15239 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15240 "layout(location=0) out vec4 color;\n"
15241 "void main() {\n"
15242 " color = subpassLoad(xs[0]);\n"
15243 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015244
15245 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15246 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15247
15248 VkPipelineObj pipe(m_device);
15249 pipe.AddShader(&vs);
15250 pipe.AddShader(&fs);
15251 pipe.AddColorAttachment();
15252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15253
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015254 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15255 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015256 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015257 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015258 ASSERT_VK_SUCCESS(err);
15259
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015260 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015261 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015262 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015263 ASSERT_VK_SUCCESS(err);
15264
15265 // error here.
15266 pipe.CreateVKPipeline(pl, renderPass());
15267
15268 m_errorMonitor->VerifyFound();
15269
15270 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15271 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15272}
15273
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015274TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015275 TEST_DESCRIPTION(
15276 "Test that an error is produced for a compute pipeline consuming a "
15277 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015279
Tony Barbour1fa09702017-03-16 12:09:08 -060015280 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015281
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015282 char const *csSource =
15283 "#version 450\n"
15284 "\n"
15285 "layout(local_size_x=1) in;\n"
15286 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15287 "void main(){\n"
15288 " x = vec4(1);\n"
15289 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015290
15291 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15292
15293 VkDescriptorSetObj descriptorSet(m_device);
15294 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15295
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015296 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15297 nullptr,
15298 0,
15299 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15300 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15301 descriptorSet.GetPipelineLayout(),
15302 VK_NULL_HANDLE,
15303 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015304
15305 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015306 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015307
15308 m_errorMonitor->VerifyFound();
15309
15310 if (err == VK_SUCCESS) {
15311 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15312 }
15313}
15314
Chris Forbes22a9b092016-07-19 14:34:05 +120015315TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015316 TEST_DESCRIPTION(
15317 "Test that an error is produced for a pipeline consuming a "
15318 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15320 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015321
Tony Barbour1fa09702017-03-16 12:09:08 -060015322 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015324 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15325 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015326 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015327 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015328 ASSERT_VK_SUCCESS(err);
15329
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015330 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015331 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015332 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015333 ASSERT_VK_SUCCESS(err);
15334
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015335 char const *csSource =
15336 "#version 450\n"
15337 "\n"
15338 "layout(local_size_x=1) in;\n"
15339 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15340 "void main() {\n"
15341 " x.x = 1.0f;\n"
15342 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015343 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015345 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15346 nullptr,
15347 0,
15348 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15349 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15350 pl,
15351 VK_NULL_HANDLE,
15352 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015353
15354 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015355 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015356
15357 m_errorMonitor->VerifyFound();
15358
15359 if (err == VK_SUCCESS) {
15360 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15361 }
15362
15363 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15364 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15365}
15366
Chris Forbes50020592016-07-27 13:52:41 +120015367TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015368 TEST_DESCRIPTION(
15369 "Test that an error is produced when an image view type "
15370 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015371
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015372 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 +120015373
Tony Barbour1fa09702017-03-16 12:09:08 -060015374 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15376
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015377 char const *vsSource =
15378 "#version 450\n"
15379 "\n"
15380 "out gl_PerVertex { vec4 gl_Position; };\n"
15381 "void main() { gl_Position = vec4(0); }\n";
15382 char const *fsSource =
15383 "#version 450\n"
15384 "\n"
15385 "layout(set=0, binding=0) uniform sampler3D s;\n"
15386 "layout(location=0) out vec4 color;\n"
15387 "void main() {\n"
15388 " color = texture(s, vec3(0));\n"
15389 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015390 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15391 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15392
15393 VkPipelineObj pipe(m_device);
15394 pipe.AddShader(&vs);
15395 pipe.AddShader(&fs);
15396 pipe.AddColorAttachment();
15397
15398 VkTextureObj texture(m_device, nullptr);
15399 VkSamplerObj sampler(m_device);
15400
15401 VkDescriptorSetObj descriptorSet(m_device);
15402 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15403 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15404
15405 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15406 ASSERT_VK_SUCCESS(err);
15407
Tony Barbour552f6c02016-12-21 14:34:07 -070015408 m_commandBuffer->BeginCommandBuffer();
15409 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015410
15411 m_commandBuffer->BindPipeline(pipe);
15412 m_commandBuffer->BindDescriptorSet(descriptorSet);
15413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015414 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015415 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015416 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015417 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15418
15419 // error produced here.
15420 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15421
15422 m_errorMonitor->VerifyFound();
15423
Tony Barbour552f6c02016-12-21 14:34:07 -070015424 m_commandBuffer->EndRenderPass();
15425 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015426}
15427
Chris Forbes5533bfc2016-07-27 14:12:34 +120015428TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015429 TEST_DESCRIPTION(
15430 "Test that an error is produced when a multisampled images "
15431 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015434
Tony Barbour1fa09702017-03-16 12:09:08 -060015435 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15437
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015438 char const *vsSource =
15439 "#version 450\n"
15440 "\n"
15441 "out gl_PerVertex { vec4 gl_Position; };\n"
15442 "void main() { gl_Position = vec4(0); }\n";
15443 char const *fsSource =
15444 "#version 450\n"
15445 "\n"
15446 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15447 "layout(location=0) out vec4 color;\n"
15448 "void main() {\n"
15449 " color = texelFetch(s, ivec2(0), 0);\n"
15450 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015451 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15452 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15453
15454 VkPipelineObj pipe(m_device);
15455 pipe.AddShader(&vs);
15456 pipe.AddShader(&fs);
15457 pipe.AddColorAttachment();
15458
15459 VkTextureObj texture(m_device, nullptr);
15460 VkSamplerObj sampler(m_device);
15461
15462 VkDescriptorSetObj descriptorSet(m_device);
15463 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15465
15466 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15467 ASSERT_VK_SUCCESS(err);
15468
Tony Barbour552f6c02016-12-21 14:34:07 -070015469 m_commandBuffer->BeginCommandBuffer();
15470 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015471
15472 m_commandBuffer->BindPipeline(pipe);
15473 m_commandBuffer->BindDescriptorSet(descriptorSet);
15474
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015475 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015476 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015477 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015478 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15479
15480 // error produced here.
15481 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15482
15483 m_errorMonitor->VerifyFound();
15484
Tony Barbour552f6c02016-12-21 14:34:07 -070015485 m_commandBuffer->EndRenderPass();
15486 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015487}
15488
Mark Youngc48c4c12016-04-11 14:26:49 -060015489TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015490 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015491
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015492 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15493 {
15494 VkFormatProperties properties;
15495 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15496 if (properties.optimalTilingFeatures == 0) {
15497 printf(" Image format not supported; skipped.\n");
15498 return;
15499 }
15500 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015501
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015502 VkImageCreateInfo info = {};
15503 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15504 info.pNext = NULL;
15505 info.imageType = VK_IMAGE_TYPE_2D;
15506 info.format = format;
15507 info.extent.height = 32;
15508 info.extent.depth = 1;
15509 info.mipLevels = 1;
15510 info.arrayLayers = 1;
15511 info.samples = VK_SAMPLE_COUNT_1_BIT;
15512 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15513 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15514 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015515
15516 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015517 {
15518 VkImageFormatProperties properties;
15519 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15520 info.tiling, info.usage, info.flags, &properties);
15521 ASSERT_VK_SUCCESS(result);
15522 info.extent.width = properties.maxExtent.width + 1;
15523 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015524
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015525 VkImage image;
15526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15527 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015528 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015529}
15530
Mark Youngc48c4c12016-04-11 14:26:49 -060015531TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015532 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015533
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015534 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15535 {
15536 VkFormatProperties properties;
15537 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15538 if (properties.optimalTilingFeatures == 0) {
15539 printf(" Image format not supported; skipped.\n");
15540 return;
15541 }
15542 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015543
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015544 VkImageCreateInfo info = {};
15545 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15546 info.pNext = NULL;
15547 info.imageType = VK_IMAGE_TYPE_2D;
15548 info.format = format;
15549 info.extent.height = 32;
15550 info.extent.depth = 1;
15551 info.mipLevels = 1;
15552 info.arrayLayers = 1;
15553 info.samples = VK_SAMPLE_COUNT_1_BIT;
15554 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15555 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15556 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015557
15558 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015559 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015560
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015561 VkImage image;
15562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15563 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15564 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015565 m_errorMonitor->VerifyFound();
15566}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015567
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015568TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015569 TEST_DESCRIPTION(
15570 "Create a render pass with an attachment description "
15571 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015572
Tony Barbour1fa09702017-03-16 12:09:08 -060015573 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15575
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015577
15578 VkAttachmentReference color_attach = {};
15579 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15580 color_attach.attachment = 0;
15581 VkSubpassDescription subpass = {};
15582 subpass.colorAttachmentCount = 1;
15583 subpass.pColorAttachments = &color_attach;
15584
15585 VkRenderPassCreateInfo rpci = {};
15586 rpci.subpassCount = 1;
15587 rpci.pSubpasses = &subpass;
15588 rpci.attachmentCount = 1;
15589 VkAttachmentDescription attach_desc = {};
15590 attach_desc.format = VK_FORMAT_UNDEFINED;
15591 rpci.pAttachments = &attach_desc;
15592 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15593 VkRenderPass rp;
15594 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15595
15596 m_errorMonitor->VerifyFound();
15597
15598 if (result == VK_SUCCESS) {
15599 vkDestroyRenderPass(m_device->device(), rp, NULL);
15600 }
15601}
15602
Karl Schultz6addd812016-02-02 17:17:23 -070015603TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015604 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015605
Mike Stroyana3082432015-09-25 13:39:21 -060015606 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015607 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15608 const int32_t tex_width = 32;
15609 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015610
15611 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015612 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15613 image_create_info.pNext = NULL;
15614 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15615 image_create_info.format = tex_format;
15616 image_create_info.extent.width = tex_width;
15617 image_create_info.extent.height = tex_height;
15618 image_create_info.extent.depth = 1;
15619 image_create_info.mipLevels = 1;
15620 image_create_info.arrayLayers = 1;
15621 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15622 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15623 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15624 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015625
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015626 VkImage image;
15627 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015628 ASSERT_VK_SUCCESS(err);
15629
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015630 VkMemoryRequirements requirements;
15631 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15632
15633 VkMemoryAllocateInfo alloc_info{};
15634 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15635 alloc_info.pNext = NULL;
15636 alloc_info.memoryTypeIndex = 0;
15637 alloc_info.allocationSize = requirements.size;
15638 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15639 ASSERT_TRUE(pass);
15640
15641 VkDeviceMemory memory;
15642 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15643 ASSERT_VK_SUCCESS(err);
15644
15645 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15646
Tobin Ehliscde08892015-09-22 10:11:37 -060015647 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015648 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015649 image_view_create_info.image = image;
15650 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15651 image_view_create_info.format = tex_format;
15652 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015653 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015654 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015655 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015656
15657 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015659 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015660 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015661
15662 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015663 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015664}
Mike Stroyana3082432015-09-25 13:39:21 -060015665
Mark Youngd339ba32016-05-30 13:28:35 -060015666TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15667 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015669 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015670
Tony Barbour1fa09702017-03-16 12:09:08 -060015671 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015672
15673 // Create an image and try to create a view with no memory backing the image
15674 VkImage image;
15675
15676 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15677 const int32_t tex_width = 32;
15678 const int32_t tex_height = 32;
15679
15680 VkImageCreateInfo image_create_info = {};
15681 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15682 image_create_info.pNext = NULL;
15683 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15684 image_create_info.format = tex_format;
15685 image_create_info.extent.width = tex_width;
15686 image_create_info.extent.height = tex_height;
15687 image_create_info.extent.depth = 1;
15688 image_create_info.mipLevels = 1;
15689 image_create_info.arrayLayers = 1;
15690 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15691 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15692 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15693 image_create_info.flags = 0;
15694
15695 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15696 ASSERT_VK_SUCCESS(err);
15697
15698 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015699 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015700 image_view_create_info.image = image;
15701 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15702 image_view_create_info.format = tex_format;
15703 image_view_create_info.subresourceRange.layerCount = 1;
15704 image_view_create_info.subresourceRange.baseMipLevel = 0;
15705 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015706 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015707
15708 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015709 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015710
15711 m_errorMonitor->VerifyFound();
15712 vkDestroyImage(m_device->device(), image, NULL);
15713 // If last error is success, it still created the view, so delete it.
15714 if (err == VK_SUCCESS) {
15715 vkDestroyImageView(m_device->device(), view, NULL);
15716 }
Mark Youngd339ba32016-05-30 13:28:35 -060015717}
15718
Karl Schultz6addd812016-02-02 17:17:23 -070015719TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015720 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015722
Tony Barbour1fa09702017-03-16 12:09:08 -060015723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015724
Karl Schultz6addd812016-02-02 17:17:23 -070015725 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015726 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015727 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015728 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015729
15730 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015731 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015732 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015733 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15734 image_view_create_info.format = tex_format;
15735 image_view_create_info.subresourceRange.baseMipLevel = 0;
15736 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015737 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015738 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015739 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015740
15741 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015742 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015743
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015744 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015745}
15746
Mike Weiblena1e13f42017-02-09 21:25:59 -070015747TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15748 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15749
Tony Barbour1fa09702017-03-16 12:09:08 -060015750 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015751 VkSubresourceLayout subres_layout = {};
15752
15753 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15754 {
15755 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15756 VkImageObj img(m_device);
15757 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15758 ASSERT_TRUE(img.initialized());
15759
15760 VkImageSubresource subres = {};
15761 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15762 subres.mipLevel = 0;
15763 subres.arrayLayer = 0;
15764
15765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15766 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15767 m_errorMonitor->VerifyFound();
15768 }
15769
15770 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15771 {
15772 VkImageObj img(m_device);
15773 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15774 ASSERT_TRUE(img.initialized());
15775
15776 VkImageSubresource subres = {};
15777 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15778 subres.mipLevel = 0;
15779 subres.arrayLayer = 0;
15780
15781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15783 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15784 m_errorMonitor->VerifyFound();
15785 }
15786
15787 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15788 {
15789 VkImageObj img(m_device);
15790 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15791 ASSERT_TRUE(img.initialized());
15792
15793 VkImageSubresource subres = {};
15794 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15795 subres.mipLevel = 1; // ERROR: triggers VU 00739
15796 subres.arrayLayer = 0;
15797
15798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15799 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15800 m_errorMonitor->VerifyFound();
15801 }
15802
15803 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15804 {
15805 VkImageObj img(m_device);
15806 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15807 ASSERT_TRUE(img.initialized());
15808
15809 VkImageSubresource subres = {};
15810 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15811 subres.mipLevel = 0;
15812 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15813
15814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15815 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15816 m_errorMonitor->VerifyFound();
15817 }
15818}
15819
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015820TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015821 VkResult err;
15822 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015823
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015825
Tony Barbour1fa09702017-03-16 12:09:08 -060015826 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015827
15828 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015829 VkImage srcImage;
15830 VkImage dstImage;
15831 VkDeviceMemory srcMem;
15832 VkDeviceMemory destMem;
15833 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015834
15835 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015836 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15837 image_create_info.pNext = NULL;
15838 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15839 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15840 image_create_info.extent.width = 32;
15841 image_create_info.extent.height = 32;
15842 image_create_info.extent.depth = 1;
15843 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015844 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015845 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15846 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15847 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15848 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015849
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015850 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015851 ASSERT_VK_SUCCESS(err);
15852
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015853 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015854 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015855 ASSERT_VK_SUCCESS(err);
15856
15857 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015858 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015859 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15860 memAlloc.pNext = NULL;
15861 memAlloc.allocationSize = 0;
15862 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015863
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015864 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015865 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015866 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015867 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015868 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015869 ASSERT_VK_SUCCESS(err);
15870
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015871 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015872 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015873 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015874 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015875 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015876 ASSERT_VK_SUCCESS(err);
15877
15878 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15879 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015880 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015881 ASSERT_VK_SUCCESS(err);
15882
Tony Barbour552f6c02016-12-21 14:34:07 -070015883 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015884 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015885 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015886 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015887 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015888 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015889 copyRegion.srcOffset.x = 0;
15890 copyRegion.srcOffset.y = 0;
15891 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015892 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015893 copyRegion.dstSubresource.mipLevel = 0;
15894 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015895 // Introduce failure by forcing the dst layerCount to differ from src
15896 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015897 copyRegion.dstOffset.x = 0;
15898 copyRegion.dstOffset.y = 0;
15899 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015900 copyRegion.extent.width = 1;
15901 copyRegion.extent.height = 1;
15902 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015903 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015904 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015905
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015906 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015907
Chia-I Wuf7458c52015-10-26 21:10:41 +080015908 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015909 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015910 vkFreeMemory(m_device->device(), srcMem, NULL);
15911 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015912}
15913
Tony Barbourd6673642016-05-05 14:46:39 -060015914TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015915 TEST_DESCRIPTION("Creating images with unsuported formats ");
15916
Tony Barbour1fa09702017-03-16 12:09:08 -060015917 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015918 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015919
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015920 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015921 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015922 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015923 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15924 image_create_info.format = VK_FORMAT_UNDEFINED;
15925 image_create_info.extent.width = 32;
15926 image_create_info.extent.height = 32;
15927 image_create_info.extent.depth = 1;
15928 image_create_info.mipLevels = 1;
15929 image_create_info.arrayLayers = 1;
15930 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15931 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15932 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015933
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15935 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015936
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015937 VkImage image;
15938 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015939 m_errorMonitor->VerifyFound();
15940
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015941 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015942 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015943 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15944 VkFormat format = static_cast<VkFormat>(f);
15945 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015946 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015947 unsupported = format;
15948 break;
15949 }
15950 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015951
Tony Barbourd6673642016-05-05 14:46:39 -060015952 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015953 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015955
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015956 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015957 m_errorMonitor->VerifyFound();
15958 }
15959}
15960
15961TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015962 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15963
Tony Barbour1fa09702017-03-16 12:09:08 -060015964 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070015965 auto depth_format = find_depth_stencil_format(m_device);
15966 if (!depth_format) {
15967 return;
15968 }
Tony Barbourd6673642016-05-05 14:46:39 -060015969
15970 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015971 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 -060015972 VK_IMAGE_TILING_OPTIMAL, 0);
15973 ASSERT_TRUE(image.initialized());
15974
15975 VkImageView imgView;
15976 VkImageViewCreateInfo imgViewInfo = {};
15977 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15978 imgViewInfo.image = image.handle();
15979 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15980 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15981 imgViewInfo.subresourceRange.layerCount = 1;
15982 imgViewInfo.subresourceRange.baseMipLevel = 0;
15983 imgViewInfo.subresourceRange.levelCount = 1;
15984 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15985
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015986 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015987 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015989 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15990 m_errorMonitor->VerifyFound();
15991 imgViewInfo.subresourceRange.baseMipLevel = 0;
15992
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015993 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015994 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015996 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15997 m_errorMonitor->VerifyFound();
15998 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15999
Tony Barbourd6673642016-05-05 14:46:39 -060016000 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16001 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016003 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16004 m_errorMonitor->VerifyFound();
16005 imgViewInfo.subresourceRange.levelCount = 1;
16006
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016007 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16008 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016009 m_errorMonitor->SetDesiredFailureMsg(
16010 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16011 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016012 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16013 m_errorMonitor->VerifyFound();
16014 imgViewInfo.subresourceRange.layerCount = 1;
16015
Tony Barbourd6673642016-05-05 14:46:39 -060016016 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016017 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016018 m_errorMonitor->SetDesiredFailureMsg(
16019 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16020 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016021 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16022 m_errorMonitor->VerifyFound();
16023 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16024
Tony Barbourd6673642016-05-05 14:46:39 -060016025 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16026 // VIEW_CREATE_ERROR
16027 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016029 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16030 m_errorMonitor->VerifyFound();
16031 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16032
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016033 // TODO: Update framework to easily passing mutable flag into ImageObj init
16034 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016035 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16036 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16037 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016038 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16039 // VIEW_CREATE_ERROR
16040 VkImageCreateInfo mutImgInfo = image.create_info();
16041 VkImage mutImage;
16042 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016043 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016044 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16045 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016046 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016047 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016048
16049 VkMemoryRequirements requirements;
16050 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16051
16052 VkMemoryAllocateInfo alloc_info{};
16053 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16054 alloc_info.pNext = NULL;
16055 alloc_info.memoryTypeIndex = 0;
16056 alloc_info.allocationSize = requirements.size;
16057 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16058 ASSERT_TRUE(pass);
16059
16060 VkDeviceMemory memory;
16061 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16062 ASSERT_VK_SUCCESS(ret);
16063
16064 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16065 ASSERT_VK_SUCCESS(ret);
16066
Tony Barbourd6673642016-05-05 14:46:39 -060016067 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016069 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16070 m_errorMonitor->VerifyFound();
16071 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016072
16073 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016074 vkDestroyImage(m_device->handle(), mutImage, NULL);
16075}
16076
Dave Houlton75967fc2017-03-06 17:21:16 -070016077TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16078 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16079
Tony Barbour1fa09702017-03-16 12:09:08 -060016080 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016081
Jamie Madill35127872017-03-15 16:17:46 -040016082 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016083 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16084 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16085 if (device_features.textureCompressionBC) {
16086 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16087 } else if (device_features.textureCompressionETC2) {
16088 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16089 } else if (device_features.textureCompressionASTC_LDR) {
16090 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16091 } else {
16092 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16093 return;
16094 }
16095
16096 VkImageCreateInfo ci;
16097 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16098 ci.pNext = NULL;
16099 ci.flags = 0;
16100 ci.imageType = VK_IMAGE_TYPE_2D;
16101 ci.format = compressed_format;
16102 ci.extent = {32, 32, 1};
16103 ci.mipLevels = 6;
16104 ci.arrayLayers = 1;
16105 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16106 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16107 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16108 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16109 ci.queueFamilyIndexCount = 0;
16110 ci.pQueueFamilyIndices = NULL;
16111 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16112
16113 VkImageObj image(m_device);
16114 image.init(&ci);
16115 ASSERT_TRUE(image.initialized());
16116
16117 VkImageObj odd_image(m_device);
16118 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16119 odd_image.init(&ci);
16120 ASSERT_TRUE(odd_image.initialized());
16121
16122 // Allocate buffers
16123 VkMemoryPropertyFlags reqs = 0;
16124 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16125 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16126 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16127 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16128 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16129
16130 VkBufferImageCopy region = {};
16131 region.bufferRowLength = 0;
16132 region.bufferImageHeight = 0;
16133 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16134 region.imageSubresource.layerCount = 1;
16135 region.imageOffset = {0, 0, 0};
16136 region.bufferOffset = 0;
16137
16138 // start recording
16139 m_commandBuffer->BeginCommandBuffer();
16140
16141 // Mip level copies that work - 5 levels
16142 m_errorMonitor->ExpectSuccess();
16143
16144 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16145 region.imageExtent = {32, 32, 1};
16146 region.imageSubresource.mipLevel = 0;
16147 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16148 &region);
16149 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16150 &region);
16151
16152 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16153 region.imageExtent = {8, 8, 1};
16154 region.imageSubresource.mipLevel = 2;
16155 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16156 &region);
16157 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16158 &region);
16159
16160 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16161 region.imageExtent = {4, 4, 1};
16162 region.imageSubresource.mipLevel = 3;
16163 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16164 &region);
16165 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16166 &region);
16167
16168 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16169 region.imageExtent = {2, 2, 1};
16170 region.imageSubresource.mipLevel = 4;
16171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16172 &region);
16173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16174 &region);
16175
16176 region.imageExtent = {1, 1, 1};
16177 region.imageSubresource.mipLevel = 5;
16178 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16179 &region);
16180 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16181 &region);
16182 m_errorMonitor->VerifyNotFound();
16183
16184 // Buffer must accomodate a full compressed block, regardless of texel count
16185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16186 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16187 &region);
16188 m_errorMonitor->VerifyFound();
16189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16190 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16191 &region);
16192 m_errorMonitor->VerifyFound();
16193
16194 // Copy width < compressed block size, but not the full mip width
16195 region.imageExtent = {1, 2, 1};
16196 region.imageSubresource.mipLevel = 4;
16197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16198 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16199 &region);
16200 m_errorMonitor->VerifyFound();
16201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16202 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16203 &region);
16204 m_errorMonitor->VerifyFound();
16205
16206 // Copy height < compressed block size but not the full mip height
16207 region.imageExtent = {2, 1, 1};
16208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16209 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16210 &region);
16211 m_errorMonitor->VerifyFound();
16212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16213 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16214 &region);
16215 m_errorMonitor->VerifyFound();
16216
16217 // Offsets must be multiple of compressed block size
16218 region.imageOffset = {1, 1, 0};
16219 region.imageExtent = {1, 1, 1};
16220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16221 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16222 &region);
16223 m_errorMonitor->VerifyFound();
16224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16225 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16226 &region);
16227 m_errorMonitor->VerifyFound();
16228
16229 // Offset + extent width = mip width - should succeed
16230 region.imageOffset = {4, 4, 0};
16231 region.imageExtent = {3, 4, 1};
16232 region.imageSubresource.mipLevel = 2;
16233 m_errorMonitor->ExpectSuccess();
16234 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16235 &region);
16236 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16237 &region);
16238 m_errorMonitor->VerifyNotFound();
16239
16240 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16241 region.imageExtent = {4, 4, 1};
16242 m_errorMonitor->ExpectSuccess();
16243 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16244 &region);
16245 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16246 &region);
16247 m_errorMonitor->VerifyNotFound();
16248
16249 // Offset + extent width < mip width and not a multiple of block width - should fail
16250 region.imageExtent = {3, 3, 1};
16251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16252 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16253 &region);
16254 m_errorMonitor->VerifyFound();
16255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16256 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16257 &region);
16258 m_errorMonitor->VerifyFound();
16259}
16260
Dave Houlton59a20702017-02-02 17:26:23 -070016261TEST_F(VkLayerTest, ImageBufferCopyTests) {
16262 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16263
Tony Barbour1fa09702017-03-16 12:09:08 -060016264 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016265 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16266 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16267 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16268 return;
16269 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016270
16271 // Bail if any dimension of transfer granularity is 0.
16272 auto index = m_device->graphics_queue_node_index_;
16273 auto queue_family_properties = m_device->phy().queue_properties();
16274 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16275 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16276 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16277 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16278 return;
16279 }
16280
Dave Houlton59a20702017-02-02 17:26:23 -070016281 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16282 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16283 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016284 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16285 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16286 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16287 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16288
Dave Houlton59a20702017-02-02 17:26:23 -070016289 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16290 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16291 VK_IMAGE_TILING_OPTIMAL, 0);
16292 image_16k.init(64, 64, 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_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16296 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016297 ASSERT_TRUE(image_64k.initialized());
16298 ASSERT_TRUE(image_16k.initialized());
16299 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016300
Dave Houltonf3229d52017-02-21 15:59:08 -070016301 // Verify all needed Depth/Stencil formats are supported
16302 bool missing_ds_support = false;
16303 VkFormatProperties props = {0, 0, 0};
16304 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16305 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16306 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16307 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16308 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16309 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16310 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16311 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16312
16313 if (!missing_ds_support) {
16314 ds_image_4D_1S.init(
16315 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16316 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16317 VK_IMAGE_TILING_OPTIMAL, 0);
16318 ASSERT_TRUE(ds_image_4D_1S.initialized());
16319
16320 ds_image_3D_1S.init(
16321 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16322 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16323 VK_IMAGE_TILING_OPTIMAL, 0);
16324 ASSERT_TRUE(ds_image_3D_1S.initialized());
16325
16326 ds_image_2D.init(
16327 256, 256, VK_FORMAT_D16_UNORM,
16328 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16329 VK_IMAGE_TILING_OPTIMAL, 0);
16330 ASSERT_TRUE(ds_image_2D.initialized());
16331
16332 ds_image_1S.init(
16333 256, 256, VK_FORMAT_S8_UINT,
16334 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16335 VK_IMAGE_TILING_OPTIMAL, 0);
16336 ASSERT_TRUE(ds_image_1S.initialized());
16337 }
16338
16339 // Allocate buffers
16340 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016341 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016342 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16343 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16344 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16345 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016346
16347 VkBufferImageCopy region = {};
16348 region.bufferRowLength = 0;
16349 region.bufferImageHeight = 0;
16350 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16351 region.imageSubresource.layerCount = 1;
16352 region.imageOffset = {0, 0, 0};
16353 region.imageExtent = {64, 64, 1};
16354 region.bufferOffset = 0;
16355
16356 // attempt copies before putting command buffer in recording state
16357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16358 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16359 &region);
16360 m_errorMonitor->VerifyFound();
16361
16362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16363 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16364 &region);
16365 m_errorMonitor->VerifyFound();
16366
16367 // start recording
16368 m_commandBuffer->BeginCommandBuffer();
16369
16370 // successful copies
16371 m_errorMonitor->ExpectSuccess();
16372 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16373 &region);
16374 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16375 &region);
16376 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16377 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16378 &region);
16379 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16380 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16381 &region);
16382 region.imageOffset.x = 0;
16383 region.imageExtent.height = 64;
16384 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16385 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16386 &region);
16387 m_errorMonitor->VerifyNotFound();
16388
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016389 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016390 region.imageExtent = {65, 64, 1};
16391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16392 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16393 &region);
16394 m_errorMonitor->VerifyFound();
16395
16396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16397 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16398 &region);
16399 m_errorMonitor->VerifyFound();
16400
16401 // image/buffer too small (offset) on copy to image
16402 region.imageExtent = {64, 64, 1};
16403 region.imageOffset = {0, 4, 0};
16404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407 m_errorMonitor->VerifyFound();
16408
16409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16410 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16411 &region);
16412 m_errorMonitor->VerifyFound();
16413
16414 // image/buffer too small on copy to buffer
16415 region.imageExtent = {64, 64, 1};
16416 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016417 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16419 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16420 &region);
16421 m_errorMonitor->VerifyFound();
16422
16423 region.imageExtent = {64, 65, 1};
16424 region.bufferOffset = 0;
16425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16426 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16427 &region);
16428 m_errorMonitor->VerifyFound();
16429
16430 // buffer size ok but rowlength causes loose packing
16431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16432 region.imageExtent = {64, 64, 1};
16433 region.bufferRowLength = 68;
16434 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16435 &region);
16436 m_errorMonitor->VerifyFound();
16437
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016438 // An extent with zero area should produce a warning, but no error
16439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16440 region.imageExtent.width = 0;
16441 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16442 &region);
16443 m_errorMonitor->VerifyFound();
16444
Dave Houlton59a20702017-02-02 17:26:23 -070016445 // aspect bits
16446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16447 region.imageExtent = {64, 64, 1};
16448 region.bufferRowLength = 0;
16449 region.bufferImageHeight = 0;
16450 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16451 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16452 buffer_16k.handle(), 1, &region);
16453 m_errorMonitor->VerifyFound();
16454
16455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16456 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16457 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16458 &region);
16459 m_errorMonitor->VerifyFound();
16460
16461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16462 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16463 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16464 buffer_16k.handle(), 1, &region);
16465 m_errorMonitor->VerifyFound();
16466
Dave Houltonf3229d52017-02-21 15:59:08 -070016467 // Test Depth/Stencil copies
16468 if (missing_ds_support) {
16469 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16470 } else {
16471 VkBufferImageCopy ds_region = {};
16472 ds_region.bufferOffset = 0;
16473 ds_region.bufferRowLength = 0;
16474 ds_region.bufferImageHeight = 0;
16475 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16476 ds_region.imageSubresource.mipLevel = 0;
16477 ds_region.imageSubresource.baseArrayLayer = 0;
16478 ds_region.imageSubresource.layerCount = 1;
16479 ds_region.imageOffset = {0, 0, 0};
16480 ds_region.imageExtent = {256, 256, 1};
16481
16482 // Depth copies that should succeed
16483 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16484 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16485 buffer_256k.handle(), 1, &ds_region);
16486 m_errorMonitor->VerifyNotFound();
16487
16488 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16489 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16490 buffer_256k.handle(), 1, &ds_region);
16491 m_errorMonitor->VerifyNotFound();
16492
16493 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16494 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16495 buffer_128k.handle(), 1, &ds_region);
16496 m_errorMonitor->VerifyNotFound();
16497
16498 // Depth copies that should fail
16499 ds_region.bufferOffset = 4;
16500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16501 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16502 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16503 buffer_256k.handle(), 1, &ds_region);
16504 m_errorMonitor->VerifyFound();
16505
16506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16507 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16508 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16509 buffer_256k.handle(), 1, &ds_region);
16510 m_errorMonitor->VerifyFound();
16511
16512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16513 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16514 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16515 buffer_128k.handle(), 1, &ds_region);
16516 m_errorMonitor->VerifyFound();
16517
16518 // Stencil copies that should succeed
16519 ds_region.bufferOffset = 0;
16520 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16521 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16522 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16523 buffer_64k.handle(), 1, &ds_region);
16524 m_errorMonitor->VerifyNotFound();
16525
16526 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16527 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16528 buffer_64k.handle(), 1, &ds_region);
16529 m_errorMonitor->VerifyNotFound();
16530
16531 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16532 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16533 buffer_64k.handle(), 1, &ds_region);
16534 m_errorMonitor->VerifyNotFound();
16535
16536 // Stencil copies that should fail
16537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16538 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16539 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16540 buffer_16k.handle(), 1, &ds_region);
16541 m_errorMonitor->VerifyFound();
16542
16543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16544 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16545 ds_region.bufferRowLength = 260;
16546 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16547 buffer_64k.handle(), 1, &ds_region);
16548 m_errorMonitor->VerifyFound();
16549
16550 ds_region.bufferRowLength = 0;
16551 ds_region.bufferOffset = 4;
16552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16553 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16554 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16555 buffer_64k.handle(), 1, &ds_region);
16556 m_errorMonitor->VerifyFound();
16557 }
16558
Dave Houlton584d51e2017-02-16 12:52:54 -070016559 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016560 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016561 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016562 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16563 device_features.textureCompressionASTC_LDR)) {
16564 printf(" No compressed formats supported - block compression tests skipped.\n");
16565 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016566 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16567 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016568 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016569 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 -070016570 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16571 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016572 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016573 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 -070016574 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016575 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16576 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016577 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016578 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16579 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016580 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16581 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016582 }
16583 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016584
Dave Houlton584d51e2017-02-16 12:52:54 -070016585 // Just fits
16586 m_errorMonitor->ExpectSuccess();
16587 region.imageExtent = {128, 128, 1};
16588 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16589 buffer_16k.handle(), 1, &region);
16590 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016591
Dave Houlton584d51e2017-02-16 12:52:54 -070016592 // with offset, too big for buffer
16593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16594 region.bufferOffset = 16;
16595 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16596 buffer_16k.handle(), 1, &region);
16597 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016598 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016599
Dave Houlton67e9b532017-03-02 17:00:10 -070016600 // extents that are not a multiple of compressed block size
16601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16602 region.imageExtent.width = 66;
16603 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16604 buffer_16k.handle(), 1, &region);
16605 m_errorMonitor->VerifyFound();
16606 region.imageExtent.width = 128;
16607
16608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016609 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016610 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16611 buffer_16k.handle(), 1, &region);
16612 m_errorMonitor->VerifyFound();
16613 region.imageExtent.height = 128;
16614
16615 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16616
16617 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16618 m_errorMonitor->ExpectSuccess();
16619 region.imageExtent.width = 66;
16620 region.imageOffset.x = 64;
16621 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16622 buffer_16k.handle(), 1, &region);
16623 region.imageExtent.width = 16;
16624 region.imageOffset.x = 0;
16625 region.imageExtent.height = 2;
16626 region.imageOffset.y = 128;
16627 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016628 buffer_16k.handle(), 1, &region);
16629 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016630 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016631
Dave Houlton584d51e2017-02-16 12:52:54 -070016632 // buffer offset must be a multiple of texel block size (16)
16633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16635 region.imageExtent = {64, 64, 1};
16636 region.bufferOffset = 24;
16637 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16638 buffer_16k.handle(), 1, &region);
16639 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016640
Dave Houlton584d51e2017-02-16 12:52:54 -070016641 // rowlength not a multiple of block width (4)
16642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16643 region.bufferOffset = 0;
16644 region.bufferRowLength = 130;
16645 region.bufferImageHeight = 0;
16646 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16647 buffer_64k.handle(), 1, &region);
16648 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016649
Dave Houlton584d51e2017-02-16 12:52:54 -070016650 // imageheight not a multiple of block height (4)
16651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16652 region.bufferRowLength = 0;
16653 region.bufferImageHeight = 130;
16654 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16655 buffer_64k.handle(), 1, &region);
16656 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016657 }
Dave Houlton59a20702017-02-02 17:26:23 -070016658}
16659
Tony Barbourd6673642016-05-05 14:46:39 -060016660TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016661 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016662
Tony Barbour1fa09702017-03-16 12:09:08 -060016663 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016664
Rene Lindsay135204f2016-12-22 17:11:09 -070016665 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016666 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016667 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 -070016668 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016669 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016670 vk_testing::Buffer buffer;
16671 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016672 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016673 VkBufferImageCopy region = {};
16674 region.bufferRowLength = 128;
16675 region.bufferImageHeight = 128;
16676 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16677 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016678 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016679 region.imageExtent.height = 4;
16680 region.imageExtent.width = 4;
16681 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016682
16683 VkImageObj image2(m_device);
16684 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 -070016685 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016686 ASSERT_TRUE(image2.initialized());
16687 vk_testing::Buffer buffer2;
16688 VkMemoryPropertyFlags reqs2 = 0;
16689 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16690 VkBufferImageCopy region2 = {};
16691 region2.bufferRowLength = 128;
16692 region2.bufferImageHeight = 128;
16693 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16694 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16695 region2.imageSubresource.layerCount = 1;
16696 region2.imageExtent.height = 4;
16697 region2.imageExtent.width = 4;
16698 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016699 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016700
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016701 // Image must have offset.z of 0 and extent.depth of 1
16702 // Introduce failure by setting imageExtent.depth to 0
16703 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016705 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016706 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016707 m_errorMonitor->VerifyFound();
16708
16709 region.imageExtent.depth = 1;
16710
16711 // Image must have offset.z of 0 and extent.depth of 1
16712 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016713 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016714 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016717 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016718 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016719 m_errorMonitor->VerifyFound();
16720
16721 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016722 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16723 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016724 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016726 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16727 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016728 m_errorMonitor->VerifyFound();
16729
16730 // BufferOffset must be a multiple of 4
16731 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016732 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016734 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16735 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016736 m_errorMonitor->VerifyFound();
16737
16738 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16739 region.bufferOffset = 0;
16740 region.imageExtent.height = 128;
16741 region.imageExtent.width = 128;
16742 // Introduce failure by setting bufferRowLength > 0 but less than width
16743 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016745 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16746 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016747 m_errorMonitor->VerifyFound();
16748
16749 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16750 region.bufferRowLength = 128;
16751 // Introduce failure by setting bufferRowHeight > 0 but less than height
16752 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016754 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16755 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016756 m_errorMonitor->VerifyFound();
16757
16758 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016759 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016760 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16761 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016762 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016763 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16764 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016765 VkImageBlit blitRegion = {};
16766 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16767 blitRegion.srcSubresource.baseArrayLayer = 0;
16768 blitRegion.srcSubresource.layerCount = 1;
16769 blitRegion.srcSubresource.mipLevel = 0;
16770 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16771 blitRegion.dstSubresource.baseArrayLayer = 0;
16772 blitRegion.dstSubresource.layerCount = 1;
16773 blitRegion.dstSubresource.mipLevel = 0;
16774
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016775 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16777 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16779 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016780 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16781 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016782 m_errorMonitor->VerifyFound();
16783
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016785 VkImageMemoryBarrier img_barrier;
16786 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16787 img_barrier.pNext = NULL;
16788 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16789 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16790 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16791 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16792 img_barrier.image = image.handle();
16793 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16794 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16795 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16796 img_barrier.subresourceRange.baseArrayLayer = 0;
16797 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016798 img_barrier.subresourceRange.layerCount = 0;
16799 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016800 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16801 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016802 m_errorMonitor->VerifyFound();
16803 img_barrier.subresourceRange.layerCount = 1;
16804}
16805
16806TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016807 TEST_DESCRIPTION("Exceed the limits of image format ");
16808
Tony Barbour1fa09702017-03-16 12:09:08 -060016809 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016810
16811 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16812 {
16813 VkFormatProperties properties;
16814 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16815 if (properties.linearTilingFeatures == 0) {
16816 printf(" Image format not supported; skipped.\n");
16817 return;
16818 }
16819 }
16820
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016822 VkImageCreateInfo image_create_info = {};
16823 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16824 image_create_info.pNext = NULL;
16825 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016826 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016827 image_create_info.extent.width = 32;
16828 image_create_info.extent.height = 32;
16829 image_create_info.extent.depth = 1;
16830 image_create_info.mipLevels = 1;
16831 image_create_info.arrayLayers = 1;
16832 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16833 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16834 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16835 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16836 image_create_info.flags = 0;
16837
16838 VkImage nullImg;
16839 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016840 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16841 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016842 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016843 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16844 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16845 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016846 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016847
Tony Barbour0907e362017-03-09 15:05:30 -070016848 uint32_t maxDim =
16849 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16850 // If max mip levels exceeds image extents, skip the max mip levels test
16851 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16853 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16854 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16855 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16856 m_errorMonitor->VerifyFound();
16857 image_create_info.mipLevels = 1;
16858 }
Tony Barbourd6673642016-05-05 14:46:39 -060016859
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016861 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16862 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16863 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16864 m_errorMonitor->VerifyFound();
16865 image_create_info.arrayLayers = 1;
16866
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016868 int samples = imgFmtProps.sampleCounts >> 1;
16869 image_create_info.samples = (VkSampleCountFlagBits)samples;
16870 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16871 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16872 m_errorMonitor->VerifyFound();
16873 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16874
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16876 "pCreateInfo->initialLayout, must be "
16877 "VK_IMAGE_LAYOUT_UNDEFINED or "
16878 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016879 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16880 // Expect INVALID_LAYOUT
16881 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16882 m_errorMonitor->VerifyFound();
16883 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16884}
16885
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016886TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016887 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016889
Tony Barbour1fa09702017-03-16 12:09:08 -060016890 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016891
16892 VkImageObj src_image(m_device);
16893 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16894 VkImageObj dst_image(m_device);
16895 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16896
Tony Barbour552f6c02016-12-21 14:34:07 -070016897 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016898 VkImageCopy copy_region;
16899 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16900 copy_region.srcSubresource.mipLevel = 0;
16901 copy_region.srcSubresource.baseArrayLayer = 0;
16902 copy_region.srcSubresource.layerCount = 0;
16903 copy_region.srcOffset.x = 0;
16904 copy_region.srcOffset.y = 0;
16905 copy_region.srcOffset.z = 0;
16906 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16907 copy_region.dstSubresource.mipLevel = 0;
16908 copy_region.dstSubresource.baseArrayLayer = 0;
16909 copy_region.dstSubresource.layerCount = 0;
16910 copy_region.dstOffset.x = 0;
16911 copy_region.dstOffset.y = 0;
16912 copy_region.dstOffset.z = 0;
16913 copy_region.extent.width = 64;
16914 copy_region.extent.height = 64;
16915 copy_region.extent.depth = 1;
16916 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16917 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016918 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016919
16920 m_errorMonitor->VerifyFound();
16921}
16922
16923TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016924 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016926
Tony Barbour1fa09702017-03-16 12:09:08 -060016927 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016928
16929 VkImageObj src_image(m_device);
16930 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16931 VkImageObj dst_image(m_device);
16932 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16933
Tony Barbour552f6c02016-12-21 14:34:07 -070016934 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016935 VkImageCopy copy_region;
16936 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16937 copy_region.srcSubresource.mipLevel = 0;
16938 copy_region.srcSubresource.baseArrayLayer = 0;
16939 copy_region.srcSubresource.layerCount = 0;
16940 copy_region.srcOffset.x = 0;
16941 copy_region.srcOffset.y = 0;
16942 copy_region.srcOffset.z = 0;
16943 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16944 copy_region.dstSubresource.mipLevel = 0;
16945 copy_region.dstSubresource.baseArrayLayer = 0;
16946 copy_region.dstSubresource.layerCount = 0;
16947 copy_region.dstOffset.x = 0;
16948 copy_region.dstOffset.y = 0;
16949 copy_region.dstOffset.z = 0;
16950 copy_region.extent.width = 64;
16951 copy_region.extent.height = 64;
16952 copy_region.extent.depth = 1;
16953 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16954 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016955 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016956
16957 m_errorMonitor->VerifyFound();
16958}
16959
Karl Schultz6addd812016-02-02 17:17:23 -070016960TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016961 VkResult err;
16962 bool pass;
16963
16964 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016966
Tony Barbour1fa09702017-03-16 12:09:08 -060016967 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016968
16969 // Create two images of different types and try to copy between them
16970 VkImage srcImage;
16971 VkImage dstImage;
16972 VkDeviceMemory srcMem;
16973 VkDeviceMemory destMem;
16974 VkMemoryRequirements memReqs;
16975
16976 VkImageCreateInfo image_create_info = {};
16977 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16978 image_create_info.pNext = NULL;
16979 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16980 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16981 image_create_info.extent.width = 32;
16982 image_create_info.extent.height = 32;
16983 image_create_info.extent.depth = 1;
16984 image_create_info.mipLevels = 1;
16985 image_create_info.arrayLayers = 1;
16986 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16987 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16988 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16989 image_create_info.flags = 0;
16990
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016992 ASSERT_VK_SUCCESS(err);
16993
16994 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16995 // Introduce failure by creating second image with a different-sized format.
16996 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
16997
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016998 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016999 ASSERT_VK_SUCCESS(err);
17000
17001 // Allocate memory
17002 VkMemoryAllocateInfo memAlloc = {};
17003 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17004 memAlloc.pNext = NULL;
17005 memAlloc.allocationSize = 0;
17006 memAlloc.memoryTypeIndex = 0;
17007
17008 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17009 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017010 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017011 ASSERT_TRUE(pass);
17012 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17013 ASSERT_VK_SUCCESS(err);
17014
17015 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17016 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017017 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017018 ASSERT_TRUE(pass);
17019 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17020 ASSERT_VK_SUCCESS(err);
17021
17022 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17023 ASSERT_VK_SUCCESS(err);
17024 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17025 ASSERT_VK_SUCCESS(err);
17026
Tony Barbour552f6c02016-12-21 14:34:07 -070017027 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017028 VkImageCopy copyRegion;
17029 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17030 copyRegion.srcSubresource.mipLevel = 0;
17031 copyRegion.srcSubresource.baseArrayLayer = 0;
17032 copyRegion.srcSubresource.layerCount = 0;
17033 copyRegion.srcOffset.x = 0;
17034 copyRegion.srcOffset.y = 0;
17035 copyRegion.srcOffset.z = 0;
17036 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17037 copyRegion.dstSubresource.mipLevel = 0;
17038 copyRegion.dstSubresource.baseArrayLayer = 0;
17039 copyRegion.dstSubresource.layerCount = 0;
17040 copyRegion.dstOffset.x = 0;
17041 copyRegion.dstOffset.y = 0;
17042 copyRegion.dstOffset.z = 0;
17043 copyRegion.extent.width = 1;
17044 copyRegion.extent.height = 1;
17045 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017046 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017047 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017048
17049 m_errorMonitor->VerifyFound();
17050
17051 vkDestroyImage(m_device->device(), srcImage, NULL);
17052 vkDestroyImage(m_device->device(), dstImage, NULL);
17053 vkFreeMemory(m_device->device(), srcMem, NULL);
17054 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017055}
17056
Karl Schultz6addd812016-02-02 17:17:23 -070017057TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17058 VkResult err;
17059 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017060
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017061 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17063 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017064
Tony Barbour1fa09702017-03-16 12:09:08 -060017065 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017066 auto depth_format = find_depth_stencil_format(m_device);
17067 if (!depth_format) {
17068 return;
17069 }
Mike Stroyana3082432015-09-25 13:39:21 -060017070
17071 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017072 VkImage srcImage;
17073 VkImage dstImage;
17074 VkDeviceMemory srcMem;
17075 VkDeviceMemory destMem;
17076 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017077
17078 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017079 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17080 image_create_info.pNext = NULL;
17081 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017082 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017083 image_create_info.extent.width = 32;
17084 image_create_info.extent.height = 32;
17085 image_create_info.extent.depth = 1;
17086 image_create_info.mipLevels = 1;
17087 image_create_info.arrayLayers = 1;
17088 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17089 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17090 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17091 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017092
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017093 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017094 ASSERT_VK_SUCCESS(err);
17095
Karl Schultzbdb75952016-04-19 11:36:49 -060017096 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17097
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017098 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017099 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017100 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017101 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017102
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017103 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017104 ASSERT_VK_SUCCESS(err);
17105
17106 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017107 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017108 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17109 memAlloc.pNext = NULL;
17110 memAlloc.allocationSize = 0;
17111 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017112
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017113 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017114 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017115 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017116 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017117 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017118 ASSERT_VK_SUCCESS(err);
17119
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017120 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017121 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017122 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017123 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017124 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017125 ASSERT_VK_SUCCESS(err);
17126
17127 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17128 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017129 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017130 ASSERT_VK_SUCCESS(err);
17131
Tony Barbour552f6c02016-12-21 14:34:07 -070017132 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017133 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017134 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017135 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017136 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017137 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017138 copyRegion.srcOffset.x = 0;
17139 copyRegion.srcOffset.y = 0;
17140 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017141 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017142 copyRegion.dstSubresource.mipLevel = 0;
17143 copyRegion.dstSubresource.baseArrayLayer = 0;
17144 copyRegion.dstSubresource.layerCount = 0;
17145 copyRegion.dstOffset.x = 0;
17146 copyRegion.dstOffset.y = 0;
17147 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017148 copyRegion.extent.width = 1;
17149 copyRegion.extent.height = 1;
17150 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017151 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017152 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017153
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017154 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017155
Chia-I Wuf7458c52015-10-26 21:10:41 +080017156 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017157 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017158 vkFreeMemory(m_device->device(), srcMem, NULL);
17159 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017160}
17161
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017162TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17163 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017164
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017165 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017166
17167 VkImageFormatProperties image_format_properties;
17168 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17169 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17170 &image_format_properties);
17171
17172 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17173 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17174 printf(" Image multi-sample support not found; skipped.\n");
17175 return;
17176 }
17177
17178 VkImageCreateInfo ci;
17179 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17180 ci.pNext = NULL;
17181 ci.flags = 0;
17182 ci.imageType = VK_IMAGE_TYPE_2D;
17183 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17184 ci.extent = {128, 128, 1};
17185 ci.mipLevels = 1;
17186 ci.arrayLayers = 1;
17187 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17188 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17189 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17190 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17191 ci.queueFamilyIndexCount = 0;
17192 ci.pQueueFamilyIndices = NULL;
17193 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17194
17195 VkImageObj image1(m_device);
17196 image1.init(&ci);
17197 ASSERT_TRUE(image1.initialized());
17198
17199 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17200 VkImageObj image2(m_device);
17201 image2.init(&ci);
17202 ASSERT_TRUE(image2.initialized());
17203
17204 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17205 VkImageObj image4(m_device);
17206 image4.init(&ci);
17207 ASSERT_TRUE(image4.initialized());
17208
17209 m_commandBuffer->BeginCommandBuffer();
17210
17211 VkImageCopy copyRegion;
17212 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17213 copyRegion.srcSubresource.mipLevel = 0;
17214 copyRegion.srcSubresource.baseArrayLayer = 0;
17215 copyRegion.srcSubresource.layerCount = 1;
17216 copyRegion.srcOffset = {0, 0, 0};
17217 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17218 copyRegion.dstSubresource.mipLevel = 0;
17219 copyRegion.dstSubresource.baseArrayLayer = 0;
17220 copyRegion.dstSubresource.layerCount = 1;
17221 copyRegion.dstOffset = {0, 0, 0};
17222 copyRegion.extent = {128, 128, 1};
17223
17224 // Copy a single sample image to/from a multi-sample image
17225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17226 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17227 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17228 m_errorMonitor->VerifyFound();
17229
17230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17231 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17232 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17233 m_errorMonitor->VerifyFound();
17234
17235 // Copy between multi-sample images with different sample counts
17236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17237 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17238 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17239 m_errorMonitor->VerifyFound();
17240
17241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17242 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17243 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17244 m_errorMonitor->VerifyFound();
17245
17246 m_commandBuffer->EndCommandBuffer();
17247}
17248
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017249TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17250 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017251 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017252
17253 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17254 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17255 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17256 ds_image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17257 ASSERT_TRUE(color_image.initialized());
17258 ASSERT_TRUE(depth_image.initialized());
17259 ASSERT_TRUE(ds_image.initialized());
17260
17261 VkImageCopy copyRegion;
17262 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17263 copyRegion.srcSubresource.mipLevel = 0;
17264 copyRegion.srcSubresource.baseArrayLayer = 0;
17265 copyRegion.srcSubresource.layerCount = 1;
17266 copyRegion.srcOffset = {0, 0, 0};
17267 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17268 copyRegion.dstSubresource.mipLevel = 0;
17269 copyRegion.dstSubresource.baseArrayLayer = 0;
17270 copyRegion.dstSubresource.layerCount = 1;
17271 copyRegion.dstOffset = {64, 0, 0};
17272 copyRegion.extent = {64, 128, 1};
17273
17274 // Submitting command before command buffer is in recording state
17275 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You must call vkBeginCommandBuffer");// VALIDATION_ERROR_01192);
17276 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17277 m_errorMonitor->VerifyFound();
17278
17279 m_commandBuffer->BeginCommandBuffer();
17280
17281 // Src and dest aspect masks don't match
17282 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
17284 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17285 m_errorMonitor->VerifyFound();
17286 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17287
17288 // Illegal combinations of aspect bits - VU 01221
17289 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
17290 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17292 // These aspect/format mismatches are redundant but unavoidable here
17293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17295 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17296 m_errorMonitor->VerifyFound();
17297 // Metadata aspect is illegal - VU 01222
17298 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17299 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17301 // These aspect/format mismatches are redundant but unavoidable here
17302 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17303 m_errorMonitor->VerifyFound();
17304
17305 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17306 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17307
17308 // Aspect mask doesn't match source image format - VU 01200
17309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17310 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17312 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17313 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17314 m_errorMonitor->VerifyFound();
17315
17316 // Aspect mask doesn't match dest image format - VU 01201
17317 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17318 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17320 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17322 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17323 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17324 m_errorMonitor->VerifyFound();
17325
17326 m_commandBuffer->EndCommandBuffer();
17327}
17328
Karl Schultz6addd812016-02-02 17:17:23 -070017329TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17330 VkResult err;
17331 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017332
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17334 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017335
Tony Barbour1fa09702017-03-16 12:09:08 -060017336 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017337
17338 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017339 VkImage srcImage;
17340 VkImage dstImage;
17341 VkDeviceMemory srcMem;
17342 VkDeviceMemory destMem;
17343 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017344
17345 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017346 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17347 image_create_info.pNext = NULL;
17348 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17349 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17350 image_create_info.extent.width = 32;
17351 image_create_info.extent.height = 1;
17352 image_create_info.extent.depth = 1;
17353 image_create_info.mipLevels = 1;
17354 image_create_info.arrayLayers = 1;
17355 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17356 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17357 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17358 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017359
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017360 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017361 ASSERT_VK_SUCCESS(err);
17362
Karl Schultz6addd812016-02-02 17:17:23 -070017363 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017364
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017365 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017366 ASSERT_VK_SUCCESS(err);
17367
17368 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017369 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017370 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17371 memAlloc.pNext = NULL;
17372 memAlloc.allocationSize = 0;
17373 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017374
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017375 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017376 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017377 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017378 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017379 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017380 ASSERT_VK_SUCCESS(err);
17381
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017382 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017383 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017384 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017385 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017386 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017387 ASSERT_VK_SUCCESS(err);
17388
17389 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17390 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017391 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017392 ASSERT_VK_SUCCESS(err);
17393
Tony Barbour552f6c02016-12-21 14:34:07 -070017394 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017395 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017396 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17397 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017398 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017399 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017400 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017401 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017402 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017403 resolveRegion.srcOffset.x = 0;
17404 resolveRegion.srcOffset.y = 0;
17405 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017406 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017407 resolveRegion.dstSubresource.mipLevel = 0;
17408 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017409 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017410 resolveRegion.dstOffset.x = 0;
17411 resolveRegion.dstOffset.y = 0;
17412 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017413 resolveRegion.extent.width = 1;
17414 resolveRegion.extent.height = 1;
17415 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017416 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017417 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017418
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017419 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017420
Chia-I Wuf7458c52015-10-26 21:10:41 +080017421 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017422 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017423 vkFreeMemory(m_device->device(), srcMem, NULL);
17424 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017425}
17426
Karl Schultz6addd812016-02-02 17:17:23 -070017427TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17428 VkResult err;
17429 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017430
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17432 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017433
Tony Barbour1fa09702017-03-16 12:09:08 -060017434 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017435
Chris Forbesa7530692016-05-08 12:35:39 +120017436 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017437 VkImage srcImage;
17438 VkImage dstImage;
17439 VkDeviceMemory srcMem;
17440 VkDeviceMemory destMem;
17441 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017442
17443 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017444 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17445 image_create_info.pNext = NULL;
17446 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17447 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17448 image_create_info.extent.width = 32;
17449 image_create_info.extent.height = 1;
17450 image_create_info.extent.depth = 1;
17451 image_create_info.mipLevels = 1;
17452 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017453 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017454 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17455 // Note: Some implementations expect color attachment usage for any
17456 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017457 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017458 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017459
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017460 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017461 ASSERT_VK_SUCCESS(err);
17462
Karl Schultz6addd812016-02-02 17:17:23 -070017463 // 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_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017466
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017467 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017468 ASSERT_VK_SUCCESS(err);
17469
17470 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017471 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017472 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17473 memAlloc.pNext = NULL;
17474 memAlloc.allocationSize = 0;
17475 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017476
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017477 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017478 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017479 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017480 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017481 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017482 ASSERT_VK_SUCCESS(err);
17483
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017484 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017485 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017486 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017487 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017488 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017489 ASSERT_VK_SUCCESS(err);
17490
17491 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17492 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017493 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017494 ASSERT_VK_SUCCESS(err);
17495
Tony Barbour552f6c02016-12-21 14:34:07 -070017496 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017497 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017498 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17499 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017500 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017501 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017502 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017503 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017504 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017505 resolveRegion.srcOffset.x = 0;
17506 resolveRegion.srcOffset.y = 0;
17507 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017508 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017509 resolveRegion.dstSubresource.mipLevel = 0;
17510 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017511 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017512 resolveRegion.dstOffset.x = 0;
17513 resolveRegion.dstOffset.y = 0;
17514 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017515 resolveRegion.extent.width = 1;
17516 resolveRegion.extent.height = 1;
17517 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017518 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017519 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017520
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017521 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017522
Chia-I Wuf7458c52015-10-26 21:10:41 +080017523 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017524 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017525 vkFreeMemory(m_device->device(), srcMem, NULL);
17526 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017527}
17528
Karl Schultz6addd812016-02-02 17:17:23 -070017529TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17530 VkResult err;
17531 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017532
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017534 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017535
Tony Barbour1fa09702017-03-16 12:09:08 -060017536 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017537
17538 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017539 VkImage srcImage;
17540 VkImage dstImage;
17541 VkDeviceMemory srcMem;
17542 VkDeviceMemory destMem;
17543 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017544
17545 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017546 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17547 image_create_info.pNext = NULL;
17548 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17549 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17550 image_create_info.extent.width = 32;
17551 image_create_info.extent.height = 1;
17552 image_create_info.extent.depth = 1;
17553 image_create_info.mipLevels = 1;
17554 image_create_info.arrayLayers = 1;
17555 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17556 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17557 // Note: Some implementations expect color attachment usage for any
17558 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017559 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017560 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017561
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017562 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017563 ASSERT_VK_SUCCESS(err);
17564
Karl Schultz6addd812016-02-02 17:17:23 -070017565 // Set format to something other than source image
17566 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17567 // Note: Some implementations expect color attachment usage for any
17568 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017569 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017570 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017571
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017572 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017573 ASSERT_VK_SUCCESS(err);
17574
17575 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017576 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017577 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17578 memAlloc.pNext = NULL;
17579 memAlloc.allocationSize = 0;
17580 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017581
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017582 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017583 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017584 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017585 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017586 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017587 ASSERT_VK_SUCCESS(err);
17588
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017589 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017590 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017591 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017592 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017593 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017594 ASSERT_VK_SUCCESS(err);
17595
17596 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17597 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017598 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017599 ASSERT_VK_SUCCESS(err);
17600
Tony Barbour552f6c02016-12-21 14:34:07 -070017601 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017602 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017603 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17604 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017605 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017606 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017607 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017608 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017609 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017610 resolveRegion.srcOffset.x = 0;
17611 resolveRegion.srcOffset.y = 0;
17612 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017613 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017614 resolveRegion.dstSubresource.mipLevel = 0;
17615 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017616 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017617 resolveRegion.dstOffset.x = 0;
17618 resolveRegion.dstOffset.y = 0;
17619 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017620 resolveRegion.extent.width = 1;
17621 resolveRegion.extent.height = 1;
17622 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017623 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017624 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017625
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017626 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017627
Chia-I Wuf7458c52015-10-26 21:10:41 +080017628 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017629 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017630 vkFreeMemory(m_device->device(), srcMem, NULL);
17631 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017632}
17633
Karl Schultz6addd812016-02-02 17:17:23 -070017634TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17635 VkResult err;
17636 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017637
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017639 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017640
Tony Barbour1fa09702017-03-16 12:09:08 -060017641 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017642
17643 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017644 VkImage srcImage;
17645 VkImage dstImage;
17646 VkDeviceMemory srcMem;
17647 VkDeviceMemory destMem;
17648 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017649
17650 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017651 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17652 image_create_info.pNext = NULL;
17653 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17654 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17655 image_create_info.extent.width = 32;
17656 image_create_info.extent.height = 1;
17657 image_create_info.extent.depth = 1;
17658 image_create_info.mipLevels = 1;
17659 image_create_info.arrayLayers = 1;
17660 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17661 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17662 // Note: Some implementations expect color attachment usage for any
17663 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017664 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017665 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017666
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017667 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017668 ASSERT_VK_SUCCESS(err);
17669
Karl Schultz6addd812016-02-02 17:17:23 -070017670 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17671 // Note: Some implementations expect color attachment usage for any
17672 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017673 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017674 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017675
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017676 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017677 ASSERT_VK_SUCCESS(err);
17678
17679 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017680 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017681 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17682 memAlloc.pNext = NULL;
17683 memAlloc.allocationSize = 0;
17684 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017685
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017686 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017687 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017688 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017689 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017690 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017691 ASSERT_VK_SUCCESS(err);
17692
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017693 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017694 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017695 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017696 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017697 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017698 ASSERT_VK_SUCCESS(err);
17699
17700 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17701 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017702 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017703 ASSERT_VK_SUCCESS(err);
17704
Tony Barbour552f6c02016-12-21 14:34:07 -070017705 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017706 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017707 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17708 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017709 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017710 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017711 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017712 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017713 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017714 resolveRegion.srcOffset.x = 0;
17715 resolveRegion.srcOffset.y = 0;
17716 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017717 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017718 resolveRegion.dstSubresource.mipLevel = 0;
17719 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017720 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017721 resolveRegion.dstOffset.x = 0;
17722 resolveRegion.dstOffset.y = 0;
17723 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017724 resolveRegion.extent.width = 1;
17725 resolveRegion.extent.height = 1;
17726 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017727 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017728 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017729
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017730 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017731
Chia-I Wuf7458c52015-10-26 21:10:41 +080017732 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017733 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017734 vkFreeMemory(m_device->device(), srcMem, NULL);
17735 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017736}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017737
Karl Schultz6addd812016-02-02 17:17:23 -070017738TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017739 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017740 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17741 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017742 // The image format check comes 2nd in validation so we trigger it first,
17743 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017744 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017745
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017746 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17747 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017748
Tony Barbour1fa09702017-03-16 12:09:08 -060017749 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017750 auto depth_format = find_depth_stencil_format(m_device);
17751 if (!depth_format) {
17752 return;
17753 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017754
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017755 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017756 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17757 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017758
17759 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017760 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17761 ds_pool_ci.pNext = NULL;
17762 ds_pool_ci.maxSets = 1;
17763 ds_pool_ci.poolSizeCount = 1;
17764 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017765
17766 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017767 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017768 ASSERT_VK_SUCCESS(err);
17769
17770 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017771 dsl_binding.binding = 0;
17772 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17773 dsl_binding.descriptorCount = 1;
17774 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17775 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017776
17777 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017778 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17779 ds_layout_ci.pNext = NULL;
17780 ds_layout_ci.bindingCount = 1;
17781 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017782 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017783 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017784 ASSERT_VK_SUCCESS(err);
17785
17786 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017787 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017788 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017789 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017790 alloc_info.descriptorPool = ds_pool;
17791 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017792 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017793 ASSERT_VK_SUCCESS(err);
17794
Karl Schultz6addd812016-02-02 17:17:23 -070017795 VkImage image_bad;
17796 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017797 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017798 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017799 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017800 const int32_t tex_width = 32;
17801 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017802
17803 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017804 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17805 image_create_info.pNext = NULL;
17806 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17807 image_create_info.format = tex_format_bad;
17808 image_create_info.extent.width = tex_width;
17809 image_create_info.extent.height = tex_height;
17810 image_create_info.extent.depth = 1;
17811 image_create_info.mipLevels = 1;
17812 image_create_info.arrayLayers = 1;
17813 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17814 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017815 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017816 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017817
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017818 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017819 ASSERT_VK_SUCCESS(err);
17820 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017821 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17822 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017823 ASSERT_VK_SUCCESS(err);
17824
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017825 // ---Bind image memory---
17826 VkMemoryRequirements img_mem_reqs;
17827 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17828 VkMemoryAllocateInfo image_alloc_info = {};
17829 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17830 image_alloc_info.pNext = NULL;
17831 image_alloc_info.memoryTypeIndex = 0;
17832 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017833 bool pass =
17834 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 -070017835 ASSERT_TRUE(pass);
17836 VkDeviceMemory mem;
17837 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17838 ASSERT_VK_SUCCESS(err);
17839 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17840 ASSERT_VK_SUCCESS(err);
17841 // -----------------------
17842
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017843 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017844 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017845 image_view_create_info.image = image_bad;
17846 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17847 image_view_create_info.format = tex_format_bad;
17848 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17849 image_view_create_info.subresourceRange.baseMipLevel = 0;
17850 image_view_create_info.subresourceRange.layerCount = 1;
17851 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017852 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017853
17854 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017855 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017856
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017857 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017858
Chia-I Wuf7458c52015-10-26 21:10:41 +080017859 vkDestroyImage(m_device->device(), image_bad, NULL);
17860 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017861 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17862 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017863
17864 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017865}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017866
17867TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017868 TEST_DESCRIPTION(
17869 "Call ClearColorImage w/ a depth|stencil image and "
17870 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017871
Tony Barbour1fa09702017-03-16 12:09:08 -060017872 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017873 auto depth_format = find_depth_stencil_format(m_device);
17874 if (!depth_format) {
17875 return;
17876 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017877 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17878
Tony Barbour552f6c02016-12-21 14:34:07 -070017879 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017880
17881 // Color image
17882 VkClearColorValue clear_color;
17883 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17884 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17885 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17886 const int32_t img_width = 32;
17887 const int32_t img_height = 32;
17888 VkImageCreateInfo image_create_info = {};
17889 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17890 image_create_info.pNext = NULL;
17891 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17892 image_create_info.format = color_format;
17893 image_create_info.extent.width = img_width;
17894 image_create_info.extent.height = img_height;
17895 image_create_info.extent.depth = 1;
17896 image_create_info.mipLevels = 1;
17897 image_create_info.arrayLayers = 1;
17898 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17899 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17900 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17901
17902 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017903 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017904
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017905 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017906
17907 // Depth/Stencil image
17908 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017909 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017910 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17911 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017912 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017913 ds_image_create_info.extent.width = 64;
17914 ds_image_create_info.extent.height = 64;
17915 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017916 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 -060017917
17918 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017919 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017920
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017921 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 -060017922
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017924
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017925 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017926 &color_range);
17927
17928 m_errorMonitor->VerifyFound();
17929
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17931 "vkCmdClearColorImage called with "
17932 "image created without "
17933 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017934
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017935 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017936 &color_range);
17937
17938 m_errorMonitor->VerifyFound();
17939
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017940 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017941 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17942 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017943
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017944 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17945 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017946
17947 m_errorMonitor->VerifyFound();
17948}
Tobin Ehliscde08892015-09-22 10:11:37 -060017949
Mike Schuchardt35fece12017-03-07 14:40:28 -070017950TEST_F(VkLayerTest, CommandQueueFlags) {
17951 TEST_DESCRIPTION(
17952 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17953 "graphics-only command");
17954
17955 ASSERT_NO_FATAL_FAILURE(Init());
17956
17957 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
17958 if(queueFamilyIndex == UINT32_MAX) {
17959 printf(" Non-graphics queue family not found; skipped.\n");
17960 return;
17961 } else {
17962 // Create command pool on a non-graphics queue
17963 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17964
17965 // Setup command buffer on pool
17966 VkCommandBufferObj command_buffer(m_device, &command_pool);
17967 command_buffer.BeginCommandBuffer();
17968
17969 // Issue a graphics only command
17970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17971 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17972 command_buffer.SetViewport(0, 1, &viewport);
17973 m_errorMonitor->VerifyFound();
17974 }
17975}
17976
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017977// WSI Enabled Tests
17978//
Chris Forbes09368e42016-10-13 11:59:22 +130017979#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017980TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17981
17982#if defined(VK_USE_PLATFORM_XCB_KHR)
17983 VkSurfaceKHR surface = VK_NULL_HANDLE;
17984
17985 VkResult err;
17986 bool pass;
17987 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17988 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17989 // uint32_t swapchain_image_count = 0;
17990 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17991 // uint32_t image_index = 0;
17992 // VkPresentInfoKHR present_info = {};
17993
Tony Barbour1fa09702017-03-16 12:09:08 -060017994 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017995
17996 // Use the create function from one of the VK_KHR_*_surface extension in
17997 // order to create a surface, testing all known errors in the process,
17998 // before successfully creating a surface:
17999 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18000 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18001 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18002 pass = (err != VK_SUCCESS);
18003 ASSERT_TRUE(pass);
18004 m_errorMonitor->VerifyFound();
18005
18006 // Next, try to create a surface with the wrong
18007 // VkXcbSurfaceCreateInfoKHR::sType:
18008 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18009 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18011 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18012 pass = (err != VK_SUCCESS);
18013 ASSERT_TRUE(pass);
18014 m_errorMonitor->VerifyFound();
18015
18016 // Create a native window, and then correctly create a surface:
18017 xcb_connection_t *connection;
18018 xcb_screen_t *screen;
18019 xcb_window_t xcb_window;
18020 xcb_intern_atom_reply_t *atom_wm_delete_window;
18021
18022 const xcb_setup_t *setup;
18023 xcb_screen_iterator_t iter;
18024 int scr;
18025 uint32_t value_mask, value_list[32];
18026 int width = 1;
18027 int height = 1;
18028
18029 connection = xcb_connect(NULL, &scr);
18030 ASSERT_TRUE(connection != NULL);
18031 setup = xcb_get_setup(connection);
18032 iter = xcb_setup_roots_iterator(setup);
18033 while (scr-- > 0)
18034 xcb_screen_next(&iter);
18035 screen = iter.data;
18036
18037 xcb_window = xcb_generate_id(connection);
18038
18039 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18040 value_list[0] = screen->black_pixel;
18041 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18042
18043 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18044 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18045
18046 /* Magic code that will send notification when window is destroyed */
18047 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18048 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18049
18050 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18051 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18052 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18053 free(reply);
18054
18055 xcb_map_window(connection, xcb_window);
18056
18057 // Force the x/y coordinates to 100,100 results are identical in consecutive
18058 // runs
18059 const uint32_t coords[] = { 100, 100 };
18060 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18061
18062 // Finally, try to correctly create a surface:
18063 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18064 xcb_create_info.pNext = NULL;
18065 xcb_create_info.flags = 0;
18066 xcb_create_info.connection = connection;
18067 xcb_create_info.window = xcb_window;
18068 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18069 pass = (err == VK_SUCCESS);
18070 ASSERT_TRUE(pass);
18071
18072 // Check if surface supports presentation:
18073
18074 // 1st, do so without having queried the queue families:
18075 VkBool32 supported = false;
18076 // TODO: Get the following error to come out:
18077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18078 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18079 "function");
18080 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18081 pass = (err != VK_SUCCESS);
18082 // ASSERT_TRUE(pass);
18083 // m_errorMonitor->VerifyFound();
18084
18085 // Next, query a queue family index that's too large:
18086 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18087 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18088 pass = (err != VK_SUCCESS);
18089 ASSERT_TRUE(pass);
18090 m_errorMonitor->VerifyFound();
18091
18092 // Finally, do so correctly:
18093 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18094 // SUPPORTED
18095 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18096 pass = (err == VK_SUCCESS);
18097 ASSERT_TRUE(pass);
18098
18099 // Before proceeding, try to create a swapchain without having called
18100 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18101 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18102 swapchain_create_info.pNext = NULL;
18103 swapchain_create_info.flags = 0;
18104 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18105 swapchain_create_info.surface = surface;
18106 swapchain_create_info.imageArrayLayers = 1;
18107 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18108 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18109 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18110 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18111 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18112 pass = (err != VK_SUCCESS);
18113 ASSERT_TRUE(pass);
18114 m_errorMonitor->VerifyFound();
18115
18116 // Get the surface capabilities:
18117 VkSurfaceCapabilitiesKHR surface_capabilities;
18118
18119 // Do so correctly (only error logged by this entrypoint is if the
18120 // extension isn't enabled):
18121 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18122 pass = (err == VK_SUCCESS);
18123 ASSERT_TRUE(pass);
18124
18125 // Get the surface formats:
18126 uint32_t surface_format_count;
18127
18128 // First, try without a pointer to surface_format_count:
18129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18130 "specified as NULL");
18131 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18132 pass = (err == VK_SUCCESS);
18133 ASSERT_TRUE(pass);
18134 m_errorMonitor->VerifyFound();
18135
18136 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18137 // correctly done a 1st try (to get the count):
18138 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18139 surface_format_count = 0;
18140 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18141 pass = (err == VK_SUCCESS);
18142 ASSERT_TRUE(pass);
18143 m_errorMonitor->VerifyFound();
18144
18145 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18146 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18147 pass = (err == VK_SUCCESS);
18148 ASSERT_TRUE(pass);
18149
18150 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18151 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18152
18153 // Next, do a 2nd try with surface_format_count being set too high:
18154 surface_format_count += 5;
18155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18156 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18157 pass = (err == VK_SUCCESS);
18158 ASSERT_TRUE(pass);
18159 m_errorMonitor->VerifyFound();
18160
18161 // Finally, do a correct 1st and 2nd try:
18162 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18163 pass = (err == VK_SUCCESS);
18164 ASSERT_TRUE(pass);
18165 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18166 pass = (err == VK_SUCCESS);
18167 ASSERT_TRUE(pass);
18168
18169 // Get the surface present modes:
18170 uint32_t surface_present_mode_count;
18171
18172 // First, try without a pointer to surface_format_count:
18173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18174 "specified as NULL");
18175
18176 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18177 pass = (err == VK_SUCCESS);
18178 ASSERT_TRUE(pass);
18179 m_errorMonitor->VerifyFound();
18180
18181 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18182 // correctly done a 1st try (to get the count):
18183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18184 surface_present_mode_count = 0;
18185 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18186 (VkPresentModeKHR *)&surface_present_mode_count);
18187 pass = (err == VK_SUCCESS);
18188 ASSERT_TRUE(pass);
18189 m_errorMonitor->VerifyFound();
18190
18191 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18192 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18193 pass = (err == VK_SUCCESS);
18194 ASSERT_TRUE(pass);
18195
18196 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18197 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18198
18199 // Next, do a 2nd try with surface_format_count being set too high:
18200 surface_present_mode_count += 5;
18201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18202 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18203 pass = (err == VK_SUCCESS);
18204 ASSERT_TRUE(pass);
18205 m_errorMonitor->VerifyFound();
18206
18207 // Finally, do a correct 1st and 2nd try:
18208 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18209 pass = (err == VK_SUCCESS);
18210 ASSERT_TRUE(pass);
18211 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18212 pass = (err == VK_SUCCESS);
18213 ASSERT_TRUE(pass);
18214
18215 // Create a swapchain:
18216
18217 // First, try without a pointer to swapchain_create_info:
18218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18219 "specified as NULL");
18220
18221 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18222 pass = (err != VK_SUCCESS);
18223 ASSERT_TRUE(pass);
18224 m_errorMonitor->VerifyFound();
18225
18226 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18227 // sType:
18228 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18230
18231 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18232 pass = (err != VK_SUCCESS);
18233 ASSERT_TRUE(pass);
18234 m_errorMonitor->VerifyFound();
18235
18236 // Next, call with a NULL swapchain pointer:
18237 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18238 swapchain_create_info.pNext = NULL;
18239 swapchain_create_info.flags = 0;
18240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18241 "specified as NULL");
18242
18243 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18244 pass = (err != VK_SUCCESS);
18245 ASSERT_TRUE(pass);
18246 m_errorMonitor->VerifyFound();
18247
18248 // TODO: Enhance swapchain layer so that
18249 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18250
18251 // Next, call with a queue family index that's too large:
18252 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18253 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18254 swapchain_create_info.queueFamilyIndexCount = 2;
18255 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18256 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18257 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18258 pass = (err != VK_SUCCESS);
18259 ASSERT_TRUE(pass);
18260 m_errorMonitor->VerifyFound();
18261
18262 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18263 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18264 swapchain_create_info.queueFamilyIndexCount = 1;
18265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18266 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18267 "pCreateInfo->pQueueFamilyIndices).");
18268 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18269 pass = (err != VK_SUCCESS);
18270 ASSERT_TRUE(pass);
18271 m_errorMonitor->VerifyFound();
18272
18273 // Next, call with an invalid imageSharingMode:
18274 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18275 swapchain_create_info.queueFamilyIndexCount = 1;
18276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18277 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18278 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18279 pass = (err != VK_SUCCESS);
18280 ASSERT_TRUE(pass);
18281 m_errorMonitor->VerifyFound();
18282 // Fix for the future:
18283 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18284 // SUPPORTED
18285 swapchain_create_info.queueFamilyIndexCount = 0;
18286 queueFamilyIndex[0] = 0;
18287 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18288
18289 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18290 // Get the images from a swapchain:
18291 // Acquire an image from a swapchain:
18292 // Present an image to a swapchain:
18293 // Destroy the swapchain:
18294
18295 // TODOs:
18296 //
18297 // - Try destroying the device without first destroying the swapchain
18298 //
18299 // - Try destroying the device without first destroying the surface
18300 //
18301 // - Try destroying the surface without first destroying the swapchain
18302
18303 // Destroy the surface:
18304 vkDestroySurfaceKHR(instance(), surface, NULL);
18305
18306 // Tear down the window:
18307 xcb_destroy_window(connection, xcb_window);
18308 xcb_disconnect(connection);
18309
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018310#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018311 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018312#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018313}
Chris Forbes09368e42016-10-13 11:59:22 +130018314#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018315
18316//
18317// POSITIVE VALIDATION TESTS
18318//
18319// These tests do not expect to encounter ANY validation errors pass only if this is true
18320
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018321TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18322 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018323 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18325
18326 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18327 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018328 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018329 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18330 command_buffer_allocate_info.commandBufferCount = 1;
18331
18332 VkCommandBuffer secondary_command_buffer;
18333 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18334 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18335 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18336 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18337 command_buffer_inheritance_info.renderPass = m_renderPass;
18338 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18339
18340 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18341 command_buffer_begin_info.flags =
18342 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18343 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18344
18345 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18346 VkClearAttachment color_attachment;
18347 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18348 color_attachment.clearValue.color.float32[0] = 0;
18349 color_attachment.clearValue.color.float32[1] = 0;
18350 color_attachment.clearValue.color.float32[2] = 0;
18351 color_attachment.clearValue.color.float32[3] = 0;
18352 color_attachment.colorAttachment = 0;
18353 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18354 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18355}
18356
Tobin Ehlise0006882016-11-03 10:14:28 -060018357TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018358 TEST_DESCRIPTION(
18359 "Perform an image layout transition in a secondary command buffer followed "
18360 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018361 VkResult err;
18362 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018363 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070018364 auto depth_format = find_depth_stencil_format(m_device);
18365 if (!depth_format) {
18366 return;
18367 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18369 // Allocate a secondary and primary cmd buffer
18370 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18371 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018372 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018373 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18374 command_buffer_allocate_info.commandBufferCount = 1;
18375
18376 VkCommandBuffer secondary_command_buffer;
18377 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18378 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18379 VkCommandBuffer primary_command_buffer;
18380 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18381 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18382 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18383 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18384 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18385 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18386 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18387
18388 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18389 ASSERT_VK_SUCCESS(err);
18390 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018391 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 -060018392 ASSERT_TRUE(image.initialized());
18393 VkImageMemoryBarrier img_barrier = {};
18394 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18395 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18396 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18397 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18398 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18399 img_barrier.image = image.handle();
18400 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18401 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18402 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18403 img_barrier.subresourceRange.baseArrayLayer = 0;
18404 img_barrier.subresourceRange.baseMipLevel = 0;
18405 img_barrier.subresourceRange.layerCount = 1;
18406 img_barrier.subresourceRange.levelCount = 1;
18407 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18408 0, nullptr, 1, &img_barrier);
18409 err = vkEndCommandBuffer(secondary_command_buffer);
18410 ASSERT_VK_SUCCESS(err);
18411
18412 // Now update primary cmd buffer to execute secondary and transitions image
18413 command_buffer_begin_info.pInheritanceInfo = nullptr;
18414 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18415 ASSERT_VK_SUCCESS(err);
18416 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18417 VkImageMemoryBarrier img_barrier2 = {};
18418 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18419 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18420 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18421 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18422 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18423 img_barrier2.image = image.handle();
18424 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18425 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18426 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18427 img_barrier2.subresourceRange.baseArrayLayer = 0;
18428 img_barrier2.subresourceRange.baseMipLevel = 0;
18429 img_barrier2.subresourceRange.layerCount = 1;
18430 img_barrier2.subresourceRange.levelCount = 1;
18431 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18432 nullptr, 1, &img_barrier2);
18433 err = vkEndCommandBuffer(primary_command_buffer);
18434 ASSERT_VK_SUCCESS(err);
18435 VkSubmitInfo submit_info = {};
18436 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18437 submit_info.commandBufferCount = 1;
18438 submit_info.pCommandBuffers = &primary_command_buffer;
18439 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18440 ASSERT_VK_SUCCESS(err);
18441 m_errorMonitor->VerifyNotFound();
18442 err = vkDeviceWaitIdle(m_device->device());
18443 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018444 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18445 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018446}
18447
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018448// This is a positive test. No failures are expected.
18449TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018450 TEST_DESCRIPTION(
18451 "Ensure that the vkUpdateDescriptorSets validation code "
18452 "is ignoring VkWriteDescriptorSet members that are not "
18453 "related to the descriptor type specified by "
18454 "VkWriteDescriptorSet::descriptorType. Correct "
18455 "validation behavior will result in the test running to "
18456 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018457
18458 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18459
Tony Barbour1fa09702017-03-16 12:09:08 -060018460 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018461
18462 // Image Case
18463 {
18464 m_errorMonitor->ExpectSuccess();
18465
18466 VkImage image;
18467 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18468 const int32_t tex_width = 32;
18469 const int32_t tex_height = 32;
18470 VkImageCreateInfo image_create_info = {};
18471 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18472 image_create_info.pNext = NULL;
18473 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18474 image_create_info.format = tex_format;
18475 image_create_info.extent.width = tex_width;
18476 image_create_info.extent.height = tex_height;
18477 image_create_info.extent.depth = 1;
18478 image_create_info.mipLevels = 1;
18479 image_create_info.arrayLayers = 1;
18480 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18481 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18482 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18483 image_create_info.flags = 0;
18484 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18485 ASSERT_VK_SUCCESS(err);
18486
18487 VkMemoryRequirements memory_reqs;
18488 VkDeviceMemory image_memory;
18489 bool pass;
18490 VkMemoryAllocateInfo memory_info = {};
18491 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18492 memory_info.pNext = NULL;
18493 memory_info.allocationSize = 0;
18494 memory_info.memoryTypeIndex = 0;
18495 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18496 memory_info.allocationSize = memory_reqs.size;
18497 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18498 ASSERT_TRUE(pass);
18499 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18500 ASSERT_VK_SUCCESS(err);
18501 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18502 ASSERT_VK_SUCCESS(err);
18503
18504 VkImageViewCreateInfo image_view_create_info = {};
18505 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18506 image_view_create_info.image = image;
18507 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18508 image_view_create_info.format = tex_format;
18509 image_view_create_info.subresourceRange.layerCount = 1;
18510 image_view_create_info.subresourceRange.baseMipLevel = 0;
18511 image_view_create_info.subresourceRange.levelCount = 1;
18512 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18513
18514 VkImageView view;
18515 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18516 ASSERT_VK_SUCCESS(err);
18517
18518 VkDescriptorPoolSize ds_type_count = {};
18519 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18520 ds_type_count.descriptorCount = 1;
18521
18522 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18523 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18524 ds_pool_ci.pNext = NULL;
18525 ds_pool_ci.maxSets = 1;
18526 ds_pool_ci.poolSizeCount = 1;
18527 ds_pool_ci.pPoolSizes = &ds_type_count;
18528
18529 VkDescriptorPool ds_pool;
18530 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18531 ASSERT_VK_SUCCESS(err);
18532
18533 VkDescriptorSetLayoutBinding dsl_binding = {};
18534 dsl_binding.binding = 0;
18535 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18536 dsl_binding.descriptorCount = 1;
18537 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18538 dsl_binding.pImmutableSamplers = NULL;
18539
18540 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18541 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18542 ds_layout_ci.pNext = NULL;
18543 ds_layout_ci.bindingCount = 1;
18544 ds_layout_ci.pBindings = &dsl_binding;
18545 VkDescriptorSetLayout ds_layout;
18546 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18547 ASSERT_VK_SUCCESS(err);
18548
18549 VkDescriptorSet descriptor_set;
18550 VkDescriptorSetAllocateInfo alloc_info = {};
18551 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18552 alloc_info.descriptorSetCount = 1;
18553 alloc_info.descriptorPool = ds_pool;
18554 alloc_info.pSetLayouts = &ds_layout;
18555 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18556 ASSERT_VK_SUCCESS(err);
18557
18558 VkDescriptorImageInfo image_info = {};
18559 image_info.imageView = view;
18560 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18561
18562 VkWriteDescriptorSet descriptor_write;
18563 memset(&descriptor_write, 0, sizeof(descriptor_write));
18564 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18565 descriptor_write.dstSet = descriptor_set;
18566 descriptor_write.dstBinding = 0;
18567 descriptor_write.descriptorCount = 1;
18568 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18569 descriptor_write.pImageInfo = &image_info;
18570
18571 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18572 // be
18573 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18574 // This will most likely produce a crash if the parameter_validation
18575 // layer
18576 // does not correctly ignore pBufferInfo.
18577 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18578 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18579
18580 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18581
18582 m_errorMonitor->VerifyNotFound();
18583
18584 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18585 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18586 vkDestroyImageView(m_device->device(), view, NULL);
18587 vkDestroyImage(m_device->device(), image, NULL);
18588 vkFreeMemory(m_device->device(), image_memory, NULL);
18589 }
18590
18591 // Buffer Case
18592 {
18593 m_errorMonitor->ExpectSuccess();
18594
18595 VkBuffer buffer;
18596 uint32_t queue_family_index = 0;
18597 VkBufferCreateInfo buffer_create_info = {};
18598 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18599 buffer_create_info.size = 1024;
18600 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18601 buffer_create_info.queueFamilyIndexCount = 1;
18602 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18603
18604 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18605 ASSERT_VK_SUCCESS(err);
18606
18607 VkMemoryRequirements memory_reqs;
18608 VkDeviceMemory buffer_memory;
18609 bool pass;
18610 VkMemoryAllocateInfo memory_info = {};
18611 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18612 memory_info.pNext = NULL;
18613 memory_info.allocationSize = 0;
18614 memory_info.memoryTypeIndex = 0;
18615
18616 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18617 memory_info.allocationSize = memory_reqs.size;
18618 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18619 ASSERT_TRUE(pass);
18620
18621 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18622 ASSERT_VK_SUCCESS(err);
18623 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18624 ASSERT_VK_SUCCESS(err);
18625
18626 VkDescriptorPoolSize ds_type_count = {};
18627 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18628 ds_type_count.descriptorCount = 1;
18629
18630 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18631 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18632 ds_pool_ci.pNext = NULL;
18633 ds_pool_ci.maxSets = 1;
18634 ds_pool_ci.poolSizeCount = 1;
18635 ds_pool_ci.pPoolSizes = &ds_type_count;
18636
18637 VkDescriptorPool ds_pool;
18638 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18639 ASSERT_VK_SUCCESS(err);
18640
18641 VkDescriptorSetLayoutBinding dsl_binding = {};
18642 dsl_binding.binding = 0;
18643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18644 dsl_binding.descriptorCount = 1;
18645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18646 dsl_binding.pImmutableSamplers = NULL;
18647
18648 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18649 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18650 ds_layout_ci.pNext = NULL;
18651 ds_layout_ci.bindingCount = 1;
18652 ds_layout_ci.pBindings = &dsl_binding;
18653 VkDescriptorSetLayout ds_layout;
18654 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18655 ASSERT_VK_SUCCESS(err);
18656
18657 VkDescriptorSet descriptor_set;
18658 VkDescriptorSetAllocateInfo alloc_info = {};
18659 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18660 alloc_info.descriptorSetCount = 1;
18661 alloc_info.descriptorPool = ds_pool;
18662 alloc_info.pSetLayouts = &ds_layout;
18663 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18664 ASSERT_VK_SUCCESS(err);
18665
18666 VkDescriptorBufferInfo buffer_info = {};
18667 buffer_info.buffer = buffer;
18668 buffer_info.offset = 0;
18669 buffer_info.range = 1024;
18670
18671 VkWriteDescriptorSet descriptor_write;
18672 memset(&descriptor_write, 0, sizeof(descriptor_write));
18673 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18674 descriptor_write.dstSet = descriptor_set;
18675 descriptor_write.dstBinding = 0;
18676 descriptor_write.descriptorCount = 1;
18677 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18678 descriptor_write.pBufferInfo = &buffer_info;
18679
18680 // Set pImageInfo and pTexelBufferView to invalid values, which should
18681 // be
18682 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18683 // This will most likely produce a crash if the parameter_validation
18684 // layer
18685 // does not correctly ignore pImageInfo.
18686 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18687 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18688
18689 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18690
18691 m_errorMonitor->VerifyNotFound();
18692
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018693 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18694 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18695 vkDestroyBuffer(m_device->device(), buffer, NULL);
18696 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18697 }
18698
18699 // Texel Buffer Case
18700 {
18701 m_errorMonitor->ExpectSuccess();
18702
18703 VkBuffer buffer;
18704 uint32_t queue_family_index = 0;
18705 VkBufferCreateInfo buffer_create_info = {};
18706 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18707 buffer_create_info.size = 1024;
18708 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18709 buffer_create_info.queueFamilyIndexCount = 1;
18710 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18711
18712 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18713 ASSERT_VK_SUCCESS(err);
18714
18715 VkMemoryRequirements memory_reqs;
18716 VkDeviceMemory buffer_memory;
18717 bool pass;
18718 VkMemoryAllocateInfo memory_info = {};
18719 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18720 memory_info.pNext = NULL;
18721 memory_info.allocationSize = 0;
18722 memory_info.memoryTypeIndex = 0;
18723
18724 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18725 memory_info.allocationSize = memory_reqs.size;
18726 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18727 ASSERT_TRUE(pass);
18728
18729 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18730 ASSERT_VK_SUCCESS(err);
18731 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18732 ASSERT_VK_SUCCESS(err);
18733
18734 VkBufferViewCreateInfo buff_view_ci = {};
18735 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18736 buff_view_ci.buffer = buffer;
18737 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18738 buff_view_ci.range = VK_WHOLE_SIZE;
18739 VkBufferView buffer_view;
18740 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18741
18742 VkDescriptorPoolSize ds_type_count = {};
18743 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18744 ds_type_count.descriptorCount = 1;
18745
18746 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18747 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18748 ds_pool_ci.pNext = NULL;
18749 ds_pool_ci.maxSets = 1;
18750 ds_pool_ci.poolSizeCount = 1;
18751 ds_pool_ci.pPoolSizes = &ds_type_count;
18752
18753 VkDescriptorPool ds_pool;
18754 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18755 ASSERT_VK_SUCCESS(err);
18756
18757 VkDescriptorSetLayoutBinding dsl_binding = {};
18758 dsl_binding.binding = 0;
18759 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18760 dsl_binding.descriptorCount = 1;
18761 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18762 dsl_binding.pImmutableSamplers = NULL;
18763
18764 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18765 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18766 ds_layout_ci.pNext = NULL;
18767 ds_layout_ci.bindingCount = 1;
18768 ds_layout_ci.pBindings = &dsl_binding;
18769 VkDescriptorSetLayout ds_layout;
18770 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18771 ASSERT_VK_SUCCESS(err);
18772
18773 VkDescriptorSet descriptor_set;
18774 VkDescriptorSetAllocateInfo alloc_info = {};
18775 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18776 alloc_info.descriptorSetCount = 1;
18777 alloc_info.descriptorPool = ds_pool;
18778 alloc_info.pSetLayouts = &ds_layout;
18779 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18780 ASSERT_VK_SUCCESS(err);
18781
18782 VkWriteDescriptorSet descriptor_write;
18783 memset(&descriptor_write, 0, sizeof(descriptor_write));
18784 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18785 descriptor_write.dstSet = descriptor_set;
18786 descriptor_write.dstBinding = 0;
18787 descriptor_write.descriptorCount = 1;
18788 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18789 descriptor_write.pTexelBufferView = &buffer_view;
18790
18791 // Set pImageInfo and pBufferInfo to invalid values, which should be
18792 // ignored for descriptorType ==
18793 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18794 // This will most likely produce a crash if the parameter_validation
18795 // layer
18796 // does not correctly ignore pImageInfo and pBufferInfo.
18797 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18798 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18799
18800 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18801
18802 m_errorMonitor->VerifyNotFound();
18803
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018804 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18805 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18806 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18807 vkDestroyBuffer(m_device->device(), buffer, NULL);
18808 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18809 }
18810}
18811
Tobin Ehlisf7428442016-10-25 07:58:24 -060018812TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18813 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18814
Tony Barbour1fa09702017-03-16 12:09:08 -060018815 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018816 // Create layout where two binding #s are "1"
18817 static const uint32_t NUM_BINDINGS = 3;
18818 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18819 dsl_binding[0].binding = 1;
18820 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18821 dsl_binding[0].descriptorCount = 1;
18822 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18823 dsl_binding[0].pImmutableSamplers = NULL;
18824 dsl_binding[1].binding = 0;
18825 dsl_binding[1].descriptorCount = 1;
18826 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18827 dsl_binding[1].descriptorCount = 1;
18828 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18829 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018830 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018831 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18832 dsl_binding[2].descriptorCount = 1;
18833 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18834 dsl_binding[2].pImmutableSamplers = NULL;
18835
18836 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18837 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18838 ds_layout_ci.pNext = NULL;
18839 ds_layout_ci.bindingCount = NUM_BINDINGS;
18840 ds_layout_ci.pBindings = dsl_binding;
18841 VkDescriptorSetLayout ds_layout;
18842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18843 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18844 m_errorMonitor->VerifyFound();
18845}
18846
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018847TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018848 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18849
Tony Barbour1fa09702017-03-16 12:09:08 -060018850 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018851
Tony Barbour552f6c02016-12-21 14:34:07 -070018852 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018853
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018854 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18855
18856 {
18857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18858 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18859 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18860 m_errorMonitor->VerifyFound();
18861 }
18862
18863 {
18864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18865 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18866 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18867 m_errorMonitor->VerifyFound();
18868 }
18869
18870 {
18871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18872 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18873 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18874 m_errorMonitor->VerifyFound();
18875 }
18876
18877 {
18878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18879 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18880 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18881 m_errorMonitor->VerifyFound();
18882 }
18883
18884 {
18885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18886 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18887 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18888 m_errorMonitor->VerifyFound();
18889 }
18890
18891 {
18892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18893 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18894 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18895 m_errorMonitor->VerifyFound();
18896 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018897
18898 {
18899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18900 VkRect2D scissor = {{-1, 0}, {16, 16}};
18901 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18902 m_errorMonitor->VerifyFound();
18903 }
18904
18905 {
18906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18907 VkRect2D scissor = {{0, -2}, {16, 16}};
18908 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18909 m_errorMonitor->VerifyFound();
18910 }
18911
18912 {
18913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18914 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18915 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18916 m_errorMonitor->VerifyFound();
18917 }
18918
18919 {
18920 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18921 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18922 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18923 m_errorMonitor->VerifyFound();
18924 }
18925
Tony Barbour552f6c02016-12-21 14:34:07 -070018926 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018927}
18928
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018929// This is a positive test. No failures are expected.
18930TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18931 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18932 VkResult err;
18933
Tony Barbour1fa09702017-03-16 12:09:08 -060018934 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018935 m_errorMonitor->ExpectSuccess();
18936 VkDescriptorPoolSize ds_type_count = {};
18937 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18938 ds_type_count.descriptorCount = 2;
18939
18940 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18941 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18942 ds_pool_ci.pNext = NULL;
18943 ds_pool_ci.maxSets = 1;
18944 ds_pool_ci.poolSizeCount = 1;
18945 ds_pool_ci.pPoolSizes = &ds_type_count;
18946
18947 VkDescriptorPool ds_pool;
18948 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18949 ASSERT_VK_SUCCESS(err);
18950
18951 // Create layout with two uniform buffer descriptors w/ empty binding between them
18952 static const uint32_t NUM_BINDINGS = 3;
18953 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18954 dsl_binding[0].binding = 0;
18955 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18956 dsl_binding[0].descriptorCount = 1;
18957 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18958 dsl_binding[0].pImmutableSamplers = NULL;
18959 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018960 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018961 dsl_binding[2].binding = 2;
18962 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18963 dsl_binding[2].descriptorCount = 1;
18964 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18965 dsl_binding[2].pImmutableSamplers = NULL;
18966
18967 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18968 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18969 ds_layout_ci.pNext = NULL;
18970 ds_layout_ci.bindingCount = NUM_BINDINGS;
18971 ds_layout_ci.pBindings = dsl_binding;
18972 VkDescriptorSetLayout ds_layout;
18973 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18974 ASSERT_VK_SUCCESS(err);
18975
18976 VkDescriptorSet descriptor_set = {};
18977 VkDescriptorSetAllocateInfo alloc_info = {};
18978 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18979 alloc_info.descriptorSetCount = 1;
18980 alloc_info.descriptorPool = ds_pool;
18981 alloc_info.pSetLayouts = &ds_layout;
18982 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18983 ASSERT_VK_SUCCESS(err);
18984
18985 // Create a buffer to be used for update
18986 VkBufferCreateInfo buff_ci = {};
18987 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18988 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18989 buff_ci.size = 256;
18990 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18991 VkBuffer buffer;
18992 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
18993 ASSERT_VK_SUCCESS(err);
18994 // Have to bind memory to buffer before descriptor update
18995 VkMemoryAllocateInfo mem_alloc = {};
18996 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18997 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018998 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018999 mem_alloc.memoryTypeIndex = 0;
19000
19001 VkMemoryRequirements mem_reqs;
19002 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19003 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19004 if (!pass) {
19005 vkDestroyBuffer(m_device->device(), buffer, NULL);
19006 return;
19007 }
19008
19009 VkDeviceMemory mem;
19010 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19011 ASSERT_VK_SUCCESS(err);
19012 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19013 ASSERT_VK_SUCCESS(err);
19014
19015 // Only update the descriptor at binding 2
19016 VkDescriptorBufferInfo buff_info = {};
19017 buff_info.buffer = buffer;
19018 buff_info.offset = 0;
19019 buff_info.range = VK_WHOLE_SIZE;
19020 VkWriteDescriptorSet descriptor_write = {};
19021 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19022 descriptor_write.dstBinding = 2;
19023 descriptor_write.descriptorCount = 1;
19024 descriptor_write.pTexelBufferView = nullptr;
19025 descriptor_write.pBufferInfo = &buff_info;
19026 descriptor_write.pImageInfo = nullptr;
19027 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19028 descriptor_write.dstSet = descriptor_set;
19029
19030 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19031
19032 m_errorMonitor->VerifyNotFound();
19033 // Cleanup
19034 vkFreeMemory(m_device->device(), mem, NULL);
19035 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19036 vkDestroyBuffer(m_device->device(), buffer, NULL);
19037 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19038}
19039
19040// This is a positive test. No failures are expected.
19041TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19042 VkResult err;
19043 bool pass;
19044
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019045 TEST_DESCRIPTION(
19046 "Create a buffer, allocate memory, bind memory, destroy "
19047 "the buffer, create an image, and bind the same memory to "
19048 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019049
19050 m_errorMonitor->ExpectSuccess();
19051
Tony Barbour1fa09702017-03-16 12:09:08 -060019052 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019053
19054 VkBuffer buffer;
19055 VkImage image;
19056 VkDeviceMemory mem;
19057 VkMemoryRequirements mem_reqs;
19058
19059 VkBufferCreateInfo buf_info = {};
19060 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19061 buf_info.pNext = NULL;
19062 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19063 buf_info.size = 256;
19064 buf_info.queueFamilyIndexCount = 0;
19065 buf_info.pQueueFamilyIndices = NULL;
19066 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19067 buf_info.flags = 0;
19068 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19069 ASSERT_VK_SUCCESS(err);
19070
19071 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19072
19073 VkMemoryAllocateInfo alloc_info = {};
19074 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19075 alloc_info.pNext = NULL;
19076 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019077
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019078 // Ensure memory is big enough for both bindings
19079 alloc_info.allocationSize = 0x10000;
19080
19081 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19082 if (!pass) {
19083 vkDestroyBuffer(m_device->device(), buffer, NULL);
19084 return;
19085 }
19086
19087 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19088 ASSERT_VK_SUCCESS(err);
19089
19090 uint8_t *pData;
19091 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19092 ASSERT_VK_SUCCESS(err);
19093
19094 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19095
19096 vkUnmapMemory(m_device->device(), mem);
19097
19098 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19099 ASSERT_VK_SUCCESS(err);
19100
19101 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19102 // memory. In fact, it was never used by the GPU.
19103 // Just be be sure, wait for idle.
19104 vkDestroyBuffer(m_device->device(), buffer, NULL);
19105 vkDeviceWaitIdle(m_device->device());
19106
Tobin Ehlis6a005702016-12-28 15:25:56 -070019107 // Use optimal as some platforms report linear support but then fail image creation
19108 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19109 VkImageFormatProperties image_format_properties;
19110 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19111 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19112 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019113 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019114 vkFreeMemory(m_device->device(), mem, NULL);
19115 return;
19116 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019117 VkImageCreateInfo image_create_info = {};
19118 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19119 image_create_info.pNext = NULL;
19120 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19121 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19122 image_create_info.extent.width = 64;
19123 image_create_info.extent.height = 64;
19124 image_create_info.extent.depth = 1;
19125 image_create_info.mipLevels = 1;
19126 image_create_info.arrayLayers = 1;
19127 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019128 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019129 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19130 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19131 image_create_info.queueFamilyIndexCount = 0;
19132 image_create_info.pQueueFamilyIndices = NULL;
19133 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19134 image_create_info.flags = 0;
19135
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019136 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019137 * to be textures or it will be the staging image if they are not.
19138 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019139 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19140 ASSERT_VK_SUCCESS(err);
19141
19142 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19143
Tobin Ehlis6a005702016-12-28 15:25:56 -070019144 VkMemoryAllocateInfo mem_alloc = {};
19145 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19146 mem_alloc.pNext = NULL;
19147 mem_alloc.allocationSize = 0;
19148 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019149 mem_alloc.allocationSize = mem_reqs.size;
19150
19151 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19152 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019153 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019154 vkDestroyImage(m_device->device(), image, NULL);
19155 return;
19156 }
19157
19158 // VALIDATION FAILURE:
19159 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19160 ASSERT_VK_SUCCESS(err);
19161
19162 m_errorMonitor->VerifyNotFound();
19163
19164 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019165 vkDestroyImage(m_device->device(), image, NULL);
19166}
19167
Tony Barbourab713912017-02-02 14:17:35 -070019168// This is a positive test. No failures are expected.
19169TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19170 VkResult err;
19171
19172 TEST_DESCRIPTION(
19173 "Call all applicable destroy and free routines with NULL"
19174 "handles, expecting no validation errors");
19175
19176 m_errorMonitor->ExpectSuccess();
19177
Tony Barbour1fa09702017-03-16 12:09:08 -060019178 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019179 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19180 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19181 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19182 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19183 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19184 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19185 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19186 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19187 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19188 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19189 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19190 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19191 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19192 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19193 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19194 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19195 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19196 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19197 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19198 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19199
19200 VkCommandPool command_pool;
19201 VkCommandPoolCreateInfo pool_create_info{};
19202 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19203 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19204 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19205 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19206 VkCommandBuffer command_buffers[3] = {};
19207 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19208 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19209 command_buffer_allocate_info.commandPool = command_pool;
19210 command_buffer_allocate_info.commandBufferCount = 1;
19211 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19212 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19213 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19214 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19215
19216 VkDescriptorPoolSize ds_type_count = {};
19217 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19218 ds_type_count.descriptorCount = 1;
19219
19220 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19221 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19222 ds_pool_ci.pNext = NULL;
19223 ds_pool_ci.maxSets = 1;
19224 ds_pool_ci.poolSizeCount = 1;
19225 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19226 ds_pool_ci.pPoolSizes = &ds_type_count;
19227
19228 VkDescriptorPool ds_pool;
19229 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19230 ASSERT_VK_SUCCESS(err);
19231
19232 VkDescriptorSetLayoutBinding dsl_binding = {};
19233 dsl_binding.binding = 2;
19234 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19235 dsl_binding.descriptorCount = 1;
19236 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19237 dsl_binding.pImmutableSamplers = NULL;
19238 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19239 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19240 ds_layout_ci.pNext = NULL;
19241 ds_layout_ci.bindingCount = 1;
19242 ds_layout_ci.pBindings = &dsl_binding;
19243 VkDescriptorSetLayout ds_layout;
19244 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19245 ASSERT_VK_SUCCESS(err);
19246
19247 VkDescriptorSet descriptor_sets[3] = {};
19248 VkDescriptorSetAllocateInfo alloc_info = {};
19249 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19250 alloc_info.descriptorSetCount = 1;
19251 alloc_info.descriptorPool = ds_pool;
19252 alloc_info.pSetLayouts = &ds_layout;
19253 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19254 ASSERT_VK_SUCCESS(err);
19255 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19256 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19257 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19258
19259 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19260
19261 m_errorMonitor->VerifyNotFound();
19262}
19263
Tony Barbour626994c2017-02-08 15:29:37 -070019264TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019265 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019266
19267 m_errorMonitor->ExpectSuccess();
19268
Tony Barbour1fa09702017-03-16 12:09:08 -060019269 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019270 VkCommandBuffer cmd_bufs[4];
19271 VkCommandBufferAllocateInfo alloc_info;
19272 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19273 alloc_info.pNext = NULL;
19274 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019275 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019276 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19277 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19278 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019279 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19280 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19281 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019282 ASSERT_TRUE(image.initialized());
19283 VkCommandBufferBeginInfo cb_binfo;
19284 cb_binfo.pNext = NULL;
19285 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19286 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19287 cb_binfo.flags = 0;
19288 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19289 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19290 VkImageMemoryBarrier img_barrier = {};
19291 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19292 img_barrier.pNext = NULL;
19293 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19294 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19295 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19296 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19297 img_barrier.image = image.handle();
19298 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19299 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19300 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19301 img_barrier.subresourceRange.baseArrayLayer = 0;
19302 img_barrier.subresourceRange.baseMipLevel = 0;
19303 img_barrier.subresourceRange.layerCount = 1;
19304 img_barrier.subresourceRange.levelCount = 1;
19305 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19306 &img_barrier);
19307 vkEndCommandBuffer(cmd_bufs[0]);
19308 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19309 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19310 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19311 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19312 &img_barrier);
19313 vkEndCommandBuffer(cmd_bufs[1]);
19314 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19315 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19316 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19317 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19318 &img_barrier);
19319 vkEndCommandBuffer(cmd_bufs[2]);
19320 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19321 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19322 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19323 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19324 &img_barrier);
19325 vkEndCommandBuffer(cmd_bufs[3]);
19326
19327 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19328 VkSemaphore semaphore1, semaphore2;
19329 VkSemaphoreCreateInfo semaphore_create_info{};
19330 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19331 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19332 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19333 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19334 VkSubmitInfo submit_info[3];
19335 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19336 submit_info[0].pNext = nullptr;
19337 submit_info[0].commandBufferCount = 1;
19338 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19339 submit_info[0].signalSemaphoreCount = 1;
19340 submit_info[0].pSignalSemaphores = &semaphore1;
19341 submit_info[0].waitSemaphoreCount = 0;
19342 submit_info[0].pWaitDstStageMask = nullptr;
19343 submit_info[0].pWaitDstStageMask = flags;
19344 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19345 submit_info[1].pNext = nullptr;
19346 submit_info[1].commandBufferCount = 1;
19347 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19348 submit_info[1].waitSemaphoreCount = 1;
19349 submit_info[1].pWaitSemaphores = &semaphore1;
19350 submit_info[1].signalSemaphoreCount = 1;
19351 submit_info[1].pSignalSemaphores = &semaphore2;
19352 submit_info[1].pWaitDstStageMask = flags;
19353 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19354 submit_info[2].pNext = nullptr;
19355 submit_info[2].commandBufferCount = 2;
19356 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19357 submit_info[2].waitSemaphoreCount = 1;
19358 submit_info[2].pWaitSemaphores = &semaphore2;
19359 submit_info[2].signalSemaphoreCount = 0;
19360 submit_info[2].pSignalSemaphores = nullptr;
19361 submit_info[2].pWaitDstStageMask = flags;
19362 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19363 vkQueueWaitIdle(m_device->m_queue);
19364
19365 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19366 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19367 m_errorMonitor->VerifyNotFound();
19368}
19369
Tobin Ehlis953e8392016-11-17 10:54:13 -070019370TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19371 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19372 // We previously had a bug where dynamic offset of inactive bindings was still being used
19373 VkResult err;
19374 m_errorMonitor->ExpectSuccess();
19375
Tony Barbour1fa09702017-03-16 12:09:08 -060019376 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019377 ASSERT_NO_FATAL_FAILURE(InitViewport());
19378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19379
19380 VkDescriptorPoolSize ds_type_count = {};
19381 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19382 ds_type_count.descriptorCount = 3;
19383
19384 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19385 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19386 ds_pool_ci.pNext = NULL;
19387 ds_pool_ci.maxSets = 1;
19388 ds_pool_ci.poolSizeCount = 1;
19389 ds_pool_ci.pPoolSizes = &ds_type_count;
19390
19391 VkDescriptorPool ds_pool;
19392 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19393 ASSERT_VK_SUCCESS(err);
19394
19395 const uint32_t BINDING_COUNT = 3;
19396 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019397 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019398 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19399 dsl_binding[0].descriptorCount = 1;
19400 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19401 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019402 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019403 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19404 dsl_binding[1].descriptorCount = 1;
19405 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19406 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019407 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019408 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19409 dsl_binding[2].descriptorCount = 1;
19410 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19411 dsl_binding[2].pImmutableSamplers = NULL;
19412
19413 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19414 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19415 ds_layout_ci.pNext = NULL;
19416 ds_layout_ci.bindingCount = BINDING_COUNT;
19417 ds_layout_ci.pBindings = dsl_binding;
19418 VkDescriptorSetLayout ds_layout;
19419 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19420 ASSERT_VK_SUCCESS(err);
19421
19422 VkDescriptorSet descriptor_set;
19423 VkDescriptorSetAllocateInfo alloc_info = {};
19424 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19425 alloc_info.descriptorSetCount = 1;
19426 alloc_info.descriptorPool = ds_pool;
19427 alloc_info.pSetLayouts = &ds_layout;
19428 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19429 ASSERT_VK_SUCCESS(err);
19430
19431 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19432 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19433 pipeline_layout_ci.pNext = NULL;
19434 pipeline_layout_ci.setLayoutCount = 1;
19435 pipeline_layout_ci.pSetLayouts = &ds_layout;
19436
19437 VkPipelineLayout pipeline_layout;
19438 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19439 ASSERT_VK_SUCCESS(err);
19440
19441 // Create two buffers to update the descriptors with
19442 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19443 uint32_t qfi = 0;
19444 VkBufferCreateInfo buffCI = {};
19445 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19446 buffCI.size = 2048;
19447 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19448 buffCI.queueFamilyIndexCount = 1;
19449 buffCI.pQueueFamilyIndices = &qfi;
19450
19451 VkBuffer dyub1;
19452 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19453 ASSERT_VK_SUCCESS(err);
19454 // buffer2
19455 buffCI.size = 1024;
19456 VkBuffer dyub2;
19457 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19458 ASSERT_VK_SUCCESS(err);
19459 // Allocate memory and bind to buffers
19460 VkMemoryAllocateInfo mem_alloc[2] = {};
19461 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19462 mem_alloc[0].pNext = NULL;
19463 mem_alloc[0].memoryTypeIndex = 0;
19464 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19465 mem_alloc[1].pNext = NULL;
19466 mem_alloc[1].memoryTypeIndex = 0;
19467
19468 VkMemoryRequirements mem_reqs1;
19469 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19470 VkMemoryRequirements mem_reqs2;
19471 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19472 mem_alloc[0].allocationSize = mem_reqs1.size;
19473 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19474 mem_alloc[1].allocationSize = mem_reqs2.size;
19475 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19476 if (!pass) {
19477 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19478 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19479 return;
19480 }
19481
19482 VkDeviceMemory mem1;
19483 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19484 ASSERT_VK_SUCCESS(err);
19485 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19486 ASSERT_VK_SUCCESS(err);
19487 VkDeviceMemory mem2;
19488 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19489 ASSERT_VK_SUCCESS(err);
19490 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19491 ASSERT_VK_SUCCESS(err);
19492 // Update descriptors
19493 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19494 buff_info[0].buffer = dyub1;
19495 buff_info[0].offset = 0;
19496 buff_info[0].range = 256;
19497 buff_info[1].buffer = dyub1;
19498 buff_info[1].offset = 256;
19499 buff_info[1].range = 512;
19500 buff_info[2].buffer = dyub2;
19501 buff_info[2].offset = 0;
19502 buff_info[2].range = 512;
19503
19504 VkWriteDescriptorSet descriptor_write;
19505 memset(&descriptor_write, 0, sizeof(descriptor_write));
19506 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19507 descriptor_write.dstSet = descriptor_set;
19508 descriptor_write.dstBinding = 0;
19509 descriptor_write.descriptorCount = BINDING_COUNT;
19510 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19511 descriptor_write.pBufferInfo = buff_info;
19512
19513 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19514
Tony Barbour552f6c02016-12-21 14:34:07 -070019515 m_commandBuffer->BeginCommandBuffer();
19516 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019517
19518 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019519 char const *vsSource =
19520 "#version 450\n"
19521 "\n"
19522 "out gl_PerVertex { \n"
19523 " vec4 gl_Position;\n"
19524 "};\n"
19525 "void main(){\n"
19526 " gl_Position = vec4(1);\n"
19527 "}\n";
19528 char const *fsSource =
19529 "#version 450\n"
19530 "\n"
19531 "layout(location=0) out vec4 x;\n"
19532 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19533 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19534 "void main(){\n"
19535 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19536 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019537 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19538 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19539 VkPipelineObj pipe(m_device);
19540 pipe.SetViewport(m_viewports);
19541 pipe.SetScissor(m_scissors);
19542 pipe.AddShader(&vs);
19543 pipe.AddShader(&fs);
19544 pipe.AddColorAttachment();
19545 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19546
19547 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19548 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19549 // we used to have a bug in this case.
19550 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19551 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19552 &descriptor_set, BINDING_COUNT, dyn_off);
19553 Draw(1, 0, 0, 0);
19554 m_errorMonitor->VerifyNotFound();
19555
19556 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19557 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19558 vkFreeMemory(m_device->device(), mem1, NULL);
19559 vkFreeMemory(m_device->device(), mem2, NULL);
19560
19561 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19562 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19563 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19564}
19565
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019566TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019567 TEST_DESCRIPTION(
19568 "Ensure that validations handling of non-coherent memory "
19569 "mapping while using VK_WHOLE_SIZE does not cause access "
19570 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019571 VkResult err;
19572 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019573 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019574
19575 VkDeviceMemory mem;
19576 VkMemoryRequirements mem_reqs;
19577 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019578 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019579 VkMemoryAllocateInfo alloc_info = {};
19580 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19581 alloc_info.pNext = NULL;
19582 alloc_info.memoryTypeIndex = 0;
19583
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019584 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019585 alloc_info.allocationSize = allocation_size;
19586
19587 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19588 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 -070019589 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019590 if (!pass) {
19591 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019592 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19593 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019594 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019595 pass = m_device->phy().set_memory_type(
19596 mem_reqs.memoryTypeBits, &alloc_info,
19597 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19598 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019599 if (!pass) {
19600 return;
19601 }
19602 }
19603 }
19604
19605 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19606 ASSERT_VK_SUCCESS(err);
19607
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019608 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019609 m_errorMonitor->ExpectSuccess();
19610 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19611 ASSERT_VK_SUCCESS(err);
19612 VkMappedMemoryRange mmr = {};
19613 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19614 mmr.memory = mem;
19615 mmr.offset = 0;
19616 mmr.size = VK_WHOLE_SIZE;
19617 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19618 ASSERT_VK_SUCCESS(err);
19619 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19620 ASSERT_VK_SUCCESS(err);
19621 m_errorMonitor->VerifyNotFound();
19622 vkUnmapMemory(m_device->device(), mem);
19623
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019624 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019625 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019626 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019627 ASSERT_VK_SUCCESS(err);
19628 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19629 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019630 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019631 mmr.size = VK_WHOLE_SIZE;
19632 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19633 ASSERT_VK_SUCCESS(err);
19634 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19635 ASSERT_VK_SUCCESS(err);
19636 m_errorMonitor->VerifyNotFound();
19637 vkUnmapMemory(m_device->device(), mem);
19638
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019639 // Map with offset and size
19640 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019641 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019642 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019643 ASSERT_VK_SUCCESS(err);
19644 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19645 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019646 mmr.offset = 4 * atom_size;
19647 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019648 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19649 ASSERT_VK_SUCCESS(err);
19650 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19651 ASSERT_VK_SUCCESS(err);
19652 m_errorMonitor->VerifyNotFound();
19653 vkUnmapMemory(m_device->device(), mem);
19654
19655 // Map without offset and flush WHOLE_SIZE with two separate offsets
19656 m_errorMonitor->ExpectSuccess();
19657 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19658 ASSERT_VK_SUCCESS(err);
19659 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19660 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019661 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019662 mmr.size = VK_WHOLE_SIZE;
19663 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19664 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019665 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019666 mmr.size = VK_WHOLE_SIZE;
19667 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19668 ASSERT_VK_SUCCESS(err);
19669 m_errorMonitor->VerifyNotFound();
19670 vkUnmapMemory(m_device->device(), mem);
19671
19672 vkFreeMemory(m_device->device(), mem, NULL);
19673}
19674
19675// This is a positive test. We used to expect error in this case but spec now allows it
19676TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19677 m_errorMonitor->ExpectSuccess();
19678 vk_testing::Fence testFence;
19679 VkFenceCreateInfo fenceInfo = {};
19680 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19681 fenceInfo.pNext = NULL;
19682
Tony Barbour1fa09702017-03-16 12:09:08 -060019683 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019684 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019685 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019686 VkResult result = vkResetFences(m_device->device(), 1, fences);
19687 ASSERT_VK_SUCCESS(result);
19688
19689 m_errorMonitor->VerifyNotFound();
19690}
19691
19692TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19693 m_errorMonitor->ExpectSuccess();
19694
Tony Barbour1fa09702017-03-16 12:09:08 -060019695 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019696 VkResult err;
19697
19698 // Record (empty!) command buffer that can be submitted multiple times
19699 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019700 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19701 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019702 m_commandBuffer->BeginCommandBuffer(&cbbi);
19703 m_commandBuffer->EndCommandBuffer();
19704
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019705 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019706 VkFence fence;
19707 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19708 ASSERT_VK_SUCCESS(err);
19709
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019710 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019711 VkSemaphore s1, s2;
19712 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19713 ASSERT_VK_SUCCESS(err);
19714 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19715 ASSERT_VK_SUCCESS(err);
19716
19717 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019718 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019719 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19720 ASSERT_VK_SUCCESS(err);
19721
19722 // Submit CB again, signaling s2.
19723 si.pSignalSemaphores = &s2;
19724 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19725 ASSERT_VK_SUCCESS(err);
19726
19727 // Wait for fence.
19728 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19729 ASSERT_VK_SUCCESS(err);
19730
19731 // CB is still in flight from second submission, but semaphore s1 is no
19732 // longer in flight. delete it.
19733 vkDestroySemaphore(m_device->device(), s1, nullptr);
19734
19735 m_errorMonitor->VerifyNotFound();
19736
19737 // Force device idle and clean up remaining objects
19738 vkDeviceWaitIdle(m_device->device());
19739 vkDestroySemaphore(m_device->device(), s2, nullptr);
19740 vkDestroyFence(m_device->device(), fence, nullptr);
19741}
19742
19743TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19744 m_errorMonitor->ExpectSuccess();
19745
Tony Barbour1fa09702017-03-16 12:09:08 -060019746 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019747 VkResult err;
19748
19749 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019750 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019751 VkFence f1;
19752 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19753 ASSERT_VK_SUCCESS(err);
19754
19755 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019756 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019757 VkFence f2;
19758 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19759 ASSERT_VK_SUCCESS(err);
19760
19761 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019762 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019763 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19764
19765 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019766 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019767 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19768
19769 // Should have both retired!
19770 vkDestroyFence(m_device->device(), f1, nullptr);
19771 vkDestroyFence(m_device->device(), f2, nullptr);
19772
19773 m_errorMonitor->VerifyNotFound();
19774}
19775
19776TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019777 TEST_DESCRIPTION(
19778 "Verify that creating an image view from an image with valid usage "
19779 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019780
Tony Barbour1fa09702017-03-16 12:09:08 -060019781 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019782
19783 m_errorMonitor->ExpectSuccess();
19784 // Verify that we can create a view with usage INPUT_ATTACHMENT
19785 VkImageObj image(m_device);
19786 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19787 ASSERT_TRUE(image.initialized());
19788 VkImageView imageView;
19789 VkImageViewCreateInfo ivci = {};
19790 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19791 ivci.image = image.handle();
19792 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19793 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19794 ivci.subresourceRange.layerCount = 1;
19795 ivci.subresourceRange.baseMipLevel = 0;
19796 ivci.subresourceRange.levelCount = 1;
19797 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19798
19799 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19800 m_errorMonitor->VerifyNotFound();
19801 vkDestroyImageView(m_device->device(), imageView, NULL);
19802}
19803
19804// This is a positive test. No failures are expected.
19805TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019806 TEST_DESCRIPTION(
19807 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19808 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019809
Tony Barbour1fa09702017-03-16 12:09:08 -060019810 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019811
19812 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019813 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019814
19815 m_errorMonitor->ExpectSuccess();
19816
19817 VkImage image;
19818 VkImageCreateInfo image_create_info = {};
19819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19820 image_create_info.pNext = NULL;
19821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19822 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19823 image_create_info.extent.width = 64;
19824 image_create_info.extent.height = 64;
19825 image_create_info.extent.depth = 1;
19826 image_create_info.mipLevels = 1;
19827 image_create_info.arrayLayers = 1;
19828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19830 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19831 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19832 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19833 ASSERT_VK_SUCCESS(err);
19834
19835 VkMemoryRequirements memory_reqs;
19836 VkDeviceMemory memory_one, memory_two;
19837 bool pass;
19838 VkMemoryAllocateInfo memory_info = {};
19839 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19840 memory_info.pNext = NULL;
19841 memory_info.allocationSize = 0;
19842 memory_info.memoryTypeIndex = 0;
19843 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19844 // Find an image big enough to allow sparse mapping of 2 memory regions
19845 // Increase the image size until it is at least twice the
19846 // size of the required alignment, to ensure we can bind both
19847 // allocated memory blocks to the image on aligned offsets.
19848 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19849 vkDestroyImage(m_device->device(), image, nullptr);
19850 image_create_info.extent.width *= 2;
19851 image_create_info.extent.height *= 2;
19852 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19853 ASSERT_VK_SUCCESS(err);
19854 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19855 }
19856 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19857 // at the end of the first
19858 memory_info.allocationSize = memory_reqs.alignment;
19859 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19860 ASSERT_TRUE(pass);
19861 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19862 ASSERT_VK_SUCCESS(err);
19863 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19864 ASSERT_VK_SUCCESS(err);
19865 VkSparseMemoryBind binds[2];
19866 binds[0].flags = 0;
19867 binds[0].memory = memory_one;
19868 binds[0].memoryOffset = 0;
19869 binds[0].resourceOffset = 0;
19870 binds[0].size = memory_info.allocationSize;
19871 binds[1].flags = 0;
19872 binds[1].memory = memory_two;
19873 binds[1].memoryOffset = 0;
19874 binds[1].resourceOffset = memory_info.allocationSize;
19875 binds[1].size = memory_info.allocationSize;
19876
19877 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19878 opaqueBindInfo.image = image;
19879 opaqueBindInfo.bindCount = 2;
19880 opaqueBindInfo.pBinds = binds;
19881
19882 VkFence fence = VK_NULL_HANDLE;
19883 VkBindSparseInfo bindSparseInfo = {};
19884 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19885 bindSparseInfo.imageOpaqueBindCount = 1;
19886 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19887
19888 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19889 vkQueueWaitIdle(m_device->m_queue);
19890 vkDestroyImage(m_device->device(), image, NULL);
19891 vkFreeMemory(m_device->device(), memory_one, NULL);
19892 vkFreeMemory(m_device->device(), memory_two, NULL);
19893 m_errorMonitor->VerifyNotFound();
19894}
19895
19896TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019897 TEST_DESCRIPTION(
19898 "Ensure that CmdBeginRenderPass with an attachment's "
19899 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19900 "the command buffer has prior knowledge of that "
19901 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019902
19903 m_errorMonitor->ExpectSuccess();
19904
Tony Barbour1fa09702017-03-16 12:09:08 -060019905 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019906
19907 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019908 VkAttachmentDescription attachment = {0,
19909 VK_FORMAT_R8G8B8A8_UNORM,
19910 VK_SAMPLE_COUNT_1_BIT,
19911 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19912 VK_ATTACHMENT_STORE_OP_STORE,
19913 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19914 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19915 VK_IMAGE_LAYOUT_UNDEFINED,
19916 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019917
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019918 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019919
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019920 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019921
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019922 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019923
19924 VkRenderPass rp;
19925 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19926 ASSERT_VK_SUCCESS(err);
19927
19928 // A compatible framebuffer.
19929 VkImageObj image(m_device);
19930 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19931 ASSERT_TRUE(image.initialized());
19932
19933 VkImageViewCreateInfo ivci = {
19934 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19935 nullptr,
19936 0,
19937 image.handle(),
19938 VK_IMAGE_VIEW_TYPE_2D,
19939 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019940 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19941 VK_COMPONENT_SWIZZLE_IDENTITY},
19942 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019943 };
19944 VkImageView view;
19945 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19946 ASSERT_VK_SUCCESS(err);
19947
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019948 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019949 VkFramebuffer fb;
19950 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19951 ASSERT_VK_SUCCESS(err);
19952
19953 // Record a single command buffer which uses this renderpass twice. The
19954 // bug is triggered at the beginning of the second renderpass, when the
19955 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019956 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 -070019957 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019958 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19959 vkCmdEndRenderPass(m_commandBuffer->handle());
19960 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19961
19962 m_errorMonitor->VerifyNotFound();
19963
19964 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019965 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019966
19967 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19968 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19969 vkDestroyImageView(m_device->device(), view, nullptr);
19970}
19971
19972TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019973 TEST_DESCRIPTION(
19974 "This test should pass. Create a Framebuffer and "
19975 "command buffer, bind them together, then destroy "
19976 "command pool and framebuffer and verify there are no "
19977 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019978
19979 m_errorMonitor->ExpectSuccess();
19980
Tony Barbour1fa09702017-03-16 12:09:08 -060019981 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019982
19983 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019984 VkAttachmentDescription attachment = {0,
19985 VK_FORMAT_R8G8B8A8_UNORM,
19986 VK_SAMPLE_COUNT_1_BIT,
19987 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19988 VK_ATTACHMENT_STORE_OP_STORE,
19989 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19990 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19991 VK_IMAGE_LAYOUT_UNDEFINED,
19992 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019993
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019994 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019995
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019996 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019997
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019998 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019999
20000 VkRenderPass rp;
20001 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20002 ASSERT_VK_SUCCESS(err);
20003
20004 // A compatible framebuffer.
20005 VkImageObj image(m_device);
20006 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20007 ASSERT_TRUE(image.initialized());
20008
20009 VkImageViewCreateInfo ivci = {
20010 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20011 nullptr,
20012 0,
20013 image.handle(),
20014 VK_IMAGE_VIEW_TYPE_2D,
20015 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020016 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20017 VK_COMPONENT_SWIZZLE_IDENTITY},
20018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020019 };
20020 VkImageView view;
20021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20022 ASSERT_VK_SUCCESS(err);
20023
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020025 VkFramebuffer fb;
20026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20027 ASSERT_VK_SUCCESS(err);
20028
20029 // Explicitly create a command buffer to bind the FB to so that we can then
20030 // destroy the command pool in order to implicitly free command buffer
20031 VkCommandPool command_pool;
20032 VkCommandPoolCreateInfo pool_create_info{};
20033 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20034 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20035 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20036 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20037
20038 VkCommandBuffer command_buffer;
20039 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20040 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20041 command_buffer_allocate_info.commandPool = command_pool;
20042 command_buffer_allocate_info.commandBufferCount = 1;
20043 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20044 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20045
20046 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020047 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 -060020048 VkCommandBufferBeginInfo begin_info{};
20049 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20050 vkBeginCommandBuffer(command_buffer, &begin_info);
20051
20052 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20053 vkCmdEndRenderPass(command_buffer);
20054 vkEndCommandBuffer(command_buffer);
20055 vkDestroyImageView(m_device->device(), view, nullptr);
20056 // Destroy command pool to implicitly free command buffer
20057 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20058 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20059 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20060 m_errorMonitor->VerifyNotFound();
20061}
20062
20063TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020064 TEST_DESCRIPTION(
20065 "Ensure that CmdBeginRenderPass applies the layout "
20066 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020067
20068 m_errorMonitor->ExpectSuccess();
20069
Tony Barbour1fa09702017-03-16 12:09:08 -060020070 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020071
20072 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020073 VkAttachmentDescription attachment = {0,
20074 VK_FORMAT_R8G8B8A8_UNORM,
20075 VK_SAMPLE_COUNT_1_BIT,
20076 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20077 VK_ATTACHMENT_STORE_OP_STORE,
20078 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20079 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20080 VK_IMAGE_LAYOUT_UNDEFINED,
20081 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020082
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020083 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020084
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020085 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020086
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020087 VkSubpassDependency dep = {0,
20088 0,
20089 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20090 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20091 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20092 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20093 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020094
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020095 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020096
20097 VkResult err;
20098 VkRenderPass rp;
20099 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20100 ASSERT_VK_SUCCESS(err);
20101
20102 // A compatible framebuffer.
20103 VkImageObj image(m_device);
20104 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20105 ASSERT_TRUE(image.initialized());
20106
20107 VkImageViewCreateInfo ivci = {
20108 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20109 nullptr,
20110 0,
20111 image.handle(),
20112 VK_IMAGE_VIEW_TYPE_2D,
20113 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020114 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20115 VK_COMPONENT_SWIZZLE_IDENTITY},
20116 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020117 };
20118 VkImageView view;
20119 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20120 ASSERT_VK_SUCCESS(err);
20121
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020122 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020123 VkFramebuffer fb;
20124 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20125 ASSERT_VK_SUCCESS(err);
20126
20127 // Record a single command buffer which issues a pipeline barrier w/
20128 // image memory barrier for the attachment. This detects the previously
20129 // missing tracking of the subpass layout by throwing a validation error
20130 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020131 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 -070020132 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020133 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20134
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020135 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20136 nullptr,
20137 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20138 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20139 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20140 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20141 VK_QUEUE_FAMILY_IGNORED,
20142 VK_QUEUE_FAMILY_IGNORED,
20143 image.handle(),
20144 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020145 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020146 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20147 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020148
20149 vkCmdEndRenderPass(m_commandBuffer->handle());
20150 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020151 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020152
20153 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20154 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20155 vkDestroyImageView(m_device->device(), view, nullptr);
20156}
20157
20158TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020159 TEST_DESCRIPTION(
20160 "Validate that when an imageView of a depth/stencil image "
20161 "is used as a depth/stencil framebuffer attachment, the "
20162 "aspectMask is ignored and both depth and stencil image "
20163 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020164
Tony Barbour1fa09702017-03-16 12:09:08 -060020165 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020166 VkFormatProperties format_properties;
20167 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20168 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20169 return;
20170 }
20171
20172 m_errorMonitor->ExpectSuccess();
20173
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020174 VkAttachmentDescription attachment = {0,
20175 VK_FORMAT_D32_SFLOAT_S8_UINT,
20176 VK_SAMPLE_COUNT_1_BIT,
20177 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20178 VK_ATTACHMENT_STORE_OP_STORE,
20179 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20180 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20181 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20182 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020183
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020184 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020185
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020186 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020187
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020188 VkSubpassDependency dep = {0,
20189 0,
20190 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20191 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20192 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20193 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20194 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020195
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020196 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020197
20198 VkResult err;
20199 VkRenderPass rp;
20200 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20201 ASSERT_VK_SUCCESS(err);
20202
20203 VkImageObj image(m_device);
20204 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020205 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020206 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020207 ASSERT_TRUE(image.initialized());
20208 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20209
20210 VkImageViewCreateInfo ivci = {
20211 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20212 nullptr,
20213 0,
20214 image.handle(),
20215 VK_IMAGE_VIEW_TYPE_2D,
20216 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020217 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20218 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020219 };
20220 VkImageView view;
20221 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20222 ASSERT_VK_SUCCESS(err);
20223
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020224 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020225 VkFramebuffer fb;
20226 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20227 ASSERT_VK_SUCCESS(err);
20228
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020229 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 -070020230 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020231 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20232
20233 VkImageMemoryBarrier imb = {};
20234 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20235 imb.pNext = nullptr;
20236 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20237 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20238 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20239 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20240 imb.srcQueueFamilyIndex = 0;
20241 imb.dstQueueFamilyIndex = 0;
20242 imb.image = image.handle();
20243 imb.subresourceRange.aspectMask = 0x6;
20244 imb.subresourceRange.baseMipLevel = 0;
20245 imb.subresourceRange.levelCount = 0x1;
20246 imb.subresourceRange.baseArrayLayer = 0;
20247 imb.subresourceRange.layerCount = 0x1;
20248
20249 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020250 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20251 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020252
20253 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020254 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020255 QueueCommandBuffer(false);
20256 m_errorMonitor->VerifyNotFound();
20257
20258 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20259 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20260 vkDestroyImageView(m_device->device(), view, nullptr);
20261}
20262
20263TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020264 TEST_DESCRIPTION(
20265 "Ensure that layout transitions work correctly without "
20266 "errors, when an attachment reference is "
20267 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020268
20269 m_errorMonitor->ExpectSuccess();
20270
Tony Barbour1fa09702017-03-16 12:09:08 -060020271 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020272
20273 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020274 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020275
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020276 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020277
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020278 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020279
20280 VkRenderPass rp;
20281 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20282 ASSERT_VK_SUCCESS(err);
20283
20284 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020285 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020286 VkFramebuffer fb;
20287 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20288 ASSERT_VK_SUCCESS(err);
20289
20290 // Record a command buffer which just begins and ends the renderpass. The
20291 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020292 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 -070020293 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020294 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20295 vkCmdEndRenderPass(m_commandBuffer->handle());
20296 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020297 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020298
20299 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20300 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20301}
20302
20303// This is a positive test. No errors are expected.
20304TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020305 TEST_DESCRIPTION(
20306 "Create a stencil-only attachment with a LOAD_OP set to "
20307 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020308 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020309 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070020310 auto depth_format = find_depth_stencil_format(m_device);
20311 if (!depth_format) {
20312 printf(" No Depth + Stencil format found. Skipped.\n");
20313 return;
20314 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020315 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020316 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020317 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20318 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020319 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20320 return;
20321 }
20322
Tony Barbourf887b162017-03-09 10:06:46 -070020323 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020324 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020325 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020326 VkAttachmentDescription att = {};
20327 VkAttachmentReference ref = {};
20328 att.format = depth_stencil_fmt;
20329 att.samples = VK_SAMPLE_COUNT_1_BIT;
20330 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20331 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20332 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20333 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20334 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20335 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20336
20337 VkClearValue clear;
20338 clear.depthStencil.depth = 1.0;
20339 clear.depthStencil.stencil = 0;
20340 ref.attachment = 0;
20341 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20342
20343 VkSubpassDescription subpass = {};
20344 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20345 subpass.flags = 0;
20346 subpass.inputAttachmentCount = 0;
20347 subpass.pInputAttachments = NULL;
20348 subpass.colorAttachmentCount = 0;
20349 subpass.pColorAttachments = NULL;
20350 subpass.pResolveAttachments = NULL;
20351 subpass.pDepthStencilAttachment = &ref;
20352 subpass.preserveAttachmentCount = 0;
20353 subpass.pPreserveAttachments = NULL;
20354
20355 VkRenderPass rp;
20356 VkRenderPassCreateInfo rp_info = {};
20357 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20358 rp_info.attachmentCount = 1;
20359 rp_info.pAttachments = &att;
20360 rp_info.subpassCount = 1;
20361 rp_info.pSubpasses = &subpass;
20362 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20363 ASSERT_VK_SUCCESS(result);
20364
20365 VkImageView *depthView = m_depthStencil->BindInfo();
20366 VkFramebufferCreateInfo fb_info = {};
20367 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20368 fb_info.pNext = NULL;
20369 fb_info.renderPass = rp;
20370 fb_info.attachmentCount = 1;
20371 fb_info.pAttachments = depthView;
20372 fb_info.width = 100;
20373 fb_info.height = 100;
20374 fb_info.layers = 1;
20375 VkFramebuffer fb;
20376 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20377 ASSERT_VK_SUCCESS(result);
20378
20379 VkRenderPassBeginInfo rpbinfo = {};
20380 rpbinfo.clearValueCount = 1;
20381 rpbinfo.pClearValues = &clear;
20382 rpbinfo.pNext = NULL;
20383 rpbinfo.renderPass = rp;
20384 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20385 rpbinfo.renderArea.extent.width = 100;
20386 rpbinfo.renderArea.extent.height = 100;
20387 rpbinfo.renderArea.offset.x = 0;
20388 rpbinfo.renderArea.offset.y = 0;
20389 rpbinfo.framebuffer = fb;
20390
20391 VkFence fence = {};
20392 VkFenceCreateInfo fence_ci = {};
20393 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20394 fence_ci.pNext = nullptr;
20395 fence_ci.flags = 0;
20396 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20397 ASSERT_VK_SUCCESS(result);
20398
20399 m_commandBuffer->BeginCommandBuffer();
20400 m_commandBuffer->BeginRenderPass(rpbinfo);
20401 m_commandBuffer->EndRenderPass();
20402 m_commandBuffer->EndCommandBuffer();
20403 m_commandBuffer->QueueCommandBuffer(fence);
20404
20405 VkImageObj destImage(m_device);
20406 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 -070020407 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020408 VkImageMemoryBarrier barrier = {};
20409 VkImageSubresourceRange range;
20410 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20411 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20412 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20413 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20414 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20415 barrier.image = m_depthStencil->handle();
20416 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20417 range.baseMipLevel = 0;
20418 range.levelCount = 1;
20419 range.baseArrayLayer = 0;
20420 range.layerCount = 1;
20421 barrier.subresourceRange = range;
20422 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20423 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20424 cmdbuf.BeginCommandBuffer();
20425 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 -070020426 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020427 barrier.srcAccessMask = 0;
20428 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20429 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20430 barrier.image = destImage.handle();
20431 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20432 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 -070020433 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020434 VkImageCopy cregion;
20435 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20436 cregion.srcSubresource.mipLevel = 0;
20437 cregion.srcSubresource.baseArrayLayer = 0;
20438 cregion.srcSubresource.layerCount = 1;
20439 cregion.srcOffset.x = 0;
20440 cregion.srcOffset.y = 0;
20441 cregion.srcOffset.z = 0;
20442 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20443 cregion.dstSubresource.mipLevel = 0;
20444 cregion.dstSubresource.baseArrayLayer = 0;
20445 cregion.dstSubresource.layerCount = 1;
20446 cregion.dstOffset.x = 0;
20447 cregion.dstOffset.y = 0;
20448 cregion.dstOffset.z = 0;
20449 cregion.extent.width = 100;
20450 cregion.extent.height = 100;
20451 cregion.extent.depth = 1;
20452 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020453 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020454 cmdbuf.EndCommandBuffer();
20455
20456 VkSubmitInfo submit_info;
20457 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20458 submit_info.pNext = NULL;
20459 submit_info.waitSemaphoreCount = 0;
20460 submit_info.pWaitSemaphores = NULL;
20461 submit_info.pWaitDstStageMask = NULL;
20462 submit_info.commandBufferCount = 1;
20463 submit_info.pCommandBuffers = &cmdbuf.handle();
20464 submit_info.signalSemaphoreCount = 0;
20465 submit_info.pSignalSemaphores = NULL;
20466
20467 m_errorMonitor->ExpectSuccess();
20468 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20469 m_errorMonitor->VerifyNotFound();
20470
20471 vkQueueWaitIdle(m_device->m_queue);
20472 vkDestroyFence(m_device->device(), fence, nullptr);
20473 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20474 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20475}
20476
20477// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020478TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20479 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20480
20481 m_errorMonitor->ExpectSuccess();
20482
Tony Barbour1fa09702017-03-16 12:09:08 -060020483 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblene4e225d2017-03-07 23:15:43 -070020484 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20485
20486 VkImageMemoryBarrier img_barrier = {};
20487 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20488 img_barrier.pNext = NULL;
20489 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20490 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20491 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20492 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20493 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20494 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20495 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20496 img_barrier.subresourceRange.baseArrayLayer = 0;
20497 img_barrier.subresourceRange.baseMipLevel = 0;
20498 img_barrier.subresourceRange.layerCount = 1;
20499 img_barrier.subresourceRange.levelCount = 1;
20500
20501 {
20502 VkImageObj img_color(m_device);
20503 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20504 ASSERT_TRUE(img_color.initialized());
20505
20506 VkImageObj img_ds1(m_device);
20507 img_ds1.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20508 ASSERT_TRUE(img_ds1.initialized());
20509
20510 VkImageObj img_ds2(m_device);
20511 img_ds2.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20512 ASSERT_TRUE(img_ds2.initialized());
20513
20514 VkImageObj img_xfer_src(m_device);
20515 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20516 ASSERT_TRUE(img_xfer_src.initialized());
20517
20518 VkImageObj img_xfer_dst(m_device);
20519 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20520 ASSERT_TRUE(img_xfer_dst.initialized());
20521
20522 VkImageObj img_sampled(m_device);
20523 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20524 ASSERT_TRUE(img_sampled.initialized());
20525
20526 VkImageObj img_input(m_device);
20527 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20528 ASSERT_TRUE(img_input.initialized());
20529
20530 const struct {
20531 VkImageObj &image_obj;
20532 VkImageLayout old_layout;
20533 VkImageLayout new_layout;
20534 } buffer_layouts[] = {
20535 // clang-format off
20536 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20537 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20538 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20539 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20540 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20541 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20542 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20543 // clang-format on
20544 };
20545 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20546
20547 m_commandBuffer->BeginCommandBuffer();
20548 for (uint32_t i = 0; i < layout_count; ++i) {
20549 img_barrier.image = buffer_layouts[i].image_obj.handle();
20550 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20551 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20552 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20553 : VK_IMAGE_ASPECT_COLOR_BIT;
20554
20555 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20556 img_barrier.newLayout = buffer_layouts[i].new_layout;
20557 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20558 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20559
20560 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20561 img_barrier.newLayout = buffer_layouts[i].old_layout;
20562 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20563 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20564 }
20565 m_commandBuffer->EndCommandBuffer();
20566
20567 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20568 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20569 }
20570 m_errorMonitor->VerifyNotFound();
20571}
20572
20573// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020574TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20575 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20576
20577 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020578 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020579
20580 VkEvent event;
20581 VkEventCreateInfo event_create_info{};
20582 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20583 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20584
20585 VkCommandPool command_pool;
20586 VkCommandPoolCreateInfo pool_create_info{};
20587 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20588 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20589 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20590 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20591
20592 VkCommandBuffer command_buffer;
20593 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20594 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20595 command_buffer_allocate_info.commandPool = command_pool;
20596 command_buffer_allocate_info.commandBufferCount = 1;
20597 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20598 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20599
20600 VkQueue queue = VK_NULL_HANDLE;
20601 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20602
20603 {
20604 VkCommandBufferBeginInfo begin_info{};
20605 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20606 vkBeginCommandBuffer(command_buffer, &begin_info);
20607
20608 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 -070020609 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020610 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20611 vkEndCommandBuffer(command_buffer);
20612 }
20613 {
20614 VkSubmitInfo submit_info{};
20615 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20616 submit_info.commandBufferCount = 1;
20617 submit_info.pCommandBuffers = &command_buffer;
20618 submit_info.signalSemaphoreCount = 0;
20619 submit_info.pSignalSemaphores = nullptr;
20620 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20621 }
20622 { vkSetEvent(m_device->device(), event); }
20623
20624 vkQueueWaitIdle(queue);
20625
20626 vkDestroyEvent(m_device->device(), event, nullptr);
20627 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20628 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20629
20630 m_errorMonitor->VerifyNotFound();
20631}
20632// This is a positive test. No errors should be generated.
20633TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20634 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20635
Tony Barbour1fa09702017-03-16 12:09:08 -060020636 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020637 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020638
20639 m_errorMonitor->ExpectSuccess();
20640
20641 VkQueryPool query_pool;
20642 VkQueryPoolCreateInfo query_pool_create_info{};
20643 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20644 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20645 query_pool_create_info.queryCount = 1;
20646 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20647
20648 VkCommandPool command_pool;
20649 VkCommandPoolCreateInfo pool_create_info{};
20650 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20651 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20652 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20653 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20654
20655 VkCommandBuffer command_buffer;
20656 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20657 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20658 command_buffer_allocate_info.commandPool = command_pool;
20659 command_buffer_allocate_info.commandBufferCount = 1;
20660 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20661 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20662
20663 VkCommandBuffer secondary_command_buffer;
20664 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20665 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20666
20667 VkQueue queue = VK_NULL_HANDLE;
20668 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20669
20670 uint32_t qfi = 0;
20671 VkBufferCreateInfo buff_create_info = {};
20672 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20673 buff_create_info.size = 1024;
20674 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20675 buff_create_info.queueFamilyIndexCount = 1;
20676 buff_create_info.pQueueFamilyIndices = &qfi;
20677
20678 VkResult err;
20679 VkBuffer buffer;
20680 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20681 ASSERT_VK_SUCCESS(err);
20682 VkMemoryAllocateInfo mem_alloc = {};
20683 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20684 mem_alloc.pNext = NULL;
20685 mem_alloc.allocationSize = 1024;
20686 mem_alloc.memoryTypeIndex = 0;
20687
20688 VkMemoryRequirements memReqs;
20689 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20690 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20691 if (!pass) {
20692 vkDestroyBuffer(m_device->device(), buffer, NULL);
20693 return;
20694 }
20695
20696 VkDeviceMemory mem;
20697 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20698 ASSERT_VK_SUCCESS(err);
20699 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20700 ASSERT_VK_SUCCESS(err);
20701
20702 VkCommandBufferInheritanceInfo hinfo = {};
20703 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20704 hinfo.renderPass = VK_NULL_HANDLE;
20705 hinfo.subpass = 0;
20706 hinfo.framebuffer = VK_NULL_HANDLE;
20707 hinfo.occlusionQueryEnable = VK_FALSE;
20708 hinfo.queryFlags = 0;
20709 hinfo.pipelineStatistics = 0;
20710
20711 {
20712 VkCommandBufferBeginInfo begin_info{};
20713 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20714 begin_info.pInheritanceInfo = &hinfo;
20715 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20716
20717 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20718 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20719
20720 vkEndCommandBuffer(secondary_command_buffer);
20721
20722 begin_info.pInheritanceInfo = nullptr;
20723 vkBeginCommandBuffer(command_buffer, &begin_info);
20724
20725 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20726 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20727
20728 vkEndCommandBuffer(command_buffer);
20729 }
20730 {
20731 VkSubmitInfo submit_info{};
20732 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20733 submit_info.commandBufferCount = 1;
20734 submit_info.pCommandBuffers = &command_buffer;
20735 submit_info.signalSemaphoreCount = 0;
20736 submit_info.pSignalSemaphores = nullptr;
20737 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20738 }
20739
20740 vkQueueWaitIdle(queue);
20741
20742 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20743 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20744 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20745 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20746 vkDestroyBuffer(m_device->device(), buffer, NULL);
20747 vkFreeMemory(m_device->device(), mem, NULL);
20748
20749 m_errorMonitor->VerifyNotFound();
20750}
20751
20752// This is a positive test. No errors should be generated.
20753TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20754 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20755
Tony Barbour1fa09702017-03-16 12:09:08 -060020756 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020757 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020758
20759 m_errorMonitor->ExpectSuccess();
20760
20761 VkQueryPool query_pool;
20762 VkQueryPoolCreateInfo query_pool_create_info{};
20763 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20764 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20765 query_pool_create_info.queryCount = 1;
20766 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20767
20768 VkCommandPool command_pool;
20769 VkCommandPoolCreateInfo pool_create_info{};
20770 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20771 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20772 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20773 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20774
20775 VkCommandBuffer command_buffer[2];
20776 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20777 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20778 command_buffer_allocate_info.commandPool = command_pool;
20779 command_buffer_allocate_info.commandBufferCount = 2;
20780 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20781 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20782
20783 VkQueue queue = VK_NULL_HANDLE;
20784 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20785
20786 uint32_t qfi = 0;
20787 VkBufferCreateInfo buff_create_info = {};
20788 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20789 buff_create_info.size = 1024;
20790 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20791 buff_create_info.queueFamilyIndexCount = 1;
20792 buff_create_info.pQueueFamilyIndices = &qfi;
20793
20794 VkResult err;
20795 VkBuffer buffer;
20796 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20797 ASSERT_VK_SUCCESS(err);
20798 VkMemoryAllocateInfo mem_alloc = {};
20799 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20800 mem_alloc.pNext = NULL;
20801 mem_alloc.allocationSize = 1024;
20802 mem_alloc.memoryTypeIndex = 0;
20803
20804 VkMemoryRequirements memReqs;
20805 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20806 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20807 if (!pass) {
20808 vkDestroyBuffer(m_device->device(), buffer, NULL);
20809 return;
20810 }
20811
20812 VkDeviceMemory mem;
20813 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20814 ASSERT_VK_SUCCESS(err);
20815 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20816 ASSERT_VK_SUCCESS(err);
20817
20818 {
20819 VkCommandBufferBeginInfo begin_info{};
20820 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20821 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20822
20823 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20824 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20825
20826 vkEndCommandBuffer(command_buffer[0]);
20827
20828 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20829
20830 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20831
20832 vkEndCommandBuffer(command_buffer[1]);
20833 }
20834 {
20835 VkSubmitInfo submit_info{};
20836 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20837 submit_info.commandBufferCount = 2;
20838 submit_info.pCommandBuffers = command_buffer;
20839 submit_info.signalSemaphoreCount = 0;
20840 submit_info.pSignalSemaphores = nullptr;
20841 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20842 }
20843
20844 vkQueueWaitIdle(queue);
20845
20846 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20847 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20848 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20849 vkDestroyBuffer(m_device->device(), buffer, NULL);
20850 vkFreeMemory(m_device->device(), mem, NULL);
20851
20852 m_errorMonitor->VerifyNotFound();
20853}
20854
Tony Barbourc46924f2016-11-04 11:49:52 -060020855TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020856 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20857
Tony Barbour1fa09702017-03-16 12:09:08 -060020858 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020859 VkEvent event;
20860 VkEventCreateInfo event_create_info{};
20861 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20862 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20863
20864 VkCommandPool command_pool;
20865 VkCommandPoolCreateInfo pool_create_info{};
20866 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20867 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20868 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20869 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20870
20871 VkCommandBuffer command_buffer;
20872 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20873 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20874 command_buffer_allocate_info.commandPool = command_pool;
20875 command_buffer_allocate_info.commandBufferCount = 1;
20876 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20877 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20878
20879 VkQueue queue = VK_NULL_HANDLE;
20880 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20881
20882 {
20883 VkCommandBufferBeginInfo begin_info{};
20884 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20885 vkBeginCommandBuffer(command_buffer, &begin_info);
20886
20887 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020888 vkEndCommandBuffer(command_buffer);
20889 }
20890 {
20891 VkSubmitInfo submit_info{};
20892 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20893 submit_info.commandBufferCount = 1;
20894 submit_info.pCommandBuffers = &command_buffer;
20895 submit_info.signalSemaphoreCount = 0;
20896 submit_info.pSignalSemaphores = nullptr;
20897 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20898 }
20899 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20901 "that is already in use by a "
20902 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020903 vkSetEvent(m_device->device(), event);
20904 m_errorMonitor->VerifyFound();
20905 }
20906
20907 vkQueueWaitIdle(queue);
20908
20909 vkDestroyEvent(m_device->device(), event, nullptr);
20910 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20911 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20912}
20913
20914// This is a positive test. No errors should be generated.
20915TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020916 TEST_DESCRIPTION(
20917 "Two command buffers with two separate fences are each "
20918 "run through a Submit & WaitForFences cycle 3 times. This "
20919 "previously revealed a bug so running this positive test "
20920 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020921 m_errorMonitor->ExpectSuccess();
20922
Tony Barbour1fa09702017-03-16 12:09:08 -060020923 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020924 VkQueue queue = VK_NULL_HANDLE;
20925 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20926
20927 static const uint32_t NUM_OBJECTS = 2;
20928 static const uint32_t NUM_FRAMES = 3;
20929 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20930 VkFence fences[NUM_OBJECTS] = {};
20931
20932 VkCommandPool cmd_pool;
20933 VkCommandPoolCreateInfo cmd_pool_ci = {};
20934 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20935 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20936 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20937 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20938 ASSERT_VK_SUCCESS(err);
20939
20940 VkCommandBufferAllocateInfo cmd_buf_info = {};
20941 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20942 cmd_buf_info.commandPool = cmd_pool;
20943 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20944 cmd_buf_info.commandBufferCount = 1;
20945
20946 VkFenceCreateInfo fence_ci = {};
20947 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20948 fence_ci.pNext = nullptr;
20949 fence_ci.flags = 0;
20950
20951 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20952 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20953 ASSERT_VK_SUCCESS(err);
20954 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20955 ASSERT_VK_SUCCESS(err);
20956 }
20957
20958 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20959 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20960 // Create empty cmd buffer
20961 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20962 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20963
20964 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20965 ASSERT_VK_SUCCESS(err);
20966 err = vkEndCommandBuffer(cmd_buffers[obj]);
20967 ASSERT_VK_SUCCESS(err);
20968
20969 VkSubmitInfo submit_info = {};
20970 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20971 submit_info.commandBufferCount = 1;
20972 submit_info.pCommandBuffers = &cmd_buffers[obj];
20973 // Submit cmd buffer and wait for fence
20974 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20975 ASSERT_VK_SUCCESS(err);
20976 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20977 ASSERT_VK_SUCCESS(err);
20978 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20979 ASSERT_VK_SUCCESS(err);
20980 }
20981 }
20982 m_errorMonitor->VerifyNotFound();
20983 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20984 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20985 vkDestroyFence(m_device->device(), fences[i], nullptr);
20986 }
20987}
20988// This is a positive test. No errors should be generated.
20989TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020990 TEST_DESCRIPTION(
20991 "Two command buffers, each in a separate QueueSubmit call "
20992 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020993
Tony Barbour1fa09702017-03-16 12:09:08 -060020994 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020995 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020996
20997 m_errorMonitor->ExpectSuccess();
20998
20999 VkSemaphore semaphore;
21000 VkSemaphoreCreateInfo semaphore_create_info{};
21001 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21002 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21003
21004 VkCommandPool command_pool;
21005 VkCommandPoolCreateInfo pool_create_info{};
21006 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21007 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21008 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21009 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21010
21011 VkCommandBuffer command_buffer[2];
21012 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21013 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21014 command_buffer_allocate_info.commandPool = command_pool;
21015 command_buffer_allocate_info.commandBufferCount = 2;
21016 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21017 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21018
21019 VkQueue queue = VK_NULL_HANDLE;
21020 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21021
21022 {
21023 VkCommandBufferBeginInfo begin_info{};
21024 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21025 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21026
21027 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 -070021028 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021029
21030 VkViewport viewport{};
21031 viewport.maxDepth = 1.0f;
21032 viewport.minDepth = 0.0f;
21033 viewport.width = 512;
21034 viewport.height = 512;
21035 viewport.x = 0;
21036 viewport.y = 0;
21037 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21038 vkEndCommandBuffer(command_buffer[0]);
21039 }
21040 {
21041 VkCommandBufferBeginInfo begin_info{};
21042 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21043 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21044
21045 VkViewport viewport{};
21046 viewport.maxDepth = 1.0f;
21047 viewport.minDepth = 0.0f;
21048 viewport.width = 512;
21049 viewport.height = 512;
21050 viewport.x = 0;
21051 viewport.y = 0;
21052 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21053 vkEndCommandBuffer(command_buffer[1]);
21054 }
21055 {
21056 VkSubmitInfo submit_info{};
21057 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21058 submit_info.commandBufferCount = 1;
21059 submit_info.pCommandBuffers = &command_buffer[0];
21060 submit_info.signalSemaphoreCount = 1;
21061 submit_info.pSignalSemaphores = &semaphore;
21062 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21063 }
21064 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021065 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021066 VkSubmitInfo submit_info{};
21067 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21068 submit_info.commandBufferCount = 1;
21069 submit_info.pCommandBuffers = &command_buffer[1];
21070 submit_info.waitSemaphoreCount = 1;
21071 submit_info.pWaitSemaphores = &semaphore;
21072 submit_info.pWaitDstStageMask = flags;
21073 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21074 }
21075
21076 vkQueueWaitIdle(m_device->m_queue);
21077
21078 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21079 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21080 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21081
21082 m_errorMonitor->VerifyNotFound();
21083}
21084
21085// This is a positive test. No errors should be generated.
21086TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021087 TEST_DESCRIPTION(
21088 "Two command buffers, each in a separate QueueSubmit call "
21089 "submitted on separate queues, the second having a fence"
21090 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021091
Tony Barbour1fa09702017-03-16 12:09:08 -060021092 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021093 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021094
21095 m_errorMonitor->ExpectSuccess();
21096
21097 VkFence fence;
21098 VkFenceCreateInfo fence_create_info{};
21099 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21100 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21101
21102 VkSemaphore semaphore;
21103 VkSemaphoreCreateInfo semaphore_create_info{};
21104 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21105 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21106
21107 VkCommandPool command_pool;
21108 VkCommandPoolCreateInfo pool_create_info{};
21109 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21110 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21111 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21112 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21113
21114 VkCommandBuffer command_buffer[2];
21115 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21116 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21117 command_buffer_allocate_info.commandPool = command_pool;
21118 command_buffer_allocate_info.commandBufferCount = 2;
21119 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21120 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21121
21122 VkQueue queue = VK_NULL_HANDLE;
21123 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21124
21125 {
21126 VkCommandBufferBeginInfo begin_info{};
21127 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21128 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21129
21130 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 -070021131 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021132
21133 VkViewport viewport{};
21134 viewport.maxDepth = 1.0f;
21135 viewport.minDepth = 0.0f;
21136 viewport.width = 512;
21137 viewport.height = 512;
21138 viewport.x = 0;
21139 viewport.y = 0;
21140 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21141 vkEndCommandBuffer(command_buffer[0]);
21142 }
21143 {
21144 VkCommandBufferBeginInfo begin_info{};
21145 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21146 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21147
21148 VkViewport viewport{};
21149 viewport.maxDepth = 1.0f;
21150 viewport.minDepth = 0.0f;
21151 viewport.width = 512;
21152 viewport.height = 512;
21153 viewport.x = 0;
21154 viewport.y = 0;
21155 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21156 vkEndCommandBuffer(command_buffer[1]);
21157 }
21158 {
21159 VkSubmitInfo submit_info{};
21160 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21161 submit_info.commandBufferCount = 1;
21162 submit_info.pCommandBuffers = &command_buffer[0];
21163 submit_info.signalSemaphoreCount = 1;
21164 submit_info.pSignalSemaphores = &semaphore;
21165 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21166 }
21167 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021168 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021169 VkSubmitInfo submit_info{};
21170 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21171 submit_info.commandBufferCount = 1;
21172 submit_info.pCommandBuffers = &command_buffer[1];
21173 submit_info.waitSemaphoreCount = 1;
21174 submit_info.pWaitSemaphores = &semaphore;
21175 submit_info.pWaitDstStageMask = flags;
21176 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21177 }
21178
21179 vkQueueWaitIdle(m_device->m_queue);
21180
21181 vkDestroyFence(m_device->device(), fence, nullptr);
21182 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21183 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21184 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21185
21186 m_errorMonitor->VerifyNotFound();
21187}
21188
21189// This is a positive test. No errors should be generated.
21190TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021191 TEST_DESCRIPTION(
21192 "Two command buffers, each in a separate QueueSubmit call "
21193 "submitted on separate queues, the second having a fence"
21194 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021195
Tony Barbour1fa09702017-03-16 12:09:08 -060021196 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021197 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021198
21199 m_errorMonitor->ExpectSuccess();
21200
21201 VkFence fence;
21202 VkFenceCreateInfo fence_create_info{};
21203 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21204 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21205
21206 VkSemaphore semaphore;
21207 VkSemaphoreCreateInfo semaphore_create_info{};
21208 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21209 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21210
21211 VkCommandPool command_pool;
21212 VkCommandPoolCreateInfo pool_create_info{};
21213 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21214 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21215 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21216 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21217
21218 VkCommandBuffer command_buffer[2];
21219 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21220 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21221 command_buffer_allocate_info.commandPool = command_pool;
21222 command_buffer_allocate_info.commandBufferCount = 2;
21223 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21224 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21225
21226 VkQueue queue = VK_NULL_HANDLE;
21227 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21228
21229 {
21230 VkCommandBufferBeginInfo begin_info{};
21231 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21232 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21233
21234 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 -070021235 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021236
21237 VkViewport viewport{};
21238 viewport.maxDepth = 1.0f;
21239 viewport.minDepth = 0.0f;
21240 viewport.width = 512;
21241 viewport.height = 512;
21242 viewport.x = 0;
21243 viewport.y = 0;
21244 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21245 vkEndCommandBuffer(command_buffer[0]);
21246 }
21247 {
21248 VkCommandBufferBeginInfo begin_info{};
21249 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21250 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21251
21252 VkViewport viewport{};
21253 viewport.maxDepth = 1.0f;
21254 viewport.minDepth = 0.0f;
21255 viewport.width = 512;
21256 viewport.height = 512;
21257 viewport.x = 0;
21258 viewport.y = 0;
21259 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21260 vkEndCommandBuffer(command_buffer[1]);
21261 }
21262 {
21263 VkSubmitInfo submit_info{};
21264 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21265 submit_info.commandBufferCount = 1;
21266 submit_info.pCommandBuffers = &command_buffer[0];
21267 submit_info.signalSemaphoreCount = 1;
21268 submit_info.pSignalSemaphores = &semaphore;
21269 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21270 }
21271 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021272 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021273 VkSubmitInfo submit_info{};
21274 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21275 submit_info.commandBufferCount = 1;
21276 submit_info.pCommandBuffers = &command_buffer[1];
21277 submit_info.waitSemaphoreCount = 1;
21278 submit_info.pWaitSemaphores = &semaphore;
21279 submit_info.pWaitDstStageMask = flags;
21280 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21281 }
21282
21283 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21284 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21285
21286 vkDestroyFence(m_device->device(), fence, nullptr);
21287 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21288 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21289 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21290
21291 m_errorMonitor->VerifyNotFound();
21292}
21293
21294TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021295 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021296 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021297 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021298 return;
21299 }
21300
21301 VkResult err;
21302
21303 m_errorMonitor->ExpectSuccess();
21304
21305 VkQueue q0 = m_device->m_queue;
21306 VkQueue q1 = nullptr;
21307 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21308 ASSERT_NE(q1, nullptr);
21309
21310 // An (empty) command buffer. We must have work in the first submission --
21311 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021312 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021313 VkCommandPool pool;
21314 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21315 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021316 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21317 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021318 VkCommandBuffer cb;
21319 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21320 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021321 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021322 err = vkBeginCommandBuffer(cb, &cbbi);
21323 ASSERT_VK_SUCCESS(err);
21324 err = vkEndCommandBuffer(cb);
21325 ASSERT_VK_SUCCESS(err);
21326
21327 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021328 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021329 VkSemaphore s;
21330 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21331 ASSERT_VK_SUCCESS(err);
21332
21333 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021334 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021335
21336 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21337 ASSERT_VK_SUCCESS(err);
21338
21339 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021340 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021341 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021342
21343 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21344 ASSERT_VK_SUCCESS(err);
21345
21346 // Wait for q0 idle
21347 err = vkQueueWaitIdle(q0);
21348 ASSERT_VK_SUCCESS(err);
21349
21350 // Command buffer should have been completed (it was on q0); reset the pool.
21351 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21352
21353 m_errorMonitor->VerifyNotFound();
21354
21355 // Force device completely idle and clean up resources
21356 vkDeviceWaitIdle(m_device->device());
21357 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21358 vkDestroySemaphore(m_device->device(), s, nullptr);
21359}
21360
21361// This is a positive test. No errors should be generated.
21362TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021363 TEST_DESCRIPTION(
21364 "Two command buffers, each in a separate QueueSubmit call "
21365 "submitted on separate queues, the second having a fence, "
21366 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021367
Tony Barbour1fa09702017-03-16 12:09:08 -060021368 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021369 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021370
21371 m_errorMonitor->ExpectSuccess();
21372
Tony Barbour1fa09702017-03-16 12:09:08 -060021373 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021374 VkFence fence;
21375 VkFenceCreateInfo fence_create_info{};
21376 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21377 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21378
21379 VkSemaphore semaphore;
21380 VkSemaphoreCreateInfo semaphore_create_info{};
21381 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21382 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21383
21384 VkCommandPool command_pool;
21385 VkCommandPoolCreateInfo pool_create_info{};
21386 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21387 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21388 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21389 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21390
21391 VkCommandBuffer command_buffer[2];
21392 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21393 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21394 command_buffer_allocate_info.commandPool = command_pool;
21395 command_buffer_allocate_info.commandBufferCount = 2;
21396 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21397 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21398
21399 VkQueue queue = VK_NULL_HANDLE;
21400 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21401
21402 {
21403 VkCommandBufferBeginInfo begin_info{};
21404 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21405 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21406
21407 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 -070021408 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021409
21410 VkViewport viewport{};
21411 viewport.maxDepth = 1.0f;
21412 viewport.minDepth = 0.0f;
21413 viewport.width = 512;
21414 viewport.height = 512;
21415 viewport.x = 0;
21416 viewport.y = 0;
21417 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21418 vkEndCommandBuffer(command_buffer[0]);
21419 }
21420 {
21421 VkCommandBufferBeginInfo begin_info{};
21422 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21423 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21424
21425 VkViewport viewport{};
21426 viewport.maxDepth = 1.0f;
21427 viewport.minDepth = 0.0f;
21428 viewport.width = 512;
21429 viewport.height = 512;
21430 viewport.x = 0;
21431 viewport.y = 0;
21432 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21433 vkEndCommandBuffer(command_buffer[1]);
21434 }
21435 {
21436 VkSubmitInfo submit_info{};
21437 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21438 submit_info.commandBufferCount = 1;
21439 submit_info.pCommandBuffers = &command_buffer[0];
21440 submit_info.signalSemaphoreCount = 1;
21441 submit_info.pSignalSemaphores = &semaphore;
21442 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21443 }
21444 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021445 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021446 VkSubmitInfo submit_info{};
21447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21448 submit_info.commandBufferCount = 1;
21449 submit_info.pCommandBuffers = &command_buffer[1];
21450 submit_info.waitSemaphoreCount = 1;
21451 submit_info.pWaitSemaphores = &semaphore;
21452 submit_info.pWaitDstStageMask = flags;
21453 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21454 }
21455
21456 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21457
21458 vkDestroyFence(m_device->device(), fence, nullptr);
21459 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21460 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21461 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21462
21463 m_errorMonitor->VerifyNotFound();
21464}
21465
21466// This is a positive test. No errors should be generated.
21467TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021468 TEST_DESCRIPTION(
21469 "Two command buffers, each in a separate QueueSubmit call "
21470 "on the same queue, sharing a signal/wait semaphore, the "
21471 "second having a fence, "
21472 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021473
21474 m_errorMonitor->ExpectSuccess();
21475
Tony Barbour1fa09702017-03-16 12:09:08 -060021476 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021477 VkFence fence;
21478 VkFenceCreateInfo fence_create_info{};
21479 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21480 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21481
21482 VkSemaphore semaphore;
21483 VkSemaphoreCreateInfo semaphore_create_info{};
21484 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21485 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21486
21487 VkCommandPool command_pool;
21488 VkCommandPoolCreateInfo pool_create_info{};
21489 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21490 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21491 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21492 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21493
21494 VkCommandBuffer command_buffer[2];
21495 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21496 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21497 command_buffer_allocate_info.commandPool = command_pool;
21498 command_buffer_allocate_info.commandBufferCount = 2;
21499 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21500 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21501
21502 {
21503 VkCommandBufferBeginInfo begin_info{};
21504 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21505 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21506
21507 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 -070021508 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021509
21510 VkViewport viewport{};
21511 viewport.maxDepth = 1.0f;
21512 viewport.minDepth = 0.0f;
21513 viewport.width = 512;
21514 viewport.height = 512;
21515 viewport.x = 0;
21516 viewport.y = 0;
21517 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21518 vkEndCommandBuffer(command_buffer[0]);
21519 }
21520 {
21521 VkCommandBufferBeginInfo begin_info{};
21522 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21523 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21524
21525 VkViewport viewport{};
21526 viewport.maxDepth = 1.0f;
21527 viewport.minDepth = 0.0f;
21528 viewport.width = 512;
21529 viewport.height = 512;
21530 viewport.x = 0;
21531 viewport.y = 0;
21532 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21533 vkEndCommandBuffer(command_buffer[1]);
21534 }
21535 {
21536 VkSubmitInfo submit_info{};
21537 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21538 submit_info.commandBufferCount = 1;
21539 submit_info.pCommandBuffers = &command_buffer[0];
21540 submit_info.signalSemaphoreCount = 1;
21541 submit_info.pSignalSemaphores = &semaphore;
21542 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21543 }
21544 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021545 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021546 VkSubmitInfo submit_info{};
21547 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21548 submit_info.commandBufferCount = 1;
21549 submit_info.pCommandBuffers = &command_buffer[1];
21550 submit_info.waitSemaphoreCount = 1;
21551 submit_info.pWaitSemaphores = &semaphore;
21552 submit_info.pWaitDstStageMask = flags;
21553 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21554 }
21555
21556 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21557
21558 vkDestroyFence(m_device->device(), fence, nullptr);
21559 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21560 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21561 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21562
21563 m_errorMonitor->VerifyNotFound();
21564}
21565
21566// This is a positive test. No errors should be generated.
21567TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021568 TEST_DESCRIPTION(
21569 "Two command buffers, each in a separate QueueSubmit call "
21570 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21571 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021572
21573 m_errorMonitor->ExpectSuccess();
21574
Tony Barbour1fa09702017-03-16 12:09:08 -060021575 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021576 VkFence fence;
21577 VkFenceCreateInfo fence_create_info{};
21578 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21579 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21580
21581 VkCommandPool command_pool;
21582 VkCommandPoolCreateInfo pool_create_info{};
21583 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21584 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21585 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21586 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21587
21588 VkCommandBuffer command_buffer[2];
21589 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21590 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21591 command_buffer_allocate_info.commandPool = command_pool;
21592 command_buffer_allocate_info.commandBufferCount = 2;
21593 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21594 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21595
21596 {
21597 VkCommandBufferBeginInfo begin_info{};
21598 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21599 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21600
21601 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 -070021602 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021603
21604 VkViewport viewport{};
21605 viewport.maxDepth = 1.0f;
21606 viewport.minDepth = 0.0f;
21607 viewport.width = 512;
21608 viewport.height = 512;
21609 viewport.x = 0;
21610 viewport.y = 0;
21611 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21612 vkEndCommandBuffer(command_buffer[0]);
21613 }
21614 {
21615 VkCommandBufferBeginInfo begin_info{};
21616 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21617 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21618
21619 VkViewport viewport{};
21620 viewport.maxDepth = 1.0f;
21621 viewport.minDepth = 0.0f;
21622 viewport.width = 512;
21623 viewport.height = 512;
21624 viewport.x = 0;
21625 viewport.y = 0;
21626 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21627 vkEndCommandBuffer(command_buffer[1]);
21628 }
21629 {
21630 VkSubmitInfo submit_info{};
21631 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21632 submit_info.commandBufferCount = 1;
21633 submit_info.pCommandBuffers = &command_buffer[0];
21634 submit_info.signalSemaphoreCount = 0;
21635 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21636 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21637 }
21638 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021639 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021640 VkSubmitInfo submit_info{};
21641 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21642 submit_info.commandBufferCount = 1;
21643 submit_info.pCommandBuffers = &command_buffer[1];
21644 submit_info.waitSemaphoreCount = 0;
21645 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21646 submit_info.pWaitDstStageMask = flags;
21647 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21648 }
21649
21650 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21651
21652 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21653 ASSERT_VK_SUCCESS(err);
21654
21655 vkDestroyFence(m_device->device(), fence, nullptr);
21656 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21657 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21658
21659 m_errorMonitor->VerifyNotFound();
21660}
21661
21662// This is a positive test. No errors should be generated.
21663TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021664 TEST_DESCRIPTION(
21665 "Two command buffers, each in a separate QueueSubmit call "
21666 "on the same queue, the second having a fence, followed "
21667 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021668
21669 m_errorMonitor->ExpectSuccess();
21670
Tony Barbour1fa09702017-03-16 12:09:08 -060021671 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021672 VkFence fence;
21673 VkFenceCreateInfo fence_create_info{};
21674 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21675 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21676
21677 VkCommandPool command_pool;
21678 VkCommandPoolCreateInfo pool_create_info{};
21679 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21680 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21681 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21682 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21683
21684 VkCommandBuffer command_buffer[2];
21685 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21686 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21687 command_buffer_allocate_info.commandPool = command_pool;
21688 command_buffer_allocate_info.commandBufferCount = 2;
21689 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21690 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21691
21692 {
21693 VkCommandBufferBeginInfo begin_info{};
21694 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21695 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21696
21697 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 -070021698 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021699
21700 VkViewport viewport{};
21701 viewport.maxDepth = 1.0f;
21702 viewport.minDepth = 0.0f;
21703 viewport.width = 512;
21704 viewport.height = 512;
21705 viewport.x = 0;
21706 viewport.y = 0;
21707 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21708 vkEndCommandBuffer(command_buffer[0]);
21709 }
21710 {
21711 VkCommandBufferBeginInfo begin_info{};
21712 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21713 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21714
21715 VkViewport viewport{};
21716 viewport.maxDepth = 1.0f;
21717 viewport.minDepth = 0.0f;
21718 viewport.width = 512;
21719 viewport.height = 512;
21720 viewport.x = 0;
21721 viewport.y = 0;
21722 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21723 vkEndCommandBuffer(command_buffer[1]);
21724 }
21725 {
21726 VkSubmitInfo submit_info{};
21727 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21728 submit_info.commandBufferCount = 1;
21729 submit_info.pCommandBuffers = &command_buffer[0];
21730 submit_info.signalSemaphoreCount = 0;
21731 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21732 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21733 }
21734 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021735 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021736 VkSubmitInfo submit_info{};
21737 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21738 submit_info.commandBufferCount = 1;
21739 submit_info.pCommandBuffers = &command_buffer[1];
21740 submit_info.waitSemaphoreCount = 0;
21741 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21742 submit_info.pWaitDstStageMask = flags;
21743 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21744 }
21745
21746 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21747
21748 vkDestroyFence(m_device->device(), fence, nullptr);
21749 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21750 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21751
21752 m_errorMonitor->VerifyNotFound();
21753}
21754
21755// This is a positive test. No errors should be generated.
21756TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021757 TEST_DESCRIPTION(
21758 "Two command buffers each in a separate SubmitInfo sent in a single "
21759 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021760 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021761
21762 m_errorMonitor->ExpectSuccess();
21763
21764 VkFence fence;
21765 VkFenceCreateInfo fence_create_info{};
21766 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21767 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21768
21769 VkSemaphore semaphore;
21770 VkSemaphoreCreateInfo semaphore_create_info{};
21771 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21772 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21773
21774 VkCommandPool command_pool;
21775 VkCommandPoolCreateInfo pool_create_info{};
21776 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21777 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21778 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21779 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21780
21781 VkCommandBuffer command_buffer[2];
21782 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21783 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21784 command_buffer_allocate_info.commandPool = command_pool;
21785 command_buffer_allocate_info.commandBufferCount = 2;
21786 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21787 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21788
21789 {
21790 VkCommandBufferBeginInfo begin_info{};
21791 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21792 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21793
21794 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 -070021795 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021796
21797 VkViewport viewport{};
21798 viewport.maxDepth = 1.0f;
21799 viewport.minDepth = 0.0f;
21800 viewport.width = 512;
21801 viewport.height = 512;
21802 viewport.x = 0;
21803 viewport.y = 0;
21804 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21805 vkEndCommandBuffer(command_buffer[0]);
21806 }
21807 {
21808 VkCommandBufferBeginInfo begin_info{};
21809 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21810 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21811
21812 VkViewport viewport{};
21813 viewport.maxDepth = 1.0f;
21814 viewport.minDepth = 0.0f;
21815 viewport.width = 512;
21816 viewport.height = 512;
21817 viewport.x = 0;
21818 viewport.y = 0;
21819 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21820 vkEndCommandBuffer(command_buffer[1]);
21821 }
21822 {
21823 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021824 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021825
21826 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21827 submit_info[0].pNext = NULL;
21828 submit_info[0].commandBufferCount = 1;
21829 submit_info[0].pCommandBuffers = &command_buffer[0];
21830 submit_info[0].signalSemaphoreCount = 1;
21831 submit_info[0].pSignalSemaphores = &semaphore;
21832 submit_info[0].waitSemaphoreCount = 0;
21833 submit_info[0].pWaitSemaphores = NULL;
21834 submit_info[0].pWaitDstStageMask = 0;
21835
21836 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21837 submit_info[1].pNext = NULL;
21838 submit_info[1].commandBufferCount = 1;
21839 submit_info[1].pCommandBuffers = &command_buffer[1];
21840 submit_info[1].waitSemaphoreCount = 1;
21841 submit_info[1].pWaitSemaphores = &semaphore;
21842 submit_info[1].pWaitDstStageMask = flags;
21843 submit_info[1].signalSemaphoreCount = 0;
21844 submit_info[1].pSignalSemaphores = NULL;
21845 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21846 }
21847
21848 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21849
21850 vkDestroyFence(m_device->device(), fence, nullptr);
21851 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21852 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21853 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21854
21855 m_errorMonitor->VerifyNotFound();
21856}
21857
21858TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21859 m_errorMonitor->ExpectSuccess();
21860
Tony Barbour1fa09702017-03-16 12:09:08 -060021861 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021862 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21863
Tony Barbour552f6c02016-12-21 14:34:07 -070021864 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021865
21866 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21867 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21868 m_errorMonitor->VerifyNotFound();
21869 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21870 m_errorMonitor->VerifyNotFound();
21871 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21872 m_errorMonitor->VerifyNotFound();
21873
21874 m_commandBuffer->EndCommandBuffer();
21875 m_errorMonitor->VerifyNotFound();
21876}
21877
21878TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021879 TEST_DESCRIPTION(
21880 "Positive test where we create a renderpass with an "
21881 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21882 "has a valid layout, and a second subpass then uses a "
21883 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021884 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021885 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021886 auto depth_format = find_depth_stencil_format(m_device);
21887 if (!depth_format) {
21888 printf(" No Depth + Stencil format found. Skipped.\n");
21889 return;
21890 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021891
21892 VkAttachmentReference attach[2] = {};
21893 attach[0].attachment = 0;
21894 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21895 attach[1].attachment = 0;
21896 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21897 VkSubpassDescription subpasses[2] = {};
21898 // First subpass clears DS attach on load
21899 subpasses[0].pDepthStencilAttachment = &attach[0];
21900 // 2nd subpass reads in DS as input attachment
21901 subpasses[1].inputAttachmentCount = 1;
21902 subpasses[1].pInputAttachments = &attach[1];
21903 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021904 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021905 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21906 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21907 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21908 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21909 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21910 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21911 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21912 VkRenderPassCreateInfo rpci = {};
21913 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21914 rpci.attachmentCount = 1;
21915 rpci.pAttachments = &attach_desc;
21916 rpci.subpassCount = 2;
21917 rpci.pSubpasses = subpasses;
21918
21919 // Now create RenderPass and verify no errors
21920 VkRenderPass rp;
21921 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21922 m_errorMonitor->VerifyNotFound();
21923
21924 vkDestroyRenderPass(m_device->device(), rp, NULL);
21925}
21926
Tobin Ehlis01103de2017-02-16 13:22:47 -070021927TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21928 TEST_DESCRIPTION(
21929 "Create a render pass with depth-stencil attachment where layout transition "
21930 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21931 "transition has correctly occurred at queue submit time with no validation errors.");
21932
Tony Barbour1fa09702017-03-16 12:09:08 -060021933 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021934 auto depth_format = find_depth_stencil_format(m_device);
21935 if (!depth_format) {
21936 printf(" No Depth + Stencil format found. Skipped.\n");
21937 return;
21938 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021939 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021940 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021941 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21942 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021943 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021944 return;
21945 }
21946
21947 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021948 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21949
21950 // A renderpass with one depth/stencil attachment.
21951 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021952 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021953 VK_SAMPLE_COUNT_1_BIT,
21954 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21955 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21956 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21957 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21958 VK_IMAGE_LAYOUT_UNDEFINED,
21959 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21960
21961 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21962
21963 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21964
21965 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21966
21967 VkRenderPass rp;
21968 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21969 ASSERT_VK_SUCCESS(err);
21970 // A compatible ds image.
21971 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021972 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 -070021973 ASSERT_TRUE(image.initialized());
21974
21975 VkImageViewCreateInfo ivci = {
21976 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21977 nullptr,
21978 0,
21979 image.handle(),
21980 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021981 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021982 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21983 VK_COMPONENT_SWIZZLE_IDENTITY},
21984 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21985 };
21986 VkImageView view;
21987 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21988 ASSERT_VK_SUCCESS(err);
21989
21990 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
21991 VkFramebuffer fb;
21992 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21993 ASSERT_VK_SUCCESS(err);
21994
21995 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
21996 m_commandBuffer->BeginCommandBuffer();
21997 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21998 vkCmdEndRenderPass(m_commandBuffer->handle());
21999 m_commandBuffer->EndCommandBuffer();
22000 QueueCommandBuffer(false);
22001 m_errorMonitor->VerifyNotFound();
22002
22003 // Cleanup
22004 vkDestroyImageView(m_device->device(), view, NULL);
22005 vkDestroyRenderPass(m_device->device(), rp, NULL);
22006 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22007}
22008
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022009TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022010 TEST_DESCRIPTION(
22011 "Test that pipeline validation accepts matrices passed "
22012 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022013 m_errorMonitor->ExpectSuccess();
22014
Tony Barbour1fa09702017-03-16 12:09:08 -060022015 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22017
22018 VkVertexInputBindingDescription input_binding;
22019 memset(&input_binding, 0, sizeof(input_binding));
22020
22021 VkVertexInputAttributeDescription input_attribs[2];
22022 memset(input_attribs, 0, sizeof(input_attribs));
22023
22024 for (int i = 0; i < 2; i++) {
22025 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22026 input_attribs[i].location = i;
22027 }
22028
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022029 char const *vsSource =
22030 "#version 450\n"
22031 "\n"
22032 "layout(location=0) in mat2x4 x;\n"
22033 "out gl_PerVertex {\n"
22034 " vec4 gl_Position;\n"
22035 "};\n"
22036 "void main(){\n"
22037 " gl_Position = x[0] + x[1];\n"
22038 "}\n";
22039 char const *fsSource =
22040 "#version 450\n"
22041 "\n"
22042 "layout(location=0) out vec4 color;\n"
22043 "void main(){\n"
22044 " color = vec4(1);\n"
22045 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022046
22047 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22048 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22049
22050 VkPipelineObj pipe(m_device);
22051 pipe.AddColorAttachment();
22052 pipe.AddShader(&vs);
22053 pipe.AddShader(&fs);
22054
22055 pipe.AddVertexInputBindings(&input_binding, 1);
22056 pipe.AddVertexInputAttribs(input_attribs, 2);
22057
22058 VkDescriptorSetObj descriptorSet(m_device);
22059 descriptorSet.AppendDummy();
22060 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22061
22062 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22063
22064 /* expect success */
22065 m_errorMonitor->VerifyNotFound();
22066}
22067
22068TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22069 m_errorMonitor->ExpectSuccess();
22070
Tony Barbour1fa09702017-03-16 12:09:08 -060022071 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22073
22074 VkVertexInputBindingDescription input_binding;
22075 memset(&input_binding, 0, sizeof(input_binding));
22076
22077 VkVertexInputAttributeDescription input_attribs[2];
22078 memset(input_attribs, 0, sizeof(input_attribs));
22079
22080 for (int i = 0; i < 2; i++) {
22081 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22082 input_attribs[i].location = i;
22083 }
22084
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022085 char const *vsSource =
22086 "#version 450\n"
22087 "\n"
22088 "layout(location=0) in vec4 x[2];\n"
22089 "out gl_PerVertex {\n"
22090 " vec4 gl_Position;\n"
22091 "};\n"
22092 "void main(){\n"
22093 " gl_Position = x[0] + x[1];\n"
22094 "}\n";
22095 char const *fsSource =
22096 "#version 450\n"
22097 "\n"
22098 "layout(location=0) out vec4 color;\n"
22099 "void main(){\n"
22100 " color = vec4(1);\n"
22101 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022102
22103 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22104 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22105
22106 VkPipelineObj pipe(m_device);
22107 pipe.AddColorAttachment();
22108 pipe.AddShader(&vs);
22109 pipe.AddShader(&fs);
22110
22111 pipe.AddVertexInputBindings(&input_binding, 1);
22112 pipe.AddVertexInputAttribs(input_attribs, 2);
22113
22114 VkDescriptorSetObj descriptorSet(m_device);
22115 descriptorSet.AppendDummy();
22116 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22117
22118 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22119
22120 m_errorMonitor->VerifyNotFound();
22121}
22122
22123TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022124 TEST_DESCRIPTION(
22125 "Test that pipeline validation accepts consuming a vertex attribute "
22126 "through multiple vertex shader inputs, each consuming a different "
22127 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022128 m_errorMonitor->ExpectSuccess();
22129
Tony Barbour1fa09702017-03-16 12:09:08 -060022130 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022131 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22132
22133 VkVertexInputBindingDescription input_binding;
22134 memset(&input_binding, 0, sizeof(input_binding));
22135
22136 VkVertexInputAttributeDescription input_attribs[3];
22137 memset(input_attribs, 0, sizeof(input_attribs));
22138
22139 for (int i = 0; i < 3; i++) {
22140 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22141 input_attribs[i].location = i;
22142 }
22143
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022144 char const *vsSource =
22145 "#version 450\n"
22146 "\n"
22147 "layout(location=0) in vec4 x;\n"
22148 "layout(location=1) in vec3 y1;\n"
22149 "layout(location=1, component=3) in float y2;\n"
22150 "layout(location=2) in vec4 z;\n"
22151 "out gl_PerVertex {\n"
22152 " vec4 gl_Position;\n"
22153 "};\n"
22154 "void main(){\n"
22155 " gl_Position = x + vec4(y1, y2) + z;\n"
22156 "}\n";
22157 char const *fsSource =
22158 "#version 450\n"
22159 "\n"
22160 "layout(location=0) out vec4 color;\n"
22161 "void main(){\n"
22162 " color = vec4(1);\n"
22163 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022164
22165 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22166 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22167
22168 VkPipelineObj pipe(m_device);
22169 pipe.AddColorAttachment();
22170 pipe.AddShader(&vs);
22171 pipe.AddShader(&fs);
22172
22173 pipe.AddVertexInputBindings(&input_binding, 1);
22174 pipe.AddVertexInputAttribs(input_attribs, 3);
22175
22176 VkDescriptorSetObj descriptorSet(m_device);
22177 descriptorSet.AppendDummy();
22178 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22179
22180 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22181
22182 m_errorMonitor->VerifyNotFound();
22183}
22184
22185TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22186 m_errorMonitor->ExpectSuccess();
22187
Tony Barbour1fa09702017-03-16 12:09:08 -060022188 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022189 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22190
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022191 char const *vsSource =
22192 "#version 450\n"
22193 "out gl_PerVertex {\n"
22194 " vec4 gl_Position;\n"
22195 "};\n"
22196 "void main(){\n"
22197 " gl_Position = vec4(0);\n"
22198 "}\n";
22199 char const *fsSource =
22200 "#version 450\n"
22201 "\n"
22202 "layout(location=0) out vec4 color;\n"
22203 "void main(){\n"
22204 " color = vec4(1);\n"
22205 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022206
22207 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22208 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22209
22210 VkPipelineObj pipe(m_device);
22211 pipe.AddColorAttachment();
22212 pipe.AddShader(&vs);
22213 pipe.AddShader(&fs);
22214
22215 VkDescriptorSetObj descriptorSet(m_device);
22216 descriptorSet.AppendDummy();
22217 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22218
22219 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22220
22221 m_errorMonitor->VerifyNotFound();
22222}
22223
22224TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022225 TEST_DESCRIPTION(
22226 "Test that pipeline validation accepts the relaxed type matching rules "
22227 "set out in 14.1.3: fundamental type must match, and producer side must "
22228 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022229 m_errorMonitor->ExpectSuccess();
22230
22231 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22232
Tony Barbour1fa09702017-03-16 12:09:08 -060022233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22235
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022236 char const *vsSource =
22237 "#version 450\n"
22238 "out gl_PerVertex {\n"
22239 " vec4 gl_Position;\n"
22240 "};\n"
22241 "layout(location=0) out vec3 x;\n"
22242 "layout(location=1) out ivec3 y;\n"
22243 "layout(location=2) out vec3 z;\n"
22244 "void main(){\n"
22245 " gl_Position = vec4(0);\n"
22246 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22247 "}\n";
22248 char const *fsSource =
22249 "#version 450\n"
22250 "\n"
22251 "layout(location=0) out vec4 color;\n"
22252 "layout(location=0) in float x;\n"
22253 "layout(location=1) flat in int y;\n"
22254 "layout(location=2) in vec2 z;\n"
22255 "void main(){\n"
22256 " color = vec4(1 + x + y + z.x);\n"
22257 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022258
22259 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22260 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22261
22262 VkPipelineObj pipe(m_device);
22263 pipe.AddColorAttachment();
22264 pipe.AddShader(&vs);
22265 pipe.AddShader(&fs);
22266
22267 VkDescriptorSetObj descriptorSet(m_device);
22268 descriptorSet.AppendDummy();
22269 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22270
22271 VkResult err = VK_SUCCESS;
22272 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22273 ASSERT_VK_SUCCESS(err);
22274
22275 m_errorMonitor->VerifyNotFound();
22276}
22277
22278TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022279 TEST_DESCRIPTION(
22280 "Test that pipeline validation accepts per-vertex variables "
22281 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022282 m_errorMonitor->ExpectSuccess();
22283
Tony Barbour1fa09702017-03-16 12:09:08 -060022284 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22286
22287 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022288 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022289 return;
22290 }
22291
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022292 char const *vsSource =
22293 "#version 450\n"
22294 "void main(){}\n";
22295 char const *tcsSource =
22296 "#version 450\n"
22297 "layout(location=0) out int x[];\n"
22298 "layout(vertices=3) out;\n"
22299 "void main(){\n"
22300 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22301 " gl_TessLevelInner[0] = 1;\n"
22302 " x[gl_InvocationID] = gl_InvocationID;\n"
22303 "}\n";
22304 char const *tesSource =
22305 "#version 450\n"
22306 "layout(triangles, equal_spacing, cw) in;\n"
22307 "layout(location=0) in int x[];\n"
22308 "out gl_PerVertex { vec4 gl_Position; };\n"
22309 "void main(){\n"
22310 " gl_Position.xyz = gl_TessCoord;\n"
22311 " gl_Position.w = x[0] + x[1] + x[2];\n"
22312 "}\n";
22313 char const *fsSource =
22314 "#version 450\n"
22315 "layout(location=0) out vec4 color;\n"
22316 "void main(){\n"
22317 " color = vec4(1);\n"
22318 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022319
22320 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22321 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22322 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22324
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022325 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22326 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022327
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022328 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022329
22330 VkPipelineObj pipe(m_device);
22331 pipe.SetInputAssembly(&iasci);
22332 pipe.SetTessellation(&tsci);
22333 pipe.AddColorAttachment();
22334 pipe.AddShader(&vs);
22335 pipe.AddShader(&tcs);
22336 pipe.AddShader(&tes);
22337 pipe.AddShader(&fs);
22338
22339 VkDescriptorSetObj descriptorSet(m_device);
22340 descriptorSet.AppendDummy();
22341 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22342
22343 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22344
22345 m_errorMonitor->VerifyNotFound();
22346}
22347
22348TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022349 TEST_DESCRIPTION(
22350 "Test that pipeline validation accepts a user-defined "
22351 "interface block passed into the geometry shader. This "
22352 "is interesting because the 'extra' array level is not "
22353 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022354 m_errorMonitor->ExpectSuccess();
22355
Tony Barbour1fa09702017-03-16 12:09:08 -060022356 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022357 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22358
22359 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022360 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022361 return;
22362 }
22363
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022364 char const *vsSource =
22365 "#version 450\n"
22366 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22367 "void main(){\n"
22368 " vs_out.x = vec4(1);\n"
22369 "}\n";
22370 char const *gsSource =
22371 "#version 450\n"
22372 "layout(triangles) in;\n"
22373 "layout(triangle_strip, max_vertices=3) out;\n"
22374 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22375 "out gl_PerVertex { vec4 gl_Position; };\n"
22376 "void main() {\n"
22377 " gl_Position = gs_in[0].x;\n"
22378 " EmitVertex();\n"
22379 "}\n";
22380 char const *fsSource =
22381 "#version 450\n"
22382 "layout(location=0) out vec4 color;\n"
22383 "void main(){\n"
22384 " color = vec4(1);\n"
22385 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022386
22387 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22388 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22389 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22390
22391 VkPipelineObj pipe(m_device);
22392 pipe.AddColorAttachment();
22393 pipe.AddShader(&vs);
22394 pipe.AddShader(&gs);
22395 pipe.AddShader(&fs);
22396
22397 VkDescriptorSetObj descriptorSet(m_device);
22398 descriptorSet.AppendDummy();
22399 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22400
22401 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22402
22403 m_errorMonitor->VerifyNotFound();
22404}
22405
22406TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022407 TEST_DESCRIPTION(
22408 "Test that pipeline validation accepts basic use of 64bit vertex "
22409 "attributes. This is interesting because they consume multiple "
22410 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022411 m_errorMonitor->ExpectSuccess();
22412
Tony Barbour1fa09702017-03-16 12:09:08 -060022413 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22415
22416 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022417 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022418 return;
22419 }
22420
22421 VkVertexInputBindingDescription input_bindings[1];
22422 memset(input_bindings, 0, sizeof(input_bindings));
22423
22424 VkVertexInputAttributeDescription input_attribs[4];
22425 memset(input_attribs, 0, sizeof(input_attribs));
22426 input_attribs[0].location = 0;
22427 input_attribs[0].offset = 0;
22428 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22429 input_attribs[1].location = 2;
22430 input_attribs[1].offset = 32;
22431 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22432 input_attribs[2].location = 4;
22433 input_attribs[2].offset = 64;
22434 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22435 input_attribs[3].location = 6;
22436 input_attribs[3].offset = 96;
22437 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22438
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022439 char const *vsSource =
22440 "#version 450\n"
22441 "\n"
22442 "layout(location=0) in dmat4 x;\n"
22443 "out gl_PerVertex {\n"
22444 " vec4 gl_Position;\n"
22445 "};\n"
22446 "void main(){\n"
22447 " gl_Position = vec4(x[0][0]);\n"
22448 "}\n";
22449 char const *fsSource =
22450 "#version 450\n"
22451 "\n"
22452 "layout(location=0) out vec4 color;\n"
22453 "void main(){\n"
22454 " color = vec4(1);\n"
22455 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022456
22457 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22458 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22459
22460 VkPipelineObj pipe(m_device);
22461 pipe.AddColorAttachment();
22462 pipe.AddShader(&vs);
22463 pipe.AddShader(&fs);
22464
22465 pipe.AddVertexInputBindings(input_bindings, 1);
22466 pipe.AddVertexInputAttribs(input_attribs, 4);
22467
22468 VkDescriptorSetObj descriptorSet(m_device);
22469 descriptorSet.AppendDummy();
22470 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22471
22472 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22473
22474 m_errorMonitor->VerifyNotFound();
22475}
22476
22477TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22478 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22479 m_errorMonitor->ExpectSuccess();
22480
Tony Barbour1fa09702017-03-16 12:09:08 -060022481 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022482
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022483 char const *vsSource =
22484 "#version 450\n"
22485 "\n"
22486 "out gl_PerVertex {\n"
22487 " vec4 gl_Position;\n"
22488 "};\n"
22489 "void main(){\n"
22490 " gl_Position = vec4(1);\n"
22491 "}\n";
22492 char const *fsSource =
22493 "#version 450\n"
22494 "\n"
22495 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22496 "layout(location=0) out vec4 color;\n"
22497 "void main() {\n"
22498 " color = subpassLoad(x);\n"
22499 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022500
22501 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22502 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22503
22504 VkPipelineObj pipe(m_device);
22505 pipe.AddShader(&vs);
22506 pipe.AddShader(&fs);
22507 pipe.AddColorAttachment();
22508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22509
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022510 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22511 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022512 VkDescriptorSetLayout dsl;
22513 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22514 ASSERT_VK_SUCCESS(err);
22515
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022516 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022517 VkPipelineLayout pl;
22518 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22519 ASSERT_VK_SUCCESS(err);
22520
22521 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022522 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22523 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22524 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22525 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22526 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 -060022527 };
22528 VkAttachmentReference color = {
22529 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22530 };
22531 VkAttachmentReference input = {
22532 1, VK_IMAGE_LAYOUT_GENERAL,
22533 };
22534
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022535 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022536
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022537 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022538 VkRenderPass rp;
22539 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22540 ASSERT_VK_SUCCESS(err);
22541
22542 // should be OK. would go wrong here if it's going to...
22543 pipe.CreateVKPipeline(pl, rp);
22544
22545 m_errorMonitor->VerifyNotFound();
22546
22547 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22548 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22549 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22550}
22551
22552TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022553 TEST_DESCRIPTION(
22554 "Test that pipeline validation accepts a compute pipeline which declares a "
22555 "descriptor-backed resource which is not provided, but the shader does not "
22556 "statically use it. This is interesting because it requires compute pipelines "
22557 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022558 m_errorMonitor->ExpectSuccess();
22559
Tony Barbour1fa09702017-03-16 12:09:08 -060022560 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022561
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022562 char const *csSource =
22563 "#version 450\n"
22564 "\n"
22565 "layout(local_size_x=1) in;\n"
22566 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22567 "void main(){\n"
22568 " // x is not used.\n"
22569 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022570
22571 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22572
22573 VkDescriptorSetObj descriptorSet(m_device);
22574 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22575
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022576 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22577 nullptr,
22578 0,
22579 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22580 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22581 descriptorSet.GetPipelineLayout(),
22582 VK_NULL_HANDLE,
22583 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022584
22585 VkPipeline pipe;
22586 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22587
22588 m_errorMonitor->VerifyNotFound();
22589
22590 if (err == VK_SUCCESS) {
22591 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22592 }
22593}
22594
22595TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022596 TEST_DESCRIPTION(
22597 "Test that pipeline validation accepts a shader consuming only the "
22598 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022599 m_errorMonitor->ExpectSuccess();
22600
Tony Barbour1fa09702017-03-16 12:09:08 -060022601 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022602
22603 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022604 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22605 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22606 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022607 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022608 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022609 VkDescriptorSetLayout dsl;
22610 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22611 ASSERT_VK_SUCCESS(err);
22612
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022613 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022614 VkPipelineLayout pl;
22615 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22616 ASSERT_VK_SUCCESS(err);
22617
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022618 char const *csSource =
22619 "#version 450\n"
22620 "\n"
22621 "layout(local_size_x=1) in;\n"
22622 "layout(set=0, binding=0) uniform sampler s;\n"
22623 "layout(set=0, binding=1) uniform texture2D t;\n"
22624 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22625 "void main() {\n"
22626 " x = texture(sampler2D(t, s), vec2(0));\n"
22627 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022628 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22629
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022630 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22631 nullptr,
22632 0,
22633 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22634 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22635 pl,
22636 VK_NULL_HANDLE,
22637 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022638
22639 VkPipeline pipe;
22640 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22641
22642 m_errorMonitor->VerifyNotFound();
22643
22644 if (err == VK_SUCCESS) {
22645 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22646 }
22647
22648 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22649 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22650}
22651
22652TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022653 TEST_DESCRIPTION(
22654 "Test that pipeline validation accepts a shader consuming only the "
22655 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022656 m_errorMonitor->ExpectSuccess();
22657
Tony Barbour1fa09702017-03-16 12:09:08 -060022658 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022659
22660 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022661 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22662 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22663 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022664 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022665 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022666 VkDescriptorSetLayout dsl;
22667 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22668 ASSERT_VK_SUCCESS(err);
22669
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022670 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022671 VkPipelineLayout pl;
22672 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22673 ASSERT_VK_SUCCESS(err);
22674
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022675 char const *csSource =
22676 "#version 450\n"
22677 "\n"
22678 "layout(local_size_x=1) in;\n"
22679 "layout(set=0, binding=0) uniform texture2D t;\n"
22680 "layout(set=0, binding=1) uniform sampler s;\n"
22681 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22682 "void main() {\n"
22683 " x = texture(sampler2D(t, s), vec2(0));\n"
22684 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022685 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22686
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022687 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22688 nullptr,
22689 0,
22690 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22691 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22692 pl,
22693 VK_NULL_HANDLE,
22694 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022695
22696 VkPipeline pipe;
22697 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22698
22699 m_errorMonitor->VerifyNotFound();
22700
22701 if (err == VK_SUCCESS) {
22702 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22703 }
22704
22705 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22706 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22707}
22708
22709TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022710 TEST_DESCRIPTION(
22711 "Test that pipeline validation accepts a shader consuming "
22712 "both the sampler and the image of a combined image+sampler "
22713 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022714 m_errorMonitor->ExpectSuccess();
22715
Tony Barbour1fa09702017-03-16 12:09:08 -060022716 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022717
22718 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022719 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22720 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022721 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022722 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022723 VkDescriptorSetLayout dsl;
22724 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22725 ASSERT_VK_SUCCESS(err);
22726
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022727 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022728 VkPipelineLayout pl;
22729 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22730 ASSERT_VK_SUCCESS(err);
22731
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022732 char const *csSource =
22733 "#version 450\n"
22734 "\n"
22735 "layout(local_size_x=1) in;\n"
22736 "layout(set=0, binding=0) uniform texture2D t;\n"
22737 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22738 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22739 "void main() {\n"
22740 " x = texture(sampler2D(t, s), vec2(0));\n"
22741 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022742 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22743
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022744 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22745 nullptr,
22746 0,
22747 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22748 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22749 pl,
22750 VK_NULL_HANDLE,
22751 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022752
22753 VkPipeline pipe;
22754 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22755
22756 m_errorMonitor->VerifyNotFound();
22757
22758 if (err == VK_SUCCESS) {
22759 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22760 }
22761
22762 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22763 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22764}
22765
Tony Barbour3ed87a02017-03-15 16:19:02 -060022766TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022767 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22768
Tony Barbour3ed87a02017-03-15 16:19:02 -060022769 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022770 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022771
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022772 // Ensure that extension is available and enabled.
22773 uint32_t extension_count = 0;
22774 bool supports_maintenance1_extension = false;
22775 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22776 ASSERT_VK_SUCCESS(err);
22777 if (extension_count > 0) {
22778 std::vector<VkExtensionProperties> available_extensions(extension_count);
22779
22780 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22781 ASSERT_VK_SUCCESS(err);
22782 for (const auto &extension_props : available_extensions) {
22783 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22784 supports_maintenance1_extension = true;
22785 }
22786 }
22787 }
22788
22789 // Proceed if extension is supported by hardware
22790 if (!supports_maintenance1_extension) {
22791 printf(" Maintenance1 Extension not supported, skipping tests\n");
22792 return;
22793 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022794
22795 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022796 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022797 VkCommandBuffer cmd_buf;
22798 VkCommandBufferAllocateInfo alloc_info;
22799 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22800 alloc_info.pNext = NULL;
22801 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022802 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022803 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22804 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22805
22806 VkCommandBufferBeginInfo cb_binfo;
22807 cb_binfo.pNext = NULL;
22808 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22809 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22810 cb_binfo.flags = 0;
22811 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22812 // Set Negative height, should give error if Maintenance 1 is not enabled
22813 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22814 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22815 vkEndCommandBuffer(cmd_buf);
22816
22817 m_errorMonitor->VerifyNotFound();
22818}
22819
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022820TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22821 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22822
Tony Barbour1fa09702017-03-16 12:09:08 -060022823 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022824
22825 // Positive test to check parameter_validation and unique_objects support
22826 // for NV_dedicated_allocation
22827 uint32_t extension_count = 0;
22828 bool supports_nv_dedicated_allocation = false;
22829 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22830 ASSERT_VK_SUCCESS(err);
22831
22832 if (extension_count > 0) {
22833 std::vector<VkExtensionProperties> available_extensions(extension_count);
22834
22835 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22836 ASSERT_VK_SUCCESS(err);
22837
22838 for (const auto &extension_props : available_extensions) {
22839 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22840 supports_nv_dedicated_allocation = true;
22841 }
22842 }
22843 }
22844
22845 if (supports_nv_dedicated_allocation) {
22846 m_errorMonitor->ExpectSuccess();
22847
22848 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22849 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22850 dedicated_buffer_create_info.pNext = nullptr;
22851 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22852
22853 uint32_t queue_family_index = 0;
22854 VkBufferCreateInfo buffer_create_info = {};
22855 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22856 buffer_create_info.pNext = &dedicated_buffer_create_info;
22857 buffer_create_info.size = 1024;
22858 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22859 buffer_create_info.queueFamilyIndexCount = 1;
22860 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22861
22862 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022863 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022864 ASSERT_VK_SUCCESS(err);
22865
22866 VkMemoryRequirements memory_reqs;
22867 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22868
22869 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22870 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22871 dedicated_memory_info.pNext = nullptr;
22872 dedicated_memory_info.buffer = buffer;
22873 dedicated_memory_info.image = VK_NULL_HANDLE;
22874
22875 VkMemoryAllocateInfo memory_info = {};
22876 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22877 memory_info.pNext = &dedicated_memory_info;
22878 memory_info.allocationSize = memory_reqs.size;
22879
22880 bool pass;
22881 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22882 ASSERT_TRUE(pass);
22883
22884 VkDeviceMemory buffer_memory;
22885 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22886 ASSERT_VK_SUCCESS(err);
22887
22888 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22889 ASSERT_VK_SUCCESS(err);
22890
22891 vkDestroyBuffer(m_device->device(), buffer, NULL);
22892 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22893
22894 m_errorMonitor->VerifyNotFound();
22895 }
22896}
22897
22898TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22899 VkResult err;
22900
22901 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22902
Tony Barbour1fa09702017-03-16 12:09:08 -060022903 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022904 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22905
22906 std::vector<const char *> device_extension_names;
22907 auto features = m_device->phy().features();
22908 // Artificially disable support for non-solid fill modes
22909 features.fillModeNonSolid = false;
22910 // The sacrificial device object
22911 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22912
22913 VkRenderpassObj render_pass(&test_device);
22914
22915 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22916 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22917 pipeline_layout_ci.setLayoutCount = 0;
22918 pipeline_layout_ci.pSetLayouts = NULL;
22919
22920 VkPipelineLayout pipeline_layout;
22921 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22922 ASSERT_VK_SUCCESS(err);
22923
22924 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22925 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22926 rs_ci.pNext = nullptr;
22927 rs_ci.lineWidth = 1.0f;
22928 rs_ci.rasterizerDiscardEnable = true;
22929
22930 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22931 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22932
22933 // Set polygonMode=FILL. No error is expected
22934 m_errorMonitor->ExpectSuccess();
22935 {
22936 VkPipelineObj pipe(&test_device);
22937 pipe.AddShader(&vs);
22938 pipe.AddShader(&fs);
22939 pipe.AddColorAttachment();
22940 // Set polygonMode to a good value
22941 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22942 pipe.SetRasterization(&rs_ci);
22943 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22944 }
22945 m_errorMonitor->VerifyNotFound();
22946
22947 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
22948}
22949
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022950#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022951TEST_F(VkPositiveLayerTest, LongFenceChain)
22952{
22953 m_errorMonitor->ExpectSuccess();
22954
Tony Barbour1fa09702017-03-16 12:09:08 -060022955 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022956 VkResult err;
22957
22958 std::vector<VkFence> fences;
22959
22960 const int chainLength = 32768;
22961
22962 for (int i = 0; i < chainLength; i++) {
22963 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
22964 VkFence fence;
22965 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
22966 ASSERT_VK_SUCCESS(err);
22967
22968 fences.push_back(fence);
22969
22970 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
22971 0, nullptr, 0, nullptr };
22972 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
22973 ASSERT_VK_SUCCESS(err);
22974
22975 }
22976
22977 // BOOM, stack overflow.
22978 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
22979
22980 for (auto fence : fences)
22981 vkDestroyFence(m_device->device(), fence, nullptr);
22982
22983 m_errorMonitor->VerifyNotFound();
22984}
22985#endif
22986
Cody Northrop1242dfd2016-07-13 17:24:59 -060022987#if defined(ANDROID) && defined(VALIDATION_APK)
22988static bool initialized = false;
22989static bool active = false;
22990
22991// Convert Intents to argv
22992// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022993std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022994 std::vector<std::string> args;
22995 JavaVM &vm = *app.activity->vm;
22996 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022997 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060022998
22999 JNIEnv &env = *p_env;
23000 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023001 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023002 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023003 jmethodID get_string_extra_method =
23004 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023005 jvalue get_string_extra_args;
23006 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023007 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023008
23009 std::string args_str;
23010 if (extra_str) {
23011 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23012 args_str = extra_utf;
23013 env.ReleaseStringUTFChars(extra_str, extra_utf);
23014 env.DeleteLocalRef(extra_str);
23015 }
23016
23017 env.DeleteLocalRef(get_string_extra_args.l);
23018 env.DeleteLocalRef(intent);
23019 vm.DetachCurrentThread();
23020
23021 // split args_str
23022 std::stringstream ss(args_str);
23023 std::string arg;
23024 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023025 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023026 }
23027
23028 return args;
23029}
23030
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023031static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023032
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023033static void processCommand(struct android_app *app, int32_t cmd) {
23034 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023035 case APP_CMD_INIT_WINDOW: {
23036 if (app->window) {
23037 initialized = true;
23038 }
23039 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023040 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023041 case APP_CMD_GAINED_FOCUS: {
23042 active = true;
23043 break;
23044 }
23045 case APP_CMD_LOST_FOCUS: {
23046 active = false;
23047 break;
23048 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023049 }
23050}
23051
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023052void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023053 app_dummy();
23054
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023055 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023056
23057 int vulkanSupport = InitVulkan();
23058 if (vulkanSupport == 0) {
23059 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23060 return;
23061 }
23062
23063 app->onAppCmd = processCommand;
23064 app->onInputEvent = processInput;
23065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023066 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023067 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023068 struct android_poll_source *source;
23069 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023070 if (source) {
23071 source->process(app, source);
23072 }
23073
23074 if (app->destroyRequested != 0) {
23075 VkTestFramework::Finish();
23076 return;
23077 }
23078 }
23079
23080 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023081 // Use the following key to send arguments to gtest, i.e.
23082 // --es args "--gtest_filter=-VkLayerTest.foo"
23083 const char key[] = "args";
23084 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023085
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023086 std::string filter = "";
23087 if (args.size() > 0) {
23088 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23089 filter += args[0];
23090 } else {
23091 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23092 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023094 int argc = 2;
23095 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23096 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023097
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023098 // Route output to files until we can override the gtest output
23099 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23100 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023101
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023102 ::testing::InitGoogleTest(&argc, argv);
23103 VkTestFramework::InitArgs(&argc, argv);
23104 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023105
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023106 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023108 if (result != 0) {
23109 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23110 } else {
23111 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23112 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023113
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023114 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023116 fclose(stdout);
23117 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023119 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023120 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023121 }
23122 }
23123}
23124#endif
23125
Tony Barbour300a6082015-04-07 13:44:53 -060023126int main(int argc, char **argv) {
23127 int result;
23128
Cody Northrop8e54a402016-03-08 22:25:52 -070023129#ifdef ANDROID
23130 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023131 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023132#endif
23133
Tony Barbour300a6082015-04-07 13:44:53 -060023134 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023135 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023136
23137 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23138
23139 result = RUN_ALL_TESTS();
23140
Tony Barbour6918cd52015-04-09 12:58:51 -060023141 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023142 return result;
23143}